stm32中不使用中断识别外部输入的下降沿之后翻转电平,再识别上升沿再翻转电平
时间: 2024-09-25 07:09:47 浏览: 46
在STM32中,如果想要避免因下降沿触发的中断频繁进入而导致的问题,可以采用非中断方式检测外部输入。这种方法通常用于读取状态变化,而不是依赖于中断。下面是操作流程:
1. **配置端口**:
使用`GPIO_Init()`函数初始化PA0到PA7作为输入模式,设置为浮空输入(Pull-up or Pull-down disabled),这样当按键按下时,其电位会变为低。
```c
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | ... | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 或 GPIO_Mode_IPD,取决于你的需求
GPIO_Init(GPIOA, &GPIO_InitStructure);
```
2. **读取并存储状态**:
定期轮询这些端口,如通过定时器周期性地检查电平变化,而不是等待中断。例如,你可以创建一个延时循环,在每次迭代中检查每个IO的状态。
```c
while (1) {
uint16_t key_state = GPIO_ReadInputDataBit(GPIOA); // 获取所有IO的状态
if ((key_state & GPIO_Pin_0) && !(prev_key_state & GPIO_Pin_0)) { // 检测PA0从高变低
// 处理PA0按下事件
}
prev_key_state = key_state; // 更新上次读取的状态
delay_ms(10); // 延迟一段时间以减少噪声影响
}
```
3. **翻转电平后再读取**:
如果你希望在按键释放后也处理,可以在检测到下降沿后,等待一段上升时间,确认真正的释放后再继续读取。这可以通过计数上升沿实现。
```c
// 在检测到下降沿后
uint8_t count = 0;
while (!GPIO_GetSpeedUpTimeFlag(GPIOA) && count < COUNT_THRESHOLD) {
++count; // 继续计数直到达到阈值或有上升沿
}
if (count >= COUNT_THRESHOLD) {
// 处理上升沿
// ...
}
```
阅读全文