我正在开发一个包含 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 设计。 当然,我们可以解决这个问题,但我更愿意了解为什么会发生这种情况,这样它就不会在以后以其他形式咬我。
这是正常。
解决这一问题的标准方法是限定所有中断源,即使只有一个中断源。尽早清除导致中断的标志有助于避免“错误”条目,但即使发生这种情况也是无害的。
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
}