STM32-GPIO详解

STM32-GPIO配置介绍

typedef struct 
{
    
    
 	uint32_t GPIO_Pin;
    GPIOMode_TypeDef GPIO_Mode; 
    GPIOSpeed_TypeDef GPIO_Speed; 
    GPIOOType_TypeDef GPIO_OType; 
    GPIOPuPd_TypeDef GPIO_PuPd; 
}GPIO_InitTypeDef;

下面将对每个结构体成员解释如何配置

GPIO_Pin :

直观点说就是针对每个IO口的,对这个成员的配置相当于一个对IO口的定位

GPIO_Mode :

 typedef enum
{
    
     
  GPIO_Mode_IN   = 0x00, /*!< GPIO Input Mode */
  GPIO_Mode_OUT  = 0x01, /*!< GPIO Output Mode */
  GPIO_Mode_AF   = 0x02, /*!< GPIO Alternate function Mode */
  GPIO_Mode_AN   = 0x03  /*!< GPIO Analog Mode */
}GPIOMode_TypeDef;

IN模式常用在按键输入
OUT模式常用在跑马灯,蜂鸣器
AF就是复用成其他的外设不再作为一个普通的仅作输入输出的IO口使用
AN模式就是针对复用为ADC,DAC时使用

GPIO_Speed :

当STM32的GPIO端口设置为输出模式时,有多种速度可以选择,这个速度是指I/O口驱动电路的速度,是用来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当你不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。
当然如果你要输出较高频率的信号,但却选用了较低频率的驱动模块,你很可能会得到失真的输出信号。实际上芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路。

我们配置这个结构体成员的关键是根据实际应用来选择的,举个例子
对于串口,假如最大波特率只需115200,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。
对于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。
对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。

GPIO_OType :

typedef enum
{
    
     
  GPIO_OType_PP = 0x00,
  GPIO_OType_OD = 0x01
}GPIOOType_TypeDef;

推挽输出模式一般应用在输出电平为0和3.3伏而且需要高速切换开关状态的场合。在STM32的应用中,除了必须用开漏模式的场合,我们都习惯使用推挽输出模式。

开漏输出一般应用在I2C、SMBUS通讯等需要“线与”功能的总线电路中。除此之外,还用在电平不匹配的场合,如需要输出5伏的高电平,就可以在外部接一个上拉电阻,上拉电源为5伏,并且把GPIO设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出5伏的电平。

简单的来说,推挽输出用于控制,开漏输出用于大电流驱动。

GPIO_PuPd :

typedef enum
{
    
     
  GPIO_PuPd_NOPULL = 0x00,
  GPIO_PuPd_UP     = 0x01,
  GPIO_PuPd_DOWN   = 0x02
}GPIOPuPd_TypeDef;

如果是output,那个一般选择no pull,这样,引脚才能根据你的output数据,进行正确输出。

如果是input,那么需要看具体应用的默认输入值是0还是1. 如果默认是输入0,则最好配置为pull down,反之则配置为pull up. 这样做,主要是为了外部电路在没有上下拉的情况下,出现不确定情况。有许多硬件工程师设计电路时,会在GPIO口的外部设计上下拉电阻,这和内部配置pull up/down是一个目的,且效果相同。

猜你喜欢

转载自blog.csdn.net/Programmer_jzm/article/details/114984304