由于是开发裸机下LED程序,所以首先查找开发板手册,手册上并没有提到,所以接着查找到开发板底板原理图,找到了相应的led连接图。
之后在开发板核心板芯片S3C2440手册上找到与之对应的引脚描述
继续往下翻,找到了对应的寄存器映射址
这样一些基础的工作就准备好了,接下来就是编程了
#define GPBCON (*(unsigned long volatile *)0x56000010)
#define GPBDAT (*(unsigned long volatile *)0x56000014)
#define GPBUP (*(unsigned long volatile *)0x56000018)
#define LED0 5 /*LED0 use GPB5*/
#define LED1 6 /*LED1 use GPB6*/
#define LED2 8 /*LED2 use GPB8*/
#define LED3 10 /*LED3 use GPB10*/
#define DELAY_TIME 20000000
static inline void delay (unsigned long loops)
{
__asm__ volatile ("1:\n"
"subs %0, %1, #1\n"
"bne 1b":"=r" (loops):"0" (loops));
}
int main(void)
{
/* Set GPB5,GPB6,GPB8,GPB10 as GPIO mode(0x01) */
GPBCON = (GPBCON|0x333C00)&0x111400;
GPBUP = (GPBUP | 0x560);
while(1)
{
/* Set GPB5,GPB6,GPB8,GPB10 as high level, to turn LED0,LED1,LED2,LED3 off */
GPBDAT = (GPBDAT | 0x560);
delay(DELAY_TIME);
/* Turn LED0 on */
GPBDAT = (GPBDAT & (~(1<<LED0)) );
delay(DELAY_TIME);
/* Turn LED1 on */
GPBDAT = (GPBDAT & (~(1<<LED1)) );
delay(DELAY_TIME);
/* Turn LED2 on */
GPBDAT = (GPBDAT & (~(1<<LED2)) );
delay(DELAY_TIME);
/* Turn LED3 on */
GPBDAT = (GPBDAT & (~(1<<LED3)) );
delay(DELAY_TIME);
}
}
在linux下编译的文件为.elf文件,而作为裸机的fl240并不会识别出来,所以需要转成二进制可执行文件。
所以这里需要连接脚本.lds文件:
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(main)
SECTIONS{
. = 0x33000000;
.text : {
*(.text)
*(.rodata)
}
.data ALIGN(4): {
*(.data)
}
.bss ALIGN(4): {
*(.bss)
}
}
当然makefile也少不了的