相信不要学习单片机,嵌入式系统的爱好者都是从点亮LED 开始的,大家都也形成了这样的一个习惯性思维,其实这是熟悉一款单片机或微处理器的最好的起步方法,GPIO 对于 微处理器来说是相对简单但有时最基本和最重要的,所以,从LED 开始学习,可以很好的熟悉这款微处理器的一些特性和编程方法,好了,下面就开始实现 S3C6410 的LED 点亮之路。
首先是熟悉 开发板的硬件电路,知道LED 是怎样的电路构成,与微处理器是怎么连接的,我以OK6410 为例,其他开发环境都大致一样。
打开原理图,找到LED 与微处理器的电路连接,如下:
可以发现,OK6410 的GPM0~3 与LED 相连,那就可以直接让引脚输出高低电平控制LED 亮或者灭了,但是还要查看 S3C6410 的手册来分析 GPIO的 寄存器和编程方法,
GPM 端口有三个寄存器,是要设置为 output 模式,然后再GPMDAT 数据寄存器中设置相应端口电平的高低就可以让对应端口输出高低电平了,有了这些,就可以写程序了,如下:
定义了三个宏,然后就可以在C 函数中调用了,当然,此时还不能直接使用C 环境,首先做的是要编写启动文件 start.S
.globl _start
_start:
/* 硬件相关的设置 : 把外设的基地址告诉CPU */
/* Peri port setup */
ldr r0, =0x70000000
orr r0, r0, #0x13
mcr p15,0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff)
/* 关看门狗 */
/* 往WTCON(0x7E004000)写0 */
ldr r0, =0x7E004000
mov r1, #0
str r1, [r0]
/* 设置栈 */
ldr sp, =8*1024
bl main /* 调用C函数 */
halt:
b halt
#include "led.h"
void main()
{
unsigned int cnt;
LED_Init();
while(1)
{
LED_ON(LED);
for(i=0;i<0xffff;i++); //delay
LED_OFF(LED);
for(i=0;i<0xffff;i++); //delay
}
}
led.bin: start.o main.o
arm-linux-ld -Ttext 0 -o led.elf start.o main.o
arm-linux-objcopy -O binary led.elf led.bin
arm-linux-objdump -D led.elf > led.dis
start.o : start.S
arm-linux-gcc -o start.o start.S -c
main.o : main.c
arm-linux-gcc -o main.o main.c -c
clean:
rm *.o led.elf led.bin led.dis
最后,利用上一遍讲得 方法,就可以直接烧写到 6410 的板子上面了,你就可以看到你的 LED 已经亮了。
OK ,就这么简单地让LED闪烁了。