6ULL的IO是可以复用多种功能的,通过寄存器配置其具体功能。
以IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00为例,其复用寄存器如下:
寄存器地址:0x020E_005C
为32位寄存器,只用了低五位[4:0]。其中bit0~bit3(MUX_MODE)就是设置 GPIO1_IO00 的复用功能的。共9种功能,ALT5就是作为GPIO1_IO00。
选择复用功能为GPIO后,需要对其进行进行属性配置。配置寄存器如下:
此寄存器也是32位寄存器,只用了低17位。
当IO作为GPIO使用时,需要设置的寄存器一共有八个:
时钟使能寄存器有CCM_CCGR0~CCM_CCGR6这7个寄存器。控制着所有外设时钟开关。
以CCM_CCGR0为例:
每 2 位控制一个外设的时钟,比如 bit31:30 控制着
GPIO2 的外设时钟,两个位就有 4 中操作方式,00:关闭,01:运行模式下开启。10:未使用,11:除停止模式外,其他所有模式都打开。
前面原理分析可知,GPIO使用需要如下步骤:
新建1.leds文件夹,在文件夹内新建led.s文件,.vscode文件夹。其中.vscode文件夹是vs工程。
vscode打开文件夹,编辑led.s代码:
.global _start /*全局标识*/
/* _start函数,程序从此函数开始执行,此函数完成
时钟使能,GPIO初始化,最终控制GPIO输出低电平
点亮LED灯 */
_start:
/* 1.使能所有时钟 */
ldr r0, =0x020C4068 /* 寄存器CCGR0 */
ldr r1, =0xffffffff
str r1, [r0]
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]
/* 2.设置GPIO1_IO04为复用GPIO1_IO04 */
ldr r0, =0x020E006C /* 将寄存器SW_MUX_CTL_PAD_GPIO1_IO04 添加到r0中 */
ldr r1, =0x05 /* 设置寄存器的MUX_MODE为5*/
str r1, [r0]
/*
3.配置GPIO1_IO04的IO属性
*bit 16:0 HYS关闭
*bit 15:14 :00默认下拉
*bit 13 :0 keeper使能
*bit 12 :1 pull/keeper使能
*bit 11 : 0 关闭开路输出
*bit 7:6 :10 速度100Mhz
*bit 5:3 : 110 R0/6驱动能力
*bit 0 : 0 低转换率
*/
ldr r0, =0x20E02F8 /* 寄存器SW_PAD_GPIO1_IO03_BASE */
ldr r1, =0x10B0 /* */
str r1, [r0]
/* 4.设置GPIO1_IO04为输出*/
ldr r0, =0X0209C004 /* 寄存器 GPIO1_GDIR */
ldr r1, =0X00000010 /* */
str r1, [r0]
/* 5.打开LED */
ldr r0, =0X0209C000 /* 寄存器 GPIO1_DR */
ldr r1, =0x00000010 /* */
str r1, [r0]
loop:
b loop
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
为了方便编译,一般把多条指令编辑成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
前面我们已经得到了led.bin文件,下面还需要在bin文件前添加一个头部信息,才可以运行。我们使用的工具是正点原子提供的imxdownload软件。
chmod 777 imxdownload
ls /dev/sd*
./imxdownload led.bin /dev/sdc
运行前需要把开发板调到SD卡启动模式,然后把SD卡查到卡槽内,上电看到彩灯红色亮,即控制了IO输出低电平。
开发板启动方式选择如下: