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_Mode_OUT = 0x01,
GPIO_Mode_AF = 0x02,
GPIO_Mode_AN = 0x03
}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是一个目的,且效果相同。