2. S3C6410 裸机开发--LED

时间:2022-03-24 12:21:21

相信不要学习单片机,嵌入式系统的爱好者都是从点亮LED 开始的,大家都也形成了这样的一个习惯性思维,其实这是熟悉一款单片机或微处理器的最好的起步方法,GPIO 对于 微处理器来说是相对简单但有时最基本和最重要的,所以,从LED 开始学习,可以很好的熟悉这款微处理器的一些特性和编程方法,好了,下面就开始实现 S3C6410 的LED 点亮之路。

首先是熟悉 开发板的硬件电路,知道LED 是怎样的电路构成,与微处理器是怎么连接的,我以OK6410 为例,其他开发环境都大致一样。

打开原理图,找到LED 与微处理器的电路连接,如下:


2. S3C6410 裸机开发--LED

2. S3C6410 裸机开发--LED


可以发现,OK6410 的GPM0~3 与LED 相连,那就可以直接让引脚输出高低电平控制LED 亮或者灭了,但是还要查看 S3C6410 的手册来分析 GPIO的 寄存器和编程方法,


2. S3C6410 裸机开发--LED

2. S3C6410 裸机开发--LED

GPM 端口有三个寄存器,是要设置为 output 模式,然后再GPMDAT 数据寄存器中设置相应端口电平的高低就可以让对应端口输出高低电平了,有了这些,就可以写程序了,如下:


2. S3C6410 裸机开发--LED


定义了三个宏,然后就可以在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

这样就可以使用熟悉的 main.c 文件了,然后再main 函数中调用初始化,然后while()循环执行:


#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
}
}


好了,代码就写好了,可是还差一步,别忘了我们是在linux环境下,没有IDE ,所以编译的过程得靠自己来做,这就是编写Makefile:


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

注意,如果你的编译器和我一样,是 4.3.2,那么上面的Makefile 就可能有问题,编译是不会通过的,如果通过。。。。那就通过吧,如果不通过,就吧arm-linux-gcc 命令后面加上条件 -nostdlib就可以了,如:arm-linux-gcc -nostdbli -o start.o start.S -c, 其他同之,编写完后就可以make 了,生产了三个文件 led.dis 是反汇编文件,调试可对比查看, led.bin 是需要焼写的文件。


最后,利用上一遍讲得 方法,就可以直接烧写到 6410 的板子上面了,你就可以看到你的 LED 已经亮了。

OK ,就这么简单地让LED闪烁了。