嵌入式linux学习笔记-20200220-JZ2440 裸机001 汇编代码点灯程序
使用的开发板是 韦东山老师的 JZ2440V3
第一步就是找到灯的 IO
根据原理图, 我们要想点亮 LED 需要给对应的 IO口 拉低
也就是说 需要拉低 GPF4 GPF5 GPF6
要设置一个 IO口的输出 第一步就是 设置IO的控制寄存器
2440 是非常古老的芯片 IO的复用结构和 输出控制非常的简单(或者说是 单一 )
这是对应的datesheet里面关于IO部分的 寄存器 我们暂时用到的就只有上面两个寄存器
GPFCON 控制寄存器 (这里可以类比于stm32 系列的mode 寄存器 就是控制io的 输入输出选择的)
GPFDAT 数据寄存器
这个就是 输出的时候作为 输出数据寄存器 如果是输入的话 这个寄存器就是IO口当前的电平状态
接下来就是设置值了
我们先来点亮一个 LED GPF4 对应于D10
控制寄存器的值 我们需要将 GPFCON[9:8] 设置为01
简化程序 我们直接写入 0x10 到控制寄存器
为了输出低电平我们需要给 GPFDATA[4] 寄存器输出 0
简化程序 直接输出0
接下来就是汇编代码 我们只需要基本的寄存器写指令就可以了
ldr r1, =0x56000054
ldr r0, =0 /* mov r0, #0 */
str r0, [r1]
大概是这三行 ldr 指令是寄存器装载指令(load register)
https://www.jianshu.com/p/66d801c85ee9 这是LDR 指令的解释 我就不去班门弄斧了
这里的register应该是特指CPU中的 16个 特殊的寄存器 而为了访问内存中的数据我们需要进行寄存器间接寻址 通过上面的三行代码 就可以实现一个 寄存器的写。 所以我们的程序很容易就 做出来了
其实韦老师当时应该也提过 mov指令 和ldr 的伪指令 这里就不做赘述了, 最简单的能实现功能的代码就行了....
最后加一个死循环
将文件发送到服务器
输入命令 arm-linux-gcc -c -o led.o led.S 预编译 输出指定名为led.o的文件
接下来是链接文件
arm-linux-ld -Ttext 0 led.o -o led.elf
arm-linux-objcopy -O binary -S led.elf led.bin
这是单步的指令 可以编写Makefile文件来 替代人手工输入
这样我们就生成了 需要的一个bin 文件
使用 openjtag 下载到开发板上即可