mySTM32way
STM32 的 GPIO 包括多个端口和引脚,每个端口包含一组连续的引脚。GPIO 引脚可以配置为输入、输出或复用功能,以满足不同的应用需求。
在 STM32 中,GPIO 以寄存器方式实现控制。对于每个端口,都有一组寄存器进行配置和控制。这些寄存器包括数据寄存器、输入状态寄存器、输出驱动器控制寄存器等等。
STM32 的 GPIO 具有以下特点:
支持不同的IO模式:GPIO模式、模拟模式、复用模式和中断模式。
高速和低功耗模式可选,可以根据应用场景选择适合的速率。
支持上下拉电阻,可以从硬件保护的角度来避免外部设备产生的过压或过流问题。
分类
STM32 的 GPIO 可以按照其性质分为以下几类:
通用输入输出GPIO
通用输入输出GPIO是STM32最常用的GPIO类型,它们可以用作一般输入或输出,实现常规GPIO的控制。通过配置CRH或CRL寄存器来设置GPIO的输入或输出模式。
复用输入输出GPIO
复用输入输出GPIO是用于支持STM32芯片的外围设备或者总线的,例如UART、SPI或I2C总线。复用输入输出GPIO通过与特殊功能寄存器AFIO结合使用,可以设置特殊功能寄存器的映射来使能特定功能。
模拟输入输出GPIO
模拟输入输出GPIO是用于连接模拟传感器和元件的,例如温度传感器、基准电压、微调电位器等。模拟输入输出GPIO没有数字输入/输出级别,因此只能处理模拟信号。
中断输入输出GPIO
中断输入输出GPIO是能够在输入状态改变时向CPU发出中断请求的GPIO。中断输入输出GPIO可以用于实现强实时应用程序的硬件剥夺。配置EXTI寄存器可设置引脚的边缘触发、屏蔽和优先级等属性。
总结
STM32 的 GPIO 提供了多种类型的 GPIO 端口,并为不同的应用场景提供了不同的配置选项,灵活性较高。开发者可以根据具体的应用需求和硬件平台选择合适的配置方式,并仔细配置相关参数,才能实现良好的控制效果。
以下的代码:
STM32 的 GPIO 工作模式:
推挽输出模式(GPIO_Mode_Out_PP)
推挽输出模式是 STM32 中最常用的输出模式之一,通常用于连接 LED 灯、驱动继电器等应用。在这种模式下,输出引脚可以设置为高电平或低电平,也可以被直接拉到 VCC 或 GND 上。
开漏输出模式(GPIO_Mode_Out_OD)
开漏输出模式是一种特殊的输出模式,主要用于连接一些需要共用线路的外设,例如 I2C、SPI 等。在这种模式下,输出引脚会被拉到 GND 上,此时需要通过外部上拉电阻将引脚拉到高电平。
浮空输入模式(GPIO_Mode_IN_FLOATING)
浮空输入模式是一种常见的输入模式之一,引脚内部没有上拉或下拉电阻,如果没有外部电路的干扰,引脚的电平将处于一个不确定的状态。
上拉输入模式(GPIO_Mode_IPU)
上拉输入模式是一种常用的输入模式,引脚内部集成了上拉电阻,并且默认上拉。一旦外部电路没有将引脚拉到 GND 上,引脚就会保持在高电平状态。
下拉输入模式(GPIO_Mode_IPD)
下拉输入模式与上拉输入模式相似,区别在于引脚内部集成了下拉电阻,并且默认下拉。如果没有外部电路将引脚拉到 VCC 上,引脚将保持在低电平状态。
此外,STM32 的 GPIO 外设还支持中断模式和模拟输入等其他功能,具体情况需要根据外设的需求进行配置。
在 STM32 开发中,需要根据具体的应用场景选择适当的 GPIO 工作模式,以满足不同的应用需求。同时,需要注意 GPIO 的配置参数、引脚的连接方式等,以避免出现不必要的错误和故障。
以下是使用 STM32 的 GPIO 模块控制 LED 灯的代码示例,其中主要涉及到推挽输出模式:
上面的代码演示了如何初始化一个 GPIO 引脚为推挽输出模式,并通过对其电平进行控制来实现 LED 灯的开关。在代码中,使用了串行外设 (RCC) 对 GPIOA 以及其时钟进行了初始化配置,并通过 GPIO_InitTypeDef 结构体对引脚进行了具体的配置,最后使用了 GPIO_SetBits() 和 GPIO_ResetBits() 函数来控制引脚的电平。
需要注意的是,上述代码中使用了 delay_ms() 函数来进行时间延迟,这个函数需要根据具体的环境和需求进行实现。同时,在实际开发中还需要根据具体的应用场景选择适当的 GPIO 工作模式,以满足不同的应用需求。
下面是使用 STM32 的 GPIO 模块连接按键并实现中断功能的代码示例,其中主要涉及到上拉输入模式和中断模式:
上面的代码演示了如何初始化一个 GPIO 引脚为上拉输入模式,并通过 EXTI 模块实现对按键的中断控制。在代码中,使用了串行外设 (RCC) 对 GPIOA、AFIO 以及其时钟进行了初始化配置,并通过 GPIO_InitTypeDef 结构体对引脚进行了具体的配置,在 EXTI_InitTypeDef 结构体中对中断线进行了配置,在 NVIC_InitTypeDef 结构体中对中断向量表进行了配置,最后在主函数中等待按键的中断触发。