清除stm32f103中的待定EXTI中断。

问题描述 投票:0回答:1

我试图通过切换PC14来切换PC13上的LED,问题是在没有切换PC14的情况下,中断处理程序一直被调用,而且没有使用EXTI->PR寄存器清除待定的中断,也没有使用调试器手动清除。我试着在NVIC->ICPR中也清除它,我不知道为什么有两个寄存器来清除同一个中断,这是我的代码,你可以在下面找到头。https:/github.comAymenSekhritinyHAL-STM32f103treemasterSTM32F103-HALtinyHAL。

/* 
* 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();
}
stm32 interrupt-handling stm32f1
1个回答
1
投票

要消除(过)触发你的EXTI的引脚处的电子噪声,最好的解决办法是改进硬件--但这是软件板,不是。电子版.

如果你有一个TIM通道连接到该引脚,我会建议使用它来过滤进入的信号。但我认为PC14没有定时器。

第二好的解决方案(这也是已经开始变通的地方!)是使用一个定时器(TIM,而不是它的通道),或者建立一个周期性的时间基础来对引脚进行采样(通过DMA或ISR,并将采样送入基于软件的滤波......)--或者停用EXTI ISR中的EXTI中断,启动定时器,并在定时器过期时重新激活EXTI中断。

这两种基于μC的方法都很笨拙,显然不如开发一个好的硬件。这并不是说有了一个 "好 "的硬件,就不应该在软件中添加一些debouncing或噪声保护。


1
投票

就像@P__J__建议的那样,加入一些去弹逻辑。有两种方法可以去弹,比如告RC滤波器和使用软件去弹逻辑。由于引脚上的噪声,ISR被持续执行,你可以再检查一下。你可以再检查一下,试着拉低引脚并观察其行为。如果引脚上的逻辑电平没有变化,ISR应该不会被执行。

© www.soinside.com 2019 - 2024. All rights reserved.