1.普适的GPIO引脚操作方法
GPIO: General-purpose input/output,通用的输入输出口
1.1 GPIO模块一般结构
a. 有多组GPIO,每组有多个GPIO
b. 使能:电源/时钟 c. 模式(Mode):引脚可用于GPIO或其他功能
d. 方向:引脚Mode设置为GPIO时,可以继续设置它是输出引脚,还是输入引脚
e. 数值:对于输出引脚,可以设置寄存器让它输出高、低电平
对于输入引脚,可以读取寄存器得到引脚的当前电平
每组GPIO有多组引脚,每一个引脚又可能是连接UART,也有可能连接GPIO,所以说还要选择引脚的模式,除此之外选择引脚是输入还是输出功能,最后选择输出或输入高电平还是低电平。
对于这些步骤具体怎么操作呢。要读取寄存器。
1.2 GPIO寄存器操作
a. 芯片手册一般有相关章节,用来介绍:power/clock 可以设置对应寄存器使能某个GPIO模块(Module)有些芯片的GPIO是没有使能开关的,即它总是使能的
b. 一个引脚可以用于GPIO、串口、USB或其他功能, 有对应的寄存器来选择引脚的功能
c. 对于已经设置为GPIO功能的引脚,有方向寄存器用来设置它的方向:输出、输入
d. 对于已经设置为GPIO功能的引脚,有数据寄存器用来写、读引脚电平状态
GPIO寄存器的2种操作方法:
原则:不能影响到其他位
举个例子:
要输出1,data_reg则需要设置为1。则需要如下三个步骤。
直接读写:读出、修改对应位、写入
要设置bit n:
val = data_reg; val = val | (1<<n); data_reg = val;
要清除bit n:
val = data_reg; val = val & ~(1<<n); data_reg = val;
能不能直接data_reg=1?不能,这样的话你确实把data_reg设置为bit0=1了,但同时也把bit1=0,bit=0…了。违反了寄存器修改的原则。
更高效方法:
对于有些处理器,就有两个寄存器一个叫做set_reg的寄存器,一个叫做clr_reg的寄存器。设置寄存器set_reg=1,设置寄存器只有当某位等于1的时候才会有效果。所以当其位置不被设置为1,就不起作用。
再比如,让bit0=bit2=1,只需要set_reg=(1)|(1<<2);
让某一位清0。按照老办法你需要三步走,读,修改,写,现在有了clr_reg可以方便很多。如下:
上面的图意思是让第一位清0,其他位置不起作用。 同理让第一位和第三位清0:
上面这种方法就是set_and_clear proyocol.
set-and-clear protocol:
set_reg, clr_reg, data_reg
三个寄存器对应的是同一个物理寄存器,
要设置bit n:set_reg =(1<<n);
要清除bit n:clr_reg = (1<<n);
1.3 GPIO的其他功能:防抖动、中断、唤醒
后续章节再介绍