目录
1.GPIO配置寄存器(GPIOx_CRL, GPIOx_CRH)
一、参考文章
1.介绍了GPIO管脚的分类
2.介绍了GPIO八种工作模式原理,有电路图详解
GPIO输入输出模式原理(八种工作方式附电路图详解)_gpio四种输入输出模式-CSDN博客
3.介绍了上下拉电阻的作用,三极管驱动电路,三种电流的定义
上、下拉电阻(定义、强弱上拉、常见作用、吸电流、拉电流、灌电流)_弱上拉和强上拉的区别-CSDN博客
4.介绍了BSRR和BRR寄存器的作用
关于STM32的BSRR(端口位设置/清除寄存器) 和 BRR(端口位清除寄存器) 的理解(初学32)-CSDN博客
二、GPIO相关寄存器
I/0端口寄存器必须按32位字被访问;
1.GPIO配置寄存器(GPIOx_CRL, GPIOx_CRH)
Control Register High/Low
- MODEy:MODE=00时为输入模式,MODE>00时为输出模式。在MODE>00时,MODE三种值对应三种不同的输出速度。输出模式需要配置输出速度,输入模式可以不配置。
- CNFy:MODE=00时,CNFy四种值对应四种输入模式;MODE>00时,CNFy四种值对应四种输出模式。共计八种。
2.端口输入数据寄存器(GPIOx_IDR)
Input Data Register
- IDRy:表示端口每一位的输入电平状态,为可读。
3.端口输出数据寄存器(GPIOx_ODR)
Output Data Register
- ODRy: 表示端口每一位的输出电平状态,为可读可写。
4.端口位设置/清除寄存器(GPIOx_BSRR)
Bits Set Reset Register
- Bsy:低16位为端口位设置功能,低16位为0时不影响输出数据寄存器,为1时则输出数据寄存器对应位数也为1;
- BRy:高16位为端口位清除功能,高16位为0时不影响输出数据寄存器,为1时则输出数据寄存器对应位数也为0;
- 作用:
5.端口位清除寄存器(GPIOx_BRR)
Bits Reset Register
- BRy:低16位为位置位清除功能,低16位为0时不影响输出数据寄存器,为1时则输出数据寄存器对应位数也为0;
6.端口配置锁定寄存器(GPIOx_LCKR)
Local Key Register
- LCKy:只能在LCKK位为0时写入,当为1时锁定对应端口的配置,即控制寄存器(CRH和CRL)中响应的四位。
三、GPIO电路结构和各种工作模式
以下是GPIO的电路结构特点
以下为GPIO的八种工作模式
1.输入模式
- 输出缓冲器被禁止 ,即输出被禁止;施密特触发器打开,触发器可以保持输入信号的稳定。
- 可读取输入数据寄存器GPIOx_IDR。
- 可以配置为上拉、下拉、浮空模式,上拉下拉是为了让GPIO有一个默认的电平,浮空时GPIO的电平是不确定的会浮动。
2.输出模式
- 输出缓冲器被允许 ,输出被允许;施密特触发器打开;输出数据寄存器GPIOx_ODR可以控制I/O输出高低电平。
- 开漏模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态(PMOS从不被激活)。
- 推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。(N-MOS为高电平导通,P-MOS为低电平导通,因为输出数据寄存器到MOS管之间有一个取反器,所以逻辑是反的)。
- 弱上拉和下拉电阻被禁止。
- 可读取输入数据寄存器
- 开漏模式:对输入数据寄存器的读访问可得到I/O状态 。
- 推挽模式:对输出数据寄存器的读访问得到最后一次写的值。
- 输出速度可配置,为2/25/50MHz,支持的频率越高,功耗越大。
3.复用模式
- 输出缓冲器被允许 ,输出被允许;施密特触发器打开;
- 弱上拉和下拉电阻被禁止
- 可读取输入数据寄存器,输出信号源于其他外设,输出数据寄存器无效;
- 开漏模式:读输入数据寄存器时可得到I/O口状态
- 推挽模式:读输出数据寄存器时可得到最后一次写的值
- 输出速度可配置,为2/25/50MHz,支持的频率越高,功耗越大。
4.模拟输入模式
- 输出缓冲器被禁止 ,即输出被禁止;施密特触发器禁止输入,输出值被强制为0,所以输入数据寄存器读取到的值为‘0’。
四、外设的GPIO配置
当使用某种外设时,不知道配置GPIO为哪种工作方式时;
可以参考手册,不一定会准,只能当一个参考,只展示了一部分。
五、模式用途
1.模拟输入
ADC采集,输入的是模拟信号。
2.上/下拉输入
按键检测
第一个按键,按键按下时 GPIO接VCC,此时GPIO口的电平应该是3.3V,则软件通过检测IO口是否为高电平时来判断按键是否按下。为了防止按键误触发,将GPIO配置成下拉模式。
则GPIO的默认电平为低电平,当GPIO的电平变成高电平时表明按键被按下了。
下面三个按键,按键按下时GPIO接地,此时GPIO口的电平应该是0V,则软件可以通过检测IO口是否为低电平时来判断按键是否按下。为了防止按键误触发,将GPIO配置成上拉模式。
则GPIO的默认电平为高电平,当GPIO的电平变成低电平时表明按键被按下了。
3. 推挽输出
可以输出高、低电平。导通损耗小、效率高。既提高电路的负载能力,又提高开关速度,广泛应用各种实验。
4.开漏输出
IO 输出 0 接 GND,IO 输出 1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为 1 时,IO 口的状态由上拉电阻拉高电平。
这样 IO 口也就可以由外部电路改变为低电平或不变,该模式适用于电平不匹配场合、适合做电流型的驱动,吸收电流能力比较强。(如软件IIC)
六、总结
1.外接上拉电阻可以增强单片机引脚的驱动能力
在STM32芯片中,内部上拉电阻通常被设计为低功耗和高阻抗,以适应大多数标准应用的需求。所以GPIO内置的上拉电阻较大,导致该电阻的电流较小,进而使得驱动能力较弱。
外接一个阻值较小的上拉电阻,两个电阻并联从而总电阻值减小,输出电流增大,驱动能力相应增强。
2.TTL施密特触发器的作用
可以根据输入信号的变化,产生稳态的脉冲信号(非0即1)。输入信号幅度大于阈值时输出1,小于阈值时输出0.
具有滞回特性,即当输入信号在某一阈值附近波动时,输出信号能够保持稳定,不会因微小的输入信号变化而频繁翻转,具有较好的抗干扰能力。简单来说,可以避免误触发现象的出现,避免输入信号出现尖脉冲导致误触发。
3.P-MOS和N-MOS的作用
在推挽输出时,P-MOS和N-MOS只有一个会导通,无非是和VDD或者VSS导通。这意味着GPIO直接和VDD或者VSS连接,可以认为上拉电阻和下拉电阻全部为0Ω,可以输出强高低电平。
MOS管内部电阻很小,导通时间快,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。
在开漏输出时,只利用到了N-MOS,而P-MOS没被激活,分析与上面一样,该种工作模式下,只能输出强低电平。若是需要输出强高电平则需要在外部电路外接一个阻值较小的上拉电阻。
4.开漏输出和推挽输出的区别
- 开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极。适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);
- 推挽输出:可以输出强高、低电平,连接数字器件。
关于推挽输出和开漏输出,最后用一幅最简单的图形来概括:
左边是推挽输出模式;右边为开漏输出模式,需要接上拉;
- 比较器输出高电平时下面的PNP三极管截止,而上面NPN三极管导通,输出电平VS+;
- 比较器输出低电平时则恰恰相反,PNP三极管导通,输出和地相连,为低电平。
七、代码
GPIO初始化
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE); //使能端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x; //引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOx, &GPIO_InitStructure); //初始化端口
八种工作模式选择
typedef enum
{ GPIO_Mode_AIN = 0x0, //模拟输入
GPIO_Mode_IN_FLOATING = 0x04, //浮空输入
GPIO_Mode_IPD = 0x28, //下拉输入
GPIO_Mode_IPU = 0x48, //上拉输入
GPIO_Mode_Out_OD = 0x14, //开漏输出
GPIO_Mode_Out_PP = 0x10, //通用推挽输出
GPIO_Mode_AF_OD = 0x1C, //复用开漏输出
GPIO_Mode_AF_PP = 0x18 //复用推挽
}GPIOMode_TypeDef;