一、vscode调整
- 加入汇编插件
ARM
- vscode权限受限(因为Ubuntu中的文件有的是root权限创建的,vscode以普通用户打开的话没有操作权限)
chmod 修改文件或者文件夹权限
二、编程步骤
- 使能GPIO时钟
- 设置引脚复用位GPIO
- 设置引脚属性(上下拉、速率、驱动能力)
- 控制GPIO引脚输出高低电平
三、程序编译
1、下载裸机的gcc编译器
sudo apt-get install gcc-arm-none-eabi
2、编译汇编文件为可重定位led.o文件
arm-none-eabi-gcc -c led.s -o led.o
3、把重定位文件链接起来,得到可执行文件(elf文件)
此处选择0x80000000作为链接地址,主要是因为它是ddr3内存的起始地址;
elf文件只适合在操作系统上运行,不适合在芯片上运行;
arm-none-eabi-ld -Ttext 0x80000000 led.o -o led.elf
4、把elf文件去掉冗余的段和elf头,得到纯净的bin文件
arm-none-eabi-objcopy -O binary led.elf led.bin
5、给bin文件添加6ull特殊的头部信息(IVT+boot data+DCD),并烧录到SD卡
./mkimage.sh xxx.bin
四、error笔记
1、输入命令,显示未找到命令
原因:有时候可能是环境变量没配好,有时候是代码写错了
解决方法:用which命令查看命令文件所在的具体位置,用全目录去执行
五、代码和过程
led.s
.global _start @用.global声明一个全局标识符,汇编文件在这开始,.sh脚本会进行识别
_start:
@使能GPIO时钟
ldr r0,=0x20c406c
ldr r1,=0xffffffff
str r1,[r0]
@设置引脚复用为GPIO
ldr r0,=0x20e006c
ldr r1,=5
str r1,[r0]
@设置引脚属性(上下拉,速率,驱动能力)
ldr r0,=0x20e02f8
ldr r1,=0x10b0
str r1,[r0]
@控制GPIO引脚输出高低电平
ldr r0,=0x0209c004
ldr r1,=16
str r1,[r0]
ldr r0,=0x0209c000
ldr r1,=0
str r1,[r0]
操作过程:
最后插上SD卡,读入进去,将拨码开关跳到01001001SD卡启动方式,将SD卡的跳线帽连接,上电。