I. MX6U GPIO汇编语言点灯

1 用具

  1. I.MX6U Alpha开发板
  2. 100 \Omega 电阻、led灯、杜邦线

2 过程

2.1 GPIO控制原理

  1. 使能GPIO时钟
  2. 如果对应管脚可以复用,需要设置该管脚,复用成GPIO mode
  3. 配置GPIO属性,如上下拉电阻、速率等
  4. 设置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 问题

  1. 根据验证,只设置gpio1的外设时钟,无法点亮led灯,需要再将CCGR1中的CG9时钟使能,gpio才能成功被控制,即赋值为0X0C0C0000

【原因】:(坑)

【解决】:(坑)

说点什么
请文明发言!
支持Markdown语法
在"I. MX6U GPIO汇编语言点灯"已有1条评论
Loading...