汇编点亮LED
准备工作
点灯前的准备工作,下面是我们需要使用到的文件
dcd.config文件内容是一些DDR和时钟的配置参数
dcdgen.bin可以将dcd.config生成dcd.bin文件
led.s是我们编写的汇编代码,通过这个文件生成led.bin文件
imgutil.bin文件将dcd.bin和led.bin生成镜像文件
led.bin文件
编写汇编代码
led.s代码如下
.global _start
#点亮蓝色的LED灯
_start:
#使能GPIO的时钟,这里使能GPIO4_IO19对应的时钟\控制GPIO4时钟的寄存器是CCGR4
ldr r0,=0x20C4074
ldr r1,=0xffffffff
#将r1中的值赋值到r0内容的地址处
str r1,[r0]
#复用引脚为GPIO
ldr r0,=0x20E01DC
#将寄存器的值设置为3-0bit设置为0101,即数值5
ldr r1,=5
str r1,[r0]
#设置引脚的属性
ldr r0,=0x20E0468
#参考sdk值设计
ldr r1,=0x10b0
str r1,[r0]
#控制引脚
#设置为输出模式,即GPIO4_GDIR
ldr r0,=0x20A8004
ldr r1,=(1<<19)
str r1,[r0]
#设置数据寄存器的值为0,即GPIO4_DR
ldr r0,=0x20A8000
ldr r1,=0
str r1,[r0]
获得led.bin文件
将led.s文件编译成led.o文件
arm-eabi-gcc -c led.s -o led.o
将led.o文件指定链接地址为0x80002000
arm-eabi-ld -Ttext 0x80002000 led.o -o led.elf
将led.elf文件转为led.bin文件
arm-eabi-objcopy -O binary led.elf led.bin
准备dcd.bin文件
dcd.config文件内容为初始化DDR和时钟的参数,使用dcdgen.bin程序将dcd.config生成dcd.bin文件,执行以下命令
./dcdgen.bin dcd.config dcd.bin
执行上述命令输出以下信息
生成镜像文件
至此,我们需要的文件都已经准备就绪啦。
接下来运行imgutil.bin程序,传入参数,将文件打包为sdk20-app.img镜像文件
./imgutil.bin --combine base_addr=0x80000000 ivt_offset=0x400 app_offset=0x2000 dcd_file=dcd.bin app_file=led.bin ofile=sdk20-app.img image_entry_point=0x80002000
上面命令的各参数含义
变量 | 内容 | 对应含义 |
---|---|---|
base_addr | 0x80000000 | IVT表的基地址 |
ivt_offset | 0x400 | IVT表相对基地址的偏移 |
app_offset | 0x2000 | led.bin文件相对基地址的偏移 |
dcd_file | dcd.bin | 片内ROM执行配置DDR和时钟的参数 |
app_file | led.bin | 真正要执行的代码 |
ofile | sdk20-app.img | 生成的镜像文件 |
image_entry_point | 0x80002000 | 程序的入口地址 |
执行上述命令输出信息如下图所示
烧录镜像文件
接下来将生成的镜像文件sdk20-app.img,烧录到sd卡中,我的sd卡在linux上是sdb,执行下面命令烧录到sd卡
sudo dd if=sdk20-app.img of=/dev/sdb bs=512 conv=fsync
执行上述命令输出信息如下图所示
实验现象
将sd卡插入,开发板中,拨码开关选择sd卡启动,上电后就点亮了LED。