本帖最后由 yuanlai2010 于 2014-7-10 15:15 编辑
裸机第一弹——点亮LED+SD启动
参与Helper2416开发板助学计划心得
1:LED硬件原理图
Helper2416开发板只为我们预留了一个LED——D8——连接到了GPB1——当GPB1输出为低电平时D8点亮
2:工程搭建
我使用的是GNU工具链,使用makefile文件来管理工程,所以这一步只需建立工程目录就行了。
3:代码编写
在工程目录中创建led_on.S文件,代码如下:
- @******************************************************************************
- @ File:led_on.S
- @ 功能:LED点灯程序,关闭看门狗,点亮D8
- @******************************************************************************
- .text
- .global _start
- _start:
- LDR R0, =0x53000000 @R0设为WTCON寄存器
- LDR R1, [R0] @把WTCOM寄存器的值读入到R1
- BIC R1, R1, #0x01 @清除最低位
- STR R1, [R0] @把值写入WTCON寄存器关闭看门狗
-
- LDR R0, =0x56000010 @ R0设为GPBCON寄存器。此寄存器
- @ 用于选择端口B各引脚的功能:
- @ 是输出、是输入、还是其他
- MOV R1, #0x00000004
- STR R1, [R0] @ 设置GPB1为输出口, 位[3:2]=0b01
-
- LDR R0, =0x56000014 @ R0设为GPBDAT寄存器。此寄存器
- @ 用于读/写端口B各引脚的数据
- MOV R1, #0x00000000 @ 此值改为0x00000002,
- @ 可让D8熄灭
- STR R1, [R0] @ GPB1输出0,D8点亮
-
- MAIN_LOOP:
- B MAIN_LOOP
-
- .end
-
复制代码 4:编写makefile
在工程目录中创建makefile文件,内容如下:
- led_on.bin : led_on.S
- arm-linux-gcc -g -c -o led_on.o led_on.S
- arm-linux-ld -Ttext 0x40000000 -g led_on.o -o led_on_elf
- #用IROM启动模式,代码会拷贝到起始地址为0x40000000的steppingstone开始运行,所以链接地址设置为从0x40000000开始
- arm-linux-objcopy -O binary -S led_on_elf led_on.bin
- clean:
- rm -f led_on.bin led_on_elf *.o
复制代码
5:代码编译
在led_on.S文件和makefile文件都编写完后就可以开始编译了,虽然只有一个源文件,为了养成好习惯,我还是使用makefile来管理:
1:通过Putty远程登入CentOS主机,cd到工程目录
2:执行 make 开始编译,得到需要的.bin文件
6:烧写SD卡&运行
烧写完成(这里只用BootLoader这一跨,其他为空)
开始我以为到这里从sd卡启动就可以点亮led了,但是尝试好几次都不能成功,原因就是如我上一篇帖子所说的“固化代码会直接从SD/MMC卡的一个特殊位置读出8k的代码”,而直接编译器生成的二进制代码都是不满足IROM SD/MMC启动所要求的代码存放格式的。所以在烧写到SD卡之前需要对*.bin文件进行一定的调整。
这里我使用网友分享的一个小软
SdBoot.rar
(27.88 KB, 下载次数: 31, 售价: 2 分芯积分)
来完成这部分工作,完成后将会生成一个*_1.bin文件,把这个文件烧写到SD卡就可以运行了。
运行效果如下:
下一步打算自己编写一个bin文件处理程序,直接在linux环境下运行,这样可以通过makefile直接调用,简化操作过程!
论坛ID:yuanlai2010
发表时间:2014-07-10