一、普适的GPIO操作方法
1、enable Power/Clock control;
2、 pin的Mode;
3、Dir:output/input;
4、Data:1/0。
注:R/W Register:donot effect other bits.
二、GPIO寄存器的2种操作方法
原则:不能影响到其他位
a. 直接读写:读出、修改对应位、写入
要设置bit n:
val = data_reg;
val = val | (1
data_reg = val;
要清除bit n:
val = data_reg;
val = val & ~(1
data_reg = val;
b. set-and-clear protocol:
set_reg, clr_reg, data_reg 三个寄存器对应的是同一个物理寄存器,
要设置bit n:set_reg = (1
要清除bit n:clr_reg = (1
三、IMX6UL的GPIO操作方法
上图中IOMUXC(IO复用控制器)有两个作用:
(1)、MUX_MODE:选择pin功能;
(2)、pad settings:是否使用上下拉电阻,使用多大的电阻。
1、读GPIO:
(1)、设置CCM_CCGRx 寄存器中某位使能对应的GPIO 模块 // 默认是使能的,上图省略了
(2)、设置IOMUX 来选择引脚用于GPIO
(3)、设置GPIOx_GDIR 中某位为0,把该引脚设置为输入功能
(4)、读GPIOx_DR 或GPIOx_PSR 得到某位的值(读GPIOx_DR 返回的是GPIOx_PSR 的值)
2、写GPIO
(1)、设置CCM_CCGRx 寄存器中某位使能对应的GPIO 模块 // 默认是使能的,上图省略了
(2)、设置IOMUX 来选择引脚用于GPIO
(3)、设置GPIOx_GDIR 中某位为1,把该引脚设置为输出功能
(4)、写GPIOx_DR 某位的值
需要注意的是,你可以设置该引脚的loopback 功能,这样就可以从GPIOx_PSR 中读到引脚的有实电平;你从GPIOx_DR 中读回的只是上次设置的值,它并不能反应引脚的真实电平,比如可能因为硬件故障导致该引脚跟地短路了,你通过设置GPIOx_DR 让它输出高电平并不会起效果。