I. MX6U GPIO汇编语言点灯
1 用具
- I.MX6U Alpha开发板
- 100
\Omega
电阻、led灯、杜邦线
2 过程
2.1 GPIO控制原理
- 使能GPIO时钟
- 如果对应管脚可以复用,需要设置该管脚,复用成GPIO mode
- 配置GPIO属性,如上下拉电阻、速率等
- 设置GPIO功能,如方向、值等
2.2 具体步骤
I.MX6U Alpha开发板所用的芯片型号是,正点原子提供了芯片的参考手册,本实验中以点亮GPIO01_IO1为例。
(1)在参考手册第18章时钟控制模组中,找到GPIO1的外设时钟。根据手册中描述,将对应的两个比特位设置为"11"表示使能,即给地址0X020C406C写入0X0C000000。
(2)在参考手册第32章IOMUX Controller,找到GPIO01_IO01的PAD和MUX寄存器,MUX寄存器用来选择管脚的利用功能,PAD寄存器用来配置GPIO1_IO01,如速度设置、驱动能力、压摆率等。
MUX寄存器的地址为0X020E0060,要复用成GPIO1,需要向该地址中写入值0X5。
PAD寄存器地址为0X020E02EC,向该地址中写入值0X10B0。
(3)在参考手册第28章GPIO,找到GPIO01寄存器,根据参考手册中的描述,该寄存器一位表示一组GPIO中的某个管脚,则GPIO01_IO1对应该32位寄存器的第2位,将两个寄存器值设置为0x2,表示设置GPIO01_IO1的方向为输出,值为1。
即向地址0X0209C000中写入值0X2,向地址0X0209C004中写入值0X2,注意要先写方向,再写值。
(4)将以上编写成汇编代码,代码见下。
.global _start
_start:
/* enable gpio1 clock */
ldr r0, =0x020c406c
ldr r1, =0x0c000000
str r1, [r0] /* 将r1中的值写入r0存储的地址中 */
/* set gpio mode */
ldr r0, =0x020e0060
ldr r1, =0x5
str r1, [r0]
/* set gpio attributes */
ldr r0, =0x020e02ec
ldr r1, =0x10b0
str r1, [r0]
/* set gpio direction */
ldr r0, =0x0209c004
ldr r1, =0x2
str r1, [r0]
/* set gpio value */
ldr r0 =0x0209c000
ldr r1,=0x2
str r1,[r0]
loop:
b loop
(5)使用交叉编译器将汇编编译成二进制文件。
使用gcc编译文件
arm-linux-gnueabihf-gcc -c led.s -o led.o
使用ld链接器链接文件(本系列所有裸机例程的链接地址都在DDR中,链接地址都为0x87800000)
arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf
使用objcopy进行格式转换,得到二进制文件
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
(6)使用正点原子提供的烧录工具,将二进制文件烧录进SD卡中。
./imxdownload led.bin /dev/sdb
(7)插入SD卡,给开发板上电,可见搭建的LED灯被点亮。
3 问题
- 根据验证,只设置gpio1的外设时钟,无法点亮led灯,需要再将CCGR1中的CG9时钟使能,gpio才能成功被控制,即赋值为0X0C0C0000。
【原因】:(坑)
【解决】:(坑)
声明:
本文采用
BY-NC-SA
协议进行授权,如无注明均为原创,转载请注明转自
SigmaPoet
本文地址: I. MX6U GPIO汇编语言点灯
本文地址: I. MX6U GPIO汇编语言点灯