在上一篇文章中提到SD卡的裸机开发环境的搭建以及OK6410的启动设置,这章开始进入LED灯的闪烁控制。
1、首先打开OK6410的开发板原理图,找到LED等控制的原理图部分,如下图1所示。
图1 LED灯控制原理图
由图1可知,控制LED灯的CPU管脚为NLED1~NLED4,NLED1~NLED4对应的CPU管脚名称为GPM0~GPM3(CPU原理图未给出)。
2、编写程序LED.s,下面直接给出LED.s的源码。
.globl _start
_start:
/* 硬件相关的设置 */
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]
/* 设置GPMCON让GPM0/1/2/3作为输出引脚 */
ldr r1, =0x7F008820
ldr r0, =0x1111
str r0, [r1]
/* 设置GPMDAT */
ldr r1, =0x7F008824
loop:
/*设置GPMDAT让GPM0/1/2/3作为输出高电平1,LED灯全灭*/
mov r0, #0x0f
str r0, [r1]
/* 延时 */
bl delay
/*设置GPMDAT让GPM0/1/2/3作为输出高电平0,LED灯全亮*/
mov r0,#0
str r0, [r1]
/* 延时 */
bl delay
/* 死循环*/
b loop
/* 延时子程序*/
delay:
ldr r2, =0xffffff
delay_loop:
sub r2, r2, #1
cmp r2, #0
bne delay_loop
mov pc, lr
3、CP15协处理器指令说明
arm11把memory和Peripheral接口分开了,上面的红色划线代码在初始化是告诉CPU外设寄存器的基地址和地址空间。
寄存器格式:
查看SC6410的芯片手册可知外设地址的base address为0x70000000,如下图所示:
4、GPIO指令说明
LED使用的GPIO口为GPM0~GPM3,查看芯片手册,和GPM有关的寄存器主要下面三个寄存器,如下图所示;
GPMCON为端口模式寄存器,这里需要将端口模式设置为输出模式;
GPMDAT寄存器为IO数据寄存器,每一位对应相应的IO口,LED闪烁功能只需要在间隔固定时间对该寄存器写0或写1;
5、程序编译makefile
Makefile文件入下:
CC = arm-linux-gcc
LD = arm-linux-ld
OBJCOPY = arm-linux-objcopy
CFLAGS = -c -o
LDFLAGS = -e _start -Ttext 0x0c000000 -o
led.bin:led.elf
$(OBJCOPY) -O binary $< $@
led.elf: start.o
$(LD) $(LDFLAGS) $@ $<
start.o : start.S
$(CC) $(CFLAGS) $@ $<
clean:
rm *.o led.elf led.bin
输入make,编译生成led.bin烧写文件
6、程序烧写
将上一步操作生成的Led.bin文件拷贝到windows环境下,使用winhex软件进行程序烧写。
a.打开winhex软件,这里使用的版本为WinHex 15.1 SR-8,同时插入SD卡,软件打开界面如下图所示:
b.打开SD卡,操作如下图所示:
c.打开led.bin文件,如下图所示:
d.将复制的内容写入到指定的SD卡的位置,步骤如下:
e.完成之后,将SD卡插入开发板的SD卡槽,然后上电,这里LED将会不停的闪烁。
本文出自 “gavin” 博客,请务必保留此出处http://gavin2.blog.51cto.com/1703264/1769427
原文地址:http://gavin2.blog.51cto.com/1703264/1769427