本节主要记录自己学习汇编LED灯的实验。
通过电路原理图可以看出我们要配置的LED是接到GPIO1_IO03上了,因此我们只需要设置这个引脚为高电平或者低电平就可以实现对LED灯的亮灭控制。
因此我们只需要配置CCM_CCGRx寄存器就可以配置对应的时钟,
为了方便我们全部设置CCM_CCGRx(x=0…6)成1
找到 GPIO1_IO03 的复用寄存器“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03”的地址为
0X020E0068,然后设置此寄存器,将 GPIO1_IO03 这个 IO 复用为 GPIO 功能,也就是 ALT5。
找到 GPIO1_IO03 的配置寄存器“IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03”的地址为
0X020E02F4,根据实际使用情况,配置此寄存器。
经过前面几步, GPIO1_IO03 已经配置好了,只需要向 GPIO3_DR 寄存器的 bit3 写入 0 即可控制 GPIO1_IO03 输出低电平,打开 LED,向 bit3 写入 1 可控制 GPIO1_IO03 输出高电平,关闭 LED。
.global _start //这是一个全局标号
_start:
/****步骤一:使能所有外设时钟******/
ldr r0, =0x020c4068 @CCGR0
ldr r1,=0xffffffff @要向CCGR0写入到的数据
str r1 , [r0] @将0xffffffff写入到CCGR0中
ldr r0, =0x020c406c @CCGR1
str r1 , [r0] @将0xffffffff写入到CCGR0中
ldr r0, =0x020c4070 @CCGR2
str r1 , [r0] @将0xffffffff写入到CCGR0中
ldr r0, =0x020c4074 @CCGR3
str r1 , [r0] @将0xffffffff写入到CCGR0中
ldr r0, =0x020c4078 @CCGR4
str r1 , [r0] @将0xffffffff写入到CCGR0中
ldr r0, =0x020c407c @CCGR5
str r1 , [r0] @将0xffffffff写入到CCGR0中
ldr r0, =0x020c4080 @CCGR6
str r1 , [r0] @将0xffffffff写入到CCGR0中
/*****步骤二:设置GPIO1_IO03复用功能
* GPIO1_IO03的复用为GPIO,也就是设置
* IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03=5
* IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的地址为0x020E0068h
*****/
ldr r0, =0x020E0068 @IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03
ldr r1,=0x05 @要向IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03写入到的数据
str r1 , [r0] @将0x05写入到IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03中
/*步骤三:配置GPIO01-IO03的电气属性,也就是寄存器
* IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
* 寄存器地址:0x20E02F4h
*bit 16:0 HYS 关闭
*bit [15:14]: 00 默认下拉
*bit [13]: 0 kepper 功能
*bit [12]: 1 pull/keeper 使能
*bit [11]: 0 关闭开路输出
*bit [7:6]: 10 速度 100Mhz
*bit [5:3]: 110 R0/6 驱动能力
*bit [0]: 0 低转换率
* 最终设置:0000 10 1011 0000==0x10b0
*/
ldr r0,=0x020e02F4
ldr r1,=0x10B0
str r1, [r0]
/*************步骤四:配置GPIO功能*******************
* GPIO1_GDIR 地址:0x209C004
* GPIO1_GDIR: 对应位设置
* 0输入
* 1输出
*
***************************************************/
ldr r0,=0x209C004
ldr r1,=0x8
str r1, [r0]
/*步骤五打开LED
* 打开LED,也就是设置GPIO1_IO03设置0
* GPIO1_DR 寄存器地址0x0209C000
*/
ldr r0,=0x0209C000 //亮
ldr r1 , =0
str r1 , [r0]
loop:
b loop
leds.bin:leds.s
arm-linux-gnueabihf-gcc -g -c leds.s -o leds.o
arm-linux-gnueabihf-ld -Ttext 0X87800000 leds.o -o leds.elf
arm-linux-gnueabihf-objcopy -O binary -S -g leds.elf leds.bin
arm-linux-gnueabihf-objdump -D leds.elf > leds.dis
clean:
rm -rf *.o leds.bin leds.elf leds.dis
准备一张新的 SD(TF)卡,确保 SD 卡里面没有数据,因为我们在烧写代码的时候可能会格式话 SD 卡!!!
Ubuntu 下所有的设备文件都在目录“/dev”里面,所以插上 SD 卡以后也会出现在“/dev”
里面,其中存储设备都是以“/dev/sd”开头的。我们要先看一下不插 SD 卡的时候电脑都有哪些
存储设备,以防插入 SD 卡以后分不清谁是谁。输入如下所示命令
这里我们用的是/dev/sdb
向 SD 卡烧写 bin 文件
./imxdownload leds.bin /dev/sdb
取出SD卡放入到开发板中的卡槽重启开发板即可完成。