Chapter 8. LED(GPIO操作)
【参考】:
01 i.mx6u GPIO详解
-
IO复用选择和属性配置寄存器
- i.mx6u的IO口是选定的,首先找到指定的IO,然后通过复用选择到所需要的IO功能
- 寄存器
- 复用选择:
IOMUXC_SW_MUX_CTL_PAD_XX_XX
- 属性配置:
IOMUXC_SW_PAD_CTL_PAD_XX_XX
- 复用选择:
-
GPIO寄存器配置
-
i.mx6u有GPIO1~GPIO5五组GPIO,每组GPIO各有8个寄存器。如下:
DR:数据寄存器
GDIR:方向寄存器
PSR:状态寄存器(只读)。输入下,同DR
ICR1:中断控制寄存器(低16个GPIO)。用于配置触发方式【低/高/上升沿/下降沿】
ICR2:中断控制寄存器(高16个GPIO)。用于配置触发方式【低/高/上升沿/下降沿】
EDGE_SEL:边沿选择寄存器。1-无视ICR配置,双边沿触发,0-遵守ICR规则
IMR:中断屏蔽寄存器。0-Disable,1-Enable
ISR:中断状态(标志)寄存器。(中断处理完后,需要软件清零)
-
-
时钟使能
- i.mx6u的时钟系统(CCM)包含7个控制寄存器CCM_CCGR0~CCM_CCGR6。对这些寄存器操作即可打开/关闭指定外设的时钟。
- CCM_CCGRx中每两位对应一个外设。位设置如下:
-
【小结】(GPIO使用配置步骤)
- 使能GPIO对应的寄存器;
- 设置IO复用功能
IOMUXC_SW_MUX_CTL_PAD_XX_XX
- 设置IO属性:
IOMUXC_SW_PAD_CTL_PAD_XX_XX
- 配置GPIO:对GPIO的8个寄存器进行操作即可
-
【疑问】
- 如何找到某个GPIO引脚对应的
IOMUXC_SW_MUX_CTL_PAD_XX_XX
寄存器?- 通过【datasheet】找到引脚,得到【Ball Name】
- 通过【Ball Name】去【参考手册】中【Chapter 30 xxx】搜索对应的寄存器即可
- 如何找到某个GPIO引脚对应的
02 编译程序
-
编译文件【arm-linux-gnueabihf-gcc】
例:
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
-g
:产生调试信息-c
:编译源文件,但不链接-o
:指定编译产生的文件名 -
链接文件【arm-linux-gnueabihg-ld】
-
概念:
- 可执行文件的运行起始地址,就是链接地址
- 正点原子教程所有裸机例程的链接地址都是在DDR中,链接起始地址为:0x87800000
-
例:
arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf
-Ttext
:指定链接地址-o
:指定生成的elf文件
-
-
格式转换【arm-linux-gnueabihf-objcopy】
-
类似于格式转换工具,可将
xxx.elf
格式转换为xxx.bin
格式 -
例:
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
-O
:指定什么格式输出。如-O binary
输出问二进制-S
:表示不要复制源文件中的重定位信息和符号信息-g
:表示不复制源文件中的调试信息
-
-
反汇编【arm-linux-gnueabihf-objdump】
-
需要查看汇编代码时使用
-
例:
arm-linux-gnueabihf-objdump -D led.elf > led.dis
-D
:表示反汇编所有的段
-
-
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: rm -rf *.o led.bin led.elf led.dis
03 程序烧写
-
i.mx6u 基本信息
- i.mx6u内部有96k的ROM,但是这96k的ROM是NXP自己用的,不向用户开放
- 正点原子做了个将
xxx.bin
文件烧写到SD卡的软件,叫【imxdownload】
-
【imxdownload】使用方法
-
将【imxdownload】拷贝到工程目录下
-
给予【imxdownload】可执行权限
-
确定要烧写的SD卡
-
确定SD卡没有数据,可能会格式化SD卡
-
确保SD卡连接到Linux(Ubuntu)
-
ls /dev/sd*
查看相关的设备如显示:
/dev/sda /dev/sda1 /dev/sda2 /dev/sda5
则
/dev/sda
即对应的SD卡,后面的/dev/sda1 /dev/sda2 /dev/sda5
都是该盘的分区
-
-
向SD卡烧写bin文件
格式:
./imxdownload <.bin file> <SD Card>
例:
./imxdownload led.bin /dev/sdd
注意事项:
- 正常烧写速度应该是几百KB/s。
- 若速度大于几十甚至几百MB/s,那么肯定烧写失败了。一般需要重启Ubuntu才能解决该问题
- 运行
imxdownload
后,在项目目录会生成对应的load.imx
文件,此文件是根据NXP官方启动方式介绍的内容,在xxx.bin
文件前添加了一些数据头后生成的。
-