LPC17xx シリーズの外部割り込みで奇妙な問題に直面しています。
外部ボタンを外部割り込み 1 に設定し、両方の内部を外部プルアップ抵抗 (p2.11) として立ち下がりエッジに設定しました。
PinCfg.Funcnum = 1;
PinCfg.OpenDrain = 0;
PinCfg.Pinmode = PINSEL_PINMODE_PULLUP;
PinCfg.Pinnum = 11;
PinCfg.Portnum = 2;
PINSEL_ConfigPin(&PinCfg);
GPIO_SetDir(2,((uint32_t)1<<11),0);
と:
EXTICfg.EXTI_Line = EXTI_EINT1;
EXTICfg.EXTI_Mode = EXTI_MODE_EDGE_SENSITIVE;
EXTICfg.EXTI_polarity = EXTI_POLARITY_LOW_ACTIVE_OR_FALLING_EDGE;
EXTI_Config(&EXTICfg);
EXTI_ClearEXTIFlag(EXTI_EINT1);
と:
NVIC_SetPriority(EINT1_IRQn,1);
NVIC_EnableIRQ(EINT1_IRQn);
これは ISR の一部です (200 ミリ秒のボタン デバウンス タイマーを含む)。
void EINT1_IRQHandler(void)
{
EXTI_ClearEXTIFlag(1);
uint32_t tim1Cnt = LPC_TIM1->TC;
if (tim1Cnt > ButtDebounceUs)
{
LPC_TIM1->TC = 0x00000000;
// Do work here
}
}
"Do work here" セクションには時間がかかる場合があります (例: 場合によっては 200 ミリ秒以上)。これは意図されたものであり、プログラムをさらに実行するのに問題はありません。
問題は、ISR が最初に入力され、ISR の実行中にもう一度ボタンを押すと (これはすばやく行う必要があります)、保留中の割り込みが設定され、最初の割り込みが終了した場合に ISR が再度実行されることです。時間。EXTI_ClearEXTIFlag(1) は NVIC で保留中の割り込みをクリアしないため、これは私が推測する通常の動作です。そのため、NVIC_ClearPendingIRQ(EINT1_IRQn) を追加して、ISR コードのいくつかの場所で新しい保留中の割り込みをクリアし、保留中の割り込みが確実にクリアされるようにしました。奇妙なことに、これはまったく機能しません。
私の質問は、保留中の割り込みを JTAG/デバッガ (メモリ アドレス) 経由で読み取るにはどうすればよいかということです。そして、ここで何が起こっているのですか?誰かがこの動作を説明できますか?おそらくそれを修正する方法の手がかりがありますか?
ありがとう!