IM6U使用GPIO功能时,需要先使能时钟,把IO口进行复用为GPIO,然后配置IO口,再配置GPIO。
1.使能时钟
打开所有时钟
CCM_CCGR0=3 << 30
2.IO复用
具体复用方式在寄存器类似下面这种:
IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00
3.IO配置
具体配置方式在寄存器类似下面这种:
IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00
常用寄存器:
(1)HYS:用于输入波形整型
(2)PUS:设置上下拉电阻(100k下\上拉,47k上拉,22k上拉)
(3)PUE:见下图
(4)PKE:使能PUE
(5)ODE:使能开路输出
(6)SPEED:设置速度
(7)DSE:设置驱动能力
(8)SRE:设置压摆率
4.GPIO配置
常用的寄存器如下:
(1)DR:指定输出高低电平
(2)GDIR:设置输入或输出
(3)PSR:用来读取GPIO当前高低电平状态
(4)ICR1:设置触发方式(高\低电平,上升\下降沿)
(5)ICR2:设置触发方式(高\低电平,上升\下降沿)
(6)EDGE_SEL:设置边沿中断
(7)IMR:控制GPIO中断是否打开
(8)ISR:中断标志位
重要代码分析:
ldr r0, =0X020E0068 /* 将寄存器 SW_MUX_GPIO1_IO03_BASE 加载到 r0 中 */
ldr r1, =0X5 /* 设置寄存器 SW_MUX_GPIO1_IO03_BASE 的 MUX_MODE 为 5 */
str r1,[r0]
因为这里是 bit5进行复用,所以是ldr r1, =0X5
ldr r0, =0X0209C004 /*寄存器 GPIO1_GDIR */
ldr r1, =0X0000008
str r1,[r0]
因为是 GPIO3,所以是 bit3为1,所以是:ldr r1, =0X0000008
到此为止,代码部分设计好之后,进行交叉编译环节
交叉编译
需要3个部分:
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
生成 led.o
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
将 led.o文件进行链接
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
生成“可执行”的二进制文件
代码烧写
sd烧入
通过自带的 件 imxdownload
./imxdownload led.bin /dev/sdd
遇见问题:
1.sd卡插入不显示
1.修改usb为3.0
2.在1之上还是不行则进行重启ubuntu和多次插拔sd卡
2.小灯不够亮
1.重新插入sd卡,然后启动
2.记得按一下复位按键