stm32读取gpio口高低电平次数
时间: 2025-05-17 09:27:10 浏览: 36
### STM32 中统计 GPIO 口高低电平变化次数的方法
为了实现统计 GPIO 口高低电平变化次数的功能,可以采用中断或者轮询的方式。以下是基于中断方式的解决方案:
#### 使用 EXTI (External Interrupt) 实现 GPIO 边沿检测
STM32 的每个 GPIO 引脚都可以配置为外部中断源,通过设置上升沿触发、下降沿触发或双边沿触发来捕捉电平的变化。
##### 配置步骤说明
1. **使能时钟**:开启对应 GPIO 和 SYSCFG 外设的时钟。
2. **初始化 GPIO**:将目标引脚配置为输入模式(如浮空输入[^3]),并启用其作为外部中断线。
3. **EXTI 初始化**:配置 EXTI 控制器以监听指定边沿事件。
4. **NVIC 设置**:在 NVIC 中优先级控制器中注册对应的中断向量,并允许该中断。
5. **编写中断服务程序**:每次进入中断处理函数时增加计数值。
##### 示例代码
以下是一个完整的示例代码片段用于统计 PA0 引脚上的高低电平切换次数:
```c
#include "stm32f1xx_hal.h"
volatile uint32_t edge_count = 0;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
// 中断服务例程
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if(GPIO_Pin == GPIO_PIN_0){ // 判断是否是PA0产生的中断
edge_count++; // 增加边缘计数变量
}
}
int main(void){
HAL_Init();
SystemClock_Config(); // 系统时钟配置
MX_GPIO_Init(); // GPIO初始化
while(1){
__asm volatile ("nop"); // 主循环等待中断发生
}
}
/**
* @brief GPIO Initialization Function
*/
static void MX_GPIO_Init(void){
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 启用GPIOA和SYSCFG外设时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_AFIO_CLK_ENABLE();
// 配置PA0为浮空输入模式
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 将PA0连接至EXTI线路0
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
HAL_SYSCFG_EnableEXTI(GPIO_PIN_0);
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
// 配置EXTI线上升/下降沿触发
__HAL_GPIO_EXTI_RISING_EDGE_TRIGGER_SELECTION(GPIO_PIN_0);
}
```
上述代码实现了对 `PA0` 引脚上发生的任何一次高低电平转换进行记录,并存储于全局变量 `edge_count` 中[^1]。
#### 轮询方法替代方案
如果不需要实时响应,则可以通过周期性读取状态并与前次保存的状态比较得出是否有改变。这种方法简单但可能错过快速连续翻转的情况。
---
阅读全文
相关推荐




















