STM32的每个I/O口都由7个寄存器控制:2个32位端口配置寄存器CRL和CRH;2个32位的数据寄存器IDR和ODR;1个32位的置位复位寄存器BSRR;1个16位的复位寄存器BRR;1个32位的锁存寄存器LCKR;
而我们最常用的有4个:CRL/CRH/IDR/ODR;所以一般情况下我们只要配置这四个is OK。而CRH和CRL作用是完全一样的,CRH用于控制GPIOX(X表示A---G)的高8位(Pin15---Pin8),而CRL用于控制GPIOX(X表示A---G)的低8位(Pin7----Pin0)。每个模式的pin脚设置需要4bit来完成,即MODE[1:0]负责设置模式位,CNF[1:0]负责设置配置位。
首先,用到哪个IO使能哪组IO时钟,使能GPIO对应的时钟,RCC->APB2ENR|=1<<2; // 使能PORTA时钟(后续会提到),其次是配置其工作模式, GPIO的八种工作模式:
1、浮空输入GPIO_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
2、带上拉输入GPIO_IPU——IO内部上拉电阻输入
3、带下拉输入GPIO_IPD——IO内部下拉电阻输入
4、模拟输入GPIO_AIN ——应用ADC模拟输入,或者低功耗下省电
5、开漏输出GPIO_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能
6、推挽输出GPIO_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
7、复用功能的推挽输出GPIO_AF_PP ——片内外设功能(I2C的SCL,SDA)
8、复用功能的开漏输出GPIO_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)
see a example:GPIOC->CRL&=0XFFFF0FFF; //清除PC3该位原来的设置
GPIOC->CRL|=0X00008000; //设置下拉输入
GPIOC->ODR==0<<3; //ODR暂存将从端口发送的数据为0,即输出低
GPIOC->IDR==0<<3; //外部输入为0