按照《嵌入式Linux应用开发 完全手册》,了解寄存器的操作,编译流程,硬件执行流程。
1、按照书上编辑修改LED源代码:其中寄存器地址与IO偏移按照芯片手册和电路实际IO进行修改。我的电路使用PA0、PA1作为按键输入,PA2、PA3作为LED输出。
// File led_on_c.c
#define PA_CFG0 (*(volatile unsigned long *)(0x01C20800+(0*0x24+0x00)))
#define PA_DAT (*(volatile unsigned long *)(0x01C20800+(0*0x24+0x10)))
#define BIT0 0
#define BIT1 1
#define BIT2 2
#define BIT3 3
static void delay(void);
int main(void)
{
PA_CFG0 &= ~(0x7 << (4 * BIT0));//PA0 in
PA_CFG0 &= ~(0x7 << (4 * BIT1));//PA1 in
PA_CFG0 &= ~(0x7 << (4 * BIT2));//PA2 clear
PA_CFG0 &= ~(0x7 << (4 * BIT3));//PA3 clear
PA_CFG0 |= 0x1 << (4 * BIT2);//PA2 out
PA_CFG0 |= 0x1 << (4 * BIT3);//PA3 out
PA_DAT |= 0x1 << BIT2;//PA2 set
PA_DAT |= 0x1 << BIT3;//PA3 set
while(1)
{
PA_DAT &= ~(0x1 << BIT2);//PA2 reset
delay();
PA_DAT |= 0x1 << BIT2;//PA2 set
delay();
if((PA_DAT & (0x1 << BIT0)) != 0x0)
{
PA_DAT |= 0x1 << BIT3;//PA3 set
}
else
{
PA_DAT &= ~(0x1 << BIT3);//PA3 reset
}
}
}
static void delay(void) // about 408ms when CPU_CLK_SRC uses OSC24M
{
__asm volatile(
" ldr r0, =76480 \n"
" loop:cmp r0,#0 \n"
" beq exit \n"
" sub r0,r0,#1 \n"
" b loop \n"
"exit:nop \n"
);
}
2、原本按照书上编写了start.s文件,makefile文件,但经过多次尝试后发现书上的不能照抄。在网上查资料,发现全志的芯片需要一个tools工具,能够将代码端放到指定位置,以及各种初始化。从网上下载源码后,发现其中有F1C100.s对应了书上的start.s。但并不能按照书上简单组合,还需要各种辅助文件。文件已上传在我的资源中。
3、编译后,烧写到SD卡,运行效果?
?这个灯在500ms闪烁。按住PA0,会使PA3点亮。
参考:【荔枝派Nano】F1C100S的boothead和BROM - 哔哩哔哩
|