用到的汇编指令释义
指令 | 描述 |
---|---|
LDR Rd, [Rn , #offset] | 从存储器 Rn+offset 的位置读取数据存放到 Rd 中。 |
STR Rd, [Rn, #offset] | 将 Rd 中的数据写入到存储器中的 Rn+offset 位置。 |
编程操作步骤
①、使能 GPIO 对应的时钟。
②、设置寄存器 IOMUXC_SW_MUX_CTL_PAD_XX_XX,设置 IO 的复用功能,使其复用
为 GPIO 功能。
③、设置寄存器 IOMUXC_SW_PAD_CTL_PAD_XX_XX,设置 IO 的上下拉、速度等等。
④、第②步已经将 IO 复用为了 GPIO 功能,所以需要配置 GPIO,设置输入/输出、是否使
用中断、默认输出电平等。
设置时钟使能
将CCM_CCGR0~CCM_CCGR6寄存器全部设为0xFFFFFFFF,表示除了停止模式以外,其他所有模式下时钟都打开。
ldr r0,=0x020c4068 @CCGR0
ldr r1,=0xffffffff @要写入的数据
str r1,[r0] @将0xfffffff写入CCGR0
ldr r0,=0x020c406c @CCGR1
str r1,[r0]
ldr r0,=0x020c4070 @CCGR2
str r1,[r0]
ldr r0,=0x020c4074 @CCGR3
str r1,[r0]
ldr r0,=0x020c4078 @CCGR4
str r1,[r0]
ldr r0,=0x020c407c @CCGR5
str r1,[r0]
ldr r0,=0x020c4080 @CCGR6
str r1,[r0]
配置GPIO1_IO03 PIN的复用为GPIO
找到 GPIO1_IO03 的复用寄存器“IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03”的地址为0X020E0068,然后设置此寄存器,将 GPIO1_IO03 这个 IO 复用为 GPIO 功能,也就是 ALT5。
@配置GPIO1_IO03 PIN的复用为GPIO,也就是设置
@IOMUCX_SW_MUX_CTL_PAD_GPIO1_IO03=5
@IOMUCX_SW_MUX_CTL_PAD_GPIO1_IO03地址为0x020e0068
ldr r0,=0x020e0068 @IOMUCX_SW_MUX_CTL_PAD_GPIO1_IO03
ldr r1,=0x5 @要写入的数据
str r1,[r0] @将0xfffffff写入IOMUCX_SW_MUX_CTL_PAD_GPIO1_IO03
配置GPIO_IO03的电气属性,也就是寄存器
找到 GPIO1_IO03 的配置寄存器“IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03”的地址为
0X020E02F4,根据实际使用情况,配置此寄存器。
@配置GPIO_IO03的电气属性,也就是寄存器
@IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
@IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03地址为0x020e02f4
@bit0: 0 低速率
@bit5:3: 110 R0/6驱动能力
@bit7:6 10 100M速度
@bit11: 0 关闭开路输出
@bit12: 1 使能pull/kepper
@bit12: 0 kepper
@bit15:14: 00 100k下拉
@bit16: 0 关闭hys
ldr r0,=0x020e02f4
ldr r1,=0x10b0
str r1,[r0]
设置GPIO1_IO03为输出
我们已经将 GPIO1_IO03 复用为了 GPIO 功能,所以我们需要配置 GPIO。本实验中 GPIO1_IO03 是作为输出功能的,因此 GPIO1_GDIR 的 bit3 要设置为 1,表示输出。
@设置GPIO
@设置GPIO1_IO03为输出
@GPIO1_GDIR寄存器地址为0x0209c004,设置GPIO1_GDIR寄存器bit3为1
@也就是设置GPIO1_IO03为输出
ldr r0,=0x0209c004
ldr r1,=0x00000008
str r1,[r0]
控制 GPIO 的输出电平
经过前面几步,GPIO1_IO03 已经配置好了,只需要向 GPIO1_DR 寄存器的 bit3 写入 0 即可控制 GPIO1_IO03 输出低电平,打开 LED,向 bit3 写入 1 可控制 GPIO1_IO03 输出高电平,关闭 LED。
@打开LED,也就是设置GPIO1_IO03为0
@GPIO1_DR寄存器地址为0x0209c000
ldr r0,=0x0209c000
ldr r1,=0
str r1,[r0]
完整程序
.global _start @全局标号
_start:
@初始化使能所有外设时钟
ldr r0,=0x020c4068 @CCGR0
ldr r1,=0xffffffff @要写入的数据
str r1,[r0] @将0xfffffff写入CCGR0
ldr r0,=0x020c406c @CCGR1
str r1,[r0]
ldr r0,=0x020c4070 @CCGR2
str r1,[r0]
ldr r0,=0x020c4074 @CCGR3
str r1,[r0]
ldr r0,=0x020c4078 @CCGR4
str r1,[r0]
ldr r0,=0x020c407c @CCGR5
str r1,[r0]
ldr r0,=0x020c4080 @CCGR6
str r1,[r0]
@配置GPIO1_IO03 PIN的复用为GPIO,也就是设置
@IOMUCX_SW_MUX_CTL_PAD_GPIO1_IO03=5
@IOMUCX_SW_MUX_CTL_PAD_GPIO1_IO03地址为0x020e0068
ldr r0,=0x020e0068 @IOMUCX_SW_MUX_CTL_PAD_GPIO1_IO03
ldr r1,=0x5 @要写入的数据
str r1,[r0] @将0xfffffff写入IOMUCX_SW_MUX_CTL_PAD_GPIO1_IO03
@配置GPIO_IO03的电气属性,也就是寄存器
@IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
@IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03地址为0x020e02f4
@bit0: 0 低速率
@bit5:3: 110 R0/6驱动能力
@bit7:6 10 100M速度
@bit11: 0 关闭开路输出
@bit12: 1 使能pull/kepper
@bit12: 0 kepper
@bit15:14: 00 100k下拉
@bit16: 0 关闭hys
ldr r0,=0x020e02f4
ldr r1,=0x10b0
str r1,[r0]
@设置GPIO
@设置GPIO1_IO03为输出
@GPIO1_GDIR寄存器地址为0x0209c004,设置GPIO1_GDIR寄存器bit3为1
@也就是设置GPIO1_IO03为输出
ldr r0,=0x0209c004
ldr r1,=0x00000008
str r1,[r0]
@打开LED,也就是设置GPIO1_IO03为0
@GPIO1_DR寄存器地址为0x0209c000
ldr r0,=0x0209c000
ldr r1,=0
str r1,[r0]
loop:
b loop
烧录步骤
编写makefile
使用sudo gedit Makefile
在工程目录创建Makefile文件后输入以下代码:
led.bin:led.s
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
arm-linux-gnueabihf-objdump -D led.elf > led.dis
clean:
然后在工程目录下打开命令行输入make
编译代码。
烧录前的准备工作
将正点原子开发板光盘->5、开发工具->2、Ubuntu 下裸机烧写软件->imxdownload,发送到Ubuntu虚拟机下的工程目录。
使用sudo chmod 777 imxdownload
给予权限。
将tf卡插入读卡器后连接电脑虚拟机。
使用ls /dev/sd*
查看存储设备
我这里的设备为sdb.
使用 imxdownload 向 SD 卡烧写 led.bin 文件
使用 imxdownload 向 SD 卡烧写 led.bin 文件,命令格式如下:
./imxdownload <.bin file> <SD Card>
其中.bin 就是要烧写的.bin 文件,SD Card 就是你要烧写的 SD 卡,比如我的电脑使用如下
命令烧写 led.bin 到/dev/sdd 中:
./imxdownload led.bin /dev/sdd //不能烧写到/dev/sda 或 sda1 设备里面!那是系统磁盘
烧写的过程中可能会让你输入密码,输入你的 Ubuntu 密码即可完成烧写
代码验证
将拨码开关设置为SD卡启动模式,正点原子开发板如图所示:
设置完成后将烧录完成的tf卡插入开发板背面的卡槽,通电复位后如一切正常将会看到板载LED等亮起,如图所示:
至此,I.MX6ULL使用汇编点亮板载LED灯的程序就完成了。
2021-05-19 21:45:54 星期三