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; }
posted @ 2022-02-08 21:36  slyuan  阅读(632)  评论(0编辑  收藏  举报