0

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/デバッガ (メモリ アドレス) 経由で読み取るにはどうすればよいかということです。そして、ここで何が起こっているのですか?誰かがこの動作を説明できますか?おそらくそれを修正する方法の手がかりがありますか?

ありがとう!

4

2 に答える 2

1

最初に ISR を入力し、もう一度ボタンを押すと [...]

これにより、EINT1フラグが再びトリガーされますが、最初にクリアした後です。それが理由です

NVIC_ClearPendingIRQ(EINT1_IRQn) は、新しい保留中の割り込みをクリアします

EINT1 はまだ割り込みラインにシグナルを送るため、機能しません。電話する必要があります

EXTI_ClearEXTIFlag(1);

このフラグをクリアするには、「作業」の後にもう一度。

于 2012-09-01T20:48:06.823 に答える
0

通常、このような長い割り込みルーチンを作成するのは得策ではないことはわかっています。しかし、質問で述べたように、これは意図されたものです。ISR 中にメイン タスクの他のコードが実行されないようにする必要があります。

しかし、質問に戻ると、他の誰かが、EXTI_ClearEXTIFlag(1) を ISR の最後に移動することをお勧めします。このようにして、外部割り込みは発生せず、ISR の実行中にペンディングを設定することもできません。これは機能しますが、保留中の割り込みのクリアが機能しない理由はまだ疑問に思っています。多分これは GPIO 割り込みに対してのみ機能しますか?

于 2012-08-30T07:42:17.230 に答える