【发布时间】:2020-08-15 09:39:56
【问题描述】:
我正在尝试通过切换 PC14 来切换 PC13 上的 LED,问题是中断处理程序在不切换 PC14 的情况下一直被调用,并且未使用 EXTI->PR 寄存器清除挂起的中断,也没有使用手动清除调试器。我也尝试在 NVIC->ICPR 中清除它,我不确定为什么有两个寄存器用于清除相同的中断。
这是我的代码
你可以在
https://github.com/AymenSekhri/tinyHAL-STM32f103/tree/master/STM32F103-HAL/tinyHAL
/*
* Description:
* Toggle LED at C13 whenever C14 goes from HIGH to LOW.
*
*/
#include "tinyHAL/stm32f103_hal.h"
int main(){
//Enable AFIO clock from RCC
enablePeripheralClock(Peripheral_AFIO);
//Enable and configure C13 & C14
enablePeripheralClock(Peripheral_GPIOC);
configureGPIO(Peripheral_GPIOC, 13, GPIO_MODE_OUT_50MHZ, GPIO_CONF_OUT_PUSHPULL);
configureGPIO(Peripheral_GPIOC, 14, GPIO_MODE_IN, GPIO_CONF_IN_PUSHUP_PULLDOWN);
//Link EXTI14 to C14
AFIO->EXTICR[3] = (AFIO->EXTICR[3] & ~(0xF<<8)) | 2;
//Configure inturrput at EXTI14 falling edge
EXTI->FTSR |= 1<<14;
//Unmask interrupt 40 (EXTI10-15)
EXTI->IMR |= 1<<14;
//Set Priority to interrupt 40 (EXTI10-15)
NVIC->IP[40] |= 0x10;
//Enable interrupt 40 (EXTI10-15)
NVIC->ISER[40>>5] |= (1 << (40&0x1F));
while(1);
}
void EXTI15_10_IRQHandler(void){
toggleGPIOBit(Peripheral_GPIOC, 13);
if (EXTI->PR & (1 << 14)){
EXTI->PR |= (1 << 14);
}
//NVIC->ICPR[40>>5] |= (1 << (40&0x1F));
__COMPILER_BARRIER();
}
【问题讨论】:
-
搜索“去抖动”。一般来说,使用 EXTI 整数作为 buttond 是个坏主意。
-
这并不能解释为什么即使输入固定为 HIGH 或 LOW 也会调用 ISR,是吗?
-
我不回答这个问题。
-
作为一个快速评论,我刚刚遇到了完全相同的问题。事实证明,问题在于我没有激活 SYSCFG 组件的时钟,这使得请求几乎立即被重新激活。它与电噪声无关,因为 STM32 Nucleo 板的用户按钮连接了电阻器和电容器来解决此问题。
标签: stm32 interrupt-handling stm32f1