【问题标题】:Clearing pending EXTI interrupt in stm32f103清除 stm32f103 中未决的 EXTI 中断
【发布时间】: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


【解决方案1】:

可能是因为 TAMPER/RTC 第二个输出重定向到 PC13。在使用 PC13 作为 EXTI 之前,我也遇到过同样的问题。将 BKP_RTCCR->ASOE 设置为 1 以强制将其作为永远不会触发的警报输出,因为我没有设置任何 rtc 警报。

【讨论】:

  • 如果您不喜欢这个答案,您可以选择删除它,但请不要随意破坏它
  • 请不要破坏帖子。由于您尚未在该网站上注册,因此无法删除它。
【解决方案2】:

消除引脚上(过度)触发 EXTI 的电子噪声的最佳解决方案是改进硬件 - 但这是软件板,而不是 the electronic one

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

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

这两种基于 µC 的方法都很笨拙,显然不如开发好的硬件。这并不是说对于“好”的硬件,您不应该在软件中添加一些去抖动或噪声保护!

【讨论】:

  • 我尝试将输入拉低,所以逻辑电平没有改变,ISR仍然过触发。你认为这真的是来自去抖动的噪音吗?我将尝试使用计时器对输入进行采样。
  • 今天早些时候我对另一个答案发表评论时,我忽略了你对这个答案的评论。正如我所说,如果您只使用在 STM32 控制器中实现的“弱下拉”电阻,那么我不确定这是否足以稳定您的电子引脚电位 - 但我不是这方面的专家,而您应该问一些电子产品的人(或their SE)。
  • 我确实使用了“弱下拉”,我会检查出来的。谢谢。
  • 我刚刚检查了一个 STM32(不是你的)内部下拉强度,即 25/40/55 kOhm(Min/Typ/Max)。如果您有机会(焊接?)添加一个外部下拉电阻(电阻比内部电阻低,比如 10kOhm?),我会考虑这样做。
【解决方案3】:

正如@P__J__ 建议添加一些谴责逻辑。有两种去弹跳的方法,例如使用 RC 滤波器和使用软件去弹跳逻辑。 由于引脚上的噪声,ISR 不断执行。 你可以再检查一件事。 尝试向上/向下拉销并观察行为。如果 Pin 上的逻辑电平没有改变,则不应执行 ISR。

【讨论】:

  • 我尝试拉下输入,ISR 仍然过度触发。
  • 这可能是由于您“拉低输入”方式的电子特性,遗憾的是,我不是这方面的专家。但是我这边有一些疯狂的猜测:如果您只激活了内置下拉(而不是在我写下答案后的短时间内将一个焊接到您的 PCB,而不是获得新的 PCB 布局:-]) ,然后注意这被称为“弱”下拉,即使是 STM 文档。取决于引脚上发生的情况 - 下拉可能太弱了吗? ...好吧,请尝试修复电子设备(也许使用电子板的帮助)。我认为这会有所帮助。
猜你喜欢
  • 2021-03-31
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 2012-12-28
  • 1970-01-01
相关资源
最近更新 更多