(imx6ull学习笔记一)I.MX6ULL汇编驱动板载LED

用到的汇编指令释义

指令描述
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 星期三

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值