一.ARM裸机开发步骤
1. 看电路图
a. 找到我要控制的设备
b. 找到设备在CPU侧的控制管脚(如GPX2_7)
2. 看芯片手册 (先看相关的中文文档,熟悉设备,再看手册)
a. 搜索电路图里对应控制管脚的名称(如GPX2)
b. 看目录找到对应的控制模块(如:6 General Purpose Input/Output (GPIO) Control)
c. 看该模块的overview 了解该模块的大概功能
d. 看控制寄存器(REGISTER DESCRIPTION) 重点,难点
注: 如果寄存器比较多什么办?
看技术支持提供的例子程序, 找到需要修改的寄存器(常常只有几个)。
部分厂商会提供配置软件,通过界面去配置功能, 我们只需使用配置好的寄存器值就可以了
3. 编程
a. 定义要控制的寄存器的宏 (与手册里的寄存器地址对应起来)
b. 设备初始化 (如设置GPIO为输出状态)
c. 把功能分成最基本的小块,逐个实现 如点亮灯-> 在灭灯-> 加延时->闪烁-> 跑马灯
二. 实现LED灯的控制
其实和我们单片机的开发是一样的无非就是寄存器多了一些,功能更强大了而已。
那么怎么实现LED的闪烁,(讯为4412)
- 首先打开我们原理图:
通过查找KP_COL0---》对应到核心板CON11的54脚
VDD50_EN—》对应到核心板CON10的73脚
然后我们去查询下核心板原理图。
LED2-->GPL2_0
LED3-->GPK1_1
2. 查看数据手册
知道管脚了,查看下数据手册。
led的管脚就是个gpio,分为很多的组,查看下gpio的寄存器章节6.2.1
很明显管脚有这么多种的寄存器,。
搜索下GPL2
然后看一下GPL2CON的详细描述,这个为控制寄存器,基地址,包含7个管脚。
和单片机的寄存器概念一致,其他寄存器不过多说明。
3. 编写代码,控制灯闪烁
.text
/*@ 设置LED灯的配置寄存器 GPL2CON0 为输出状态
ldr r0,=0x11000100
ldr r1,[r0]
bic r1,#0x0000000f
orr r1,#0x00000001
str r1,[r0]*/
@ 设置LED灯的配置寄存器 GPK1CON1 为输出状态
ldr r0,=0x11000060
ldr r1,[r0]
bic r1,#0x000000f0
orr r1,#0x00000010
str r1,[r0]
loop:
@ 设置LED灯输出高电平 GPL2DAT0
ldr r0,=0x11000104
ldr r1,[r0]
orr r1,#0x01
str r1,[r0]
bl delay1s
@ 设置LED灯输出0电平 GPL2DAT0
ldr r0,=0x11000104
ldr r1,[r0]
bic r1,#0x01
str r1,[r0]
bl delay1s
@ 设置LED灯输出高电平 GPK1DAT1
ldr r0,=0x11000064
ldr r1,[r0]
orr r1,#0x02
str r1,[r0]
bl delay1s
@ 设置LED灯输出0电平 GPK1DAT1
ldr r0,=0x11000064
ldr r1,[r0]
bic r1,#0x02
str r1,[r0]
bl delay1s
b loop
delay1s:
ldr r4,=0x1ffffff
delay1s_loop:
sub r4,r4,#1
cmp r4,#0
bne delay1s_loop
mov pc,lr
.end
Makefile
CROSS = arm-none-linux-gnueabi-
CC=$(CROSS)gcc
LD=$(CROSS)ld
OBJCOPY=$(CROSS)objcopy
all : led.s
$(CC) -g -c -o led.o led.s
$(LD) led.o -Ttext 0x40001000 -o led.elf
$(OBJCOPY) -O binary -S led.elf led.bin
$(CROSS)objdump -D led.elf > led.dis
clean:
rm -f *.o *.elf *.bin *.dis
进行编译,下载执行。
烧写通过tftp,进行下载测试。