EXTI 中断在 STM32H7 上触发两次

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

我正在开发一个包含 STM32H723 的定制板。 我从 FPGA 获得了一个简单的信号,该信号以大约 50kHz 的频率脉冲几个 1us。 这连接到 IO 引脚。

我已经连接了一个中断 EXTI15_10_IRQHandler 以在上升沿触发。 在这个例程中,我增加了一个易失性变量并切换了一个 IO 引脚。 我也清除了 EXTI-PR1 寄存器中的挂起位。

#pragma GCC push_options
#pragma GCC optimize ("O2")

volatile unsigned int intspersec = 0;

void EXTI15_10_IRQHandler(void)
{
    SCOPE_DEBUG_0;      // Toggles external IO pin
    intspersec++;       // Count em 

    // NVIC_ClearPendingIRQ(EXTI15_10_IRQn); // Does not help 
    if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_14)) {
        LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_14);
    } // endif

    // Lets waste some time 
    for (volatile unsigned int n=0;n<1;n++) {

    } // endfor
    return; 
}

#pragma GCC pop_options

中断设置为下降沿,我已经验证将其更改为上升沿会产生预期的时序差异。

问题是上面的中断处理程序被执行了两次 - 请参阅范围镜头。 双重调用 顶部走线是调试 IO 引脚,而下部(模拟)是输入 PE14 引脚。

绝对奇怪的部分是,如果我像这样在 ISR 中浪费一点时间

    // Lets waste some time 
    for (volatile unsigned int n=0;n<2;n++) {

    } // endfor

我按预期得到了一次 ISR 调用...

我尝试过使用或不使用 ICache/DCache 等运行代码,但似乎没有产生任何一致的差异。

我们已经用 STM32 系列(F1、F4、G0、L0、L1..)完成了很多设计,但这是第一个 H7 设计。 当然,我们可以解决这个问题,但我更愿意了解为什么会发生这种情况,这样它就不会在以后以其他形式咬我。

c embedded stm32h7
1个回答
0
投票

这是正常

解决这一问题的标准方法是限定所有中断源,即使只有一个中断源。尽早清除导致中断的标志有助于避免“错误”条目,但即使发生这种情况也是无害的。

void EXTI15_10_IRQHandler(void) {

  // NVIC_ClearPendingIRQ(EXTI15_10_IRQn); // Does not help 
  if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_14)) {
    LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_14);
    SCOPE_DEBUG_0;      // Toggles external IO pin
    intspersec++;       // Count em 
  } // endif
}
© www.soinside.com 2019 - 2024. All rights reserved.