STM32 GPIO详解
STM32 GPIO
1. IO口模式
输入 | 输出 | ||
---|---|---|---|
浮空输入 | GPIO_Mode_AIN | 开漏输出 | GPIO_Mode_Out_PP |
上拉输入 | GPIO_Mode_IN_FLOATING | 推挽输出 | GPIO_Mode_Out_OD |
下拉输入 | GPIO_Mode_IPD | 推挽式复用功能 | GPIO_Mode_AF_PP |
模拟输入 | GPIO_Mode_IPU | 开漏复用功能 | GPIO_Mode_AF_OD |
浮空输入:什么电阻都不接,由施密特触发器输入,输入阻抗较大,为一个不确定的值,通常作为IIC,USART等通讯协议的接收端;
上拉输入:接入上拉电阻输入数字信号1;
下拉输入:接入下拉电阻输入数字信号0;
模拟输入:主要是用于ADC外设的输入;
开漏输出:无法真正输出高电平,即高电平没有驱动能力,需要借助外部上拉电阻完成对外驱动。
推挽输出:线路经过一个类似CMOS反相器的电路单元,要输出大电流一般采用这种输出方式,例如点亮LED灯。
推挽复用和开漏复用:可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)。
注:开漏输出可以实现“线与”功能。
“线与”:多个信号线直接连在一起,所有信号线为高电平时,合在一起的总线为高电平;只要有任意一个是低电平,总线就是低电平。
推挽输出就没有这个功能,如果高低电平连在一起,就会出现电流倒灌,损坏器件。推挽输出的最大优点就是可以真正的输出高电平和低电平,在两种电平下都有驱动能力。
2. IO口的寄存器
每个IO口都有七个寄存器来控制。
2个32位配置模式的端口配置寄存器CRL和CRH;
2个32位的数据寄存器IDR和ODR;
1个32位的置位/复位寄存器BSRR;
1个16位的复位寄存器BRR;
1个32位的锁存寄存器LCKR;
对于寄存器CRL来讲有32位,因为每一个IO口要用4个位来控制,所以CRL可以控制8个IO口。所以CRL配置0-7的IO口,CRH来配置8-15的IO口。
在寄存器中从最低位开始,首先时MODE然后是CNF,再然后是MODE,以此类推。
MODE有两位,CNF有两位。
MODE[1:0] |
---|
00:输入模式(复位后的状态) |
01:输出模式,最大速度10MHz |
10:输出模式,最大速度2MHz |
11:输出模式,最大速度50MHz |
CNF[1:0] |
---|
在输入模式下(MODE[1:0]=00) |
00:模拟输入模式 |
01:浮空输入模式(复位后的状态) |
10:上拉、下拉输入模式 |
11:保留 |
在输出模式(MODE[1:0]>00) |
00:通用推挽输出模式 |
01:通用开漏输出模式 |
10:复用功能推挽输出模式 |
11:复用功能开漏输出模式 |
该寄存器的复位值时0x4444 4444。可以发现复位值就是配置端口为浮空输入模式。
3. 示例代码
//IO方向设置
//GPIOA->CRL &= 0xFFFFFFF0; 指的是将PA0这个引脚配置复位清零
//GPIOA->CRL|=8<<0; 指的是将PA0这个引脚配置为输入模式的上拉、下拉输入模式
#define MPU_SDA_IN() {GPIOA->CRL &= 0xFFFFFFF0; GPIOA->CRL|=8<<0; }
//GPIOA->CRL|=8<<0; 指的是将PA0这个引脚配置为输出模式下的通用推挽输出模式
#define MPU_SDA_OUT() {GPIOA->CRL &= 0xFFFFFFF0; GPIOA->CRL|=3<<0; }