9

STM32F4 マイクロコントローラに ChibiOS 3.x プログラムがあり、IWDG ウォッチドッグを使用して、次のようなエラーで MCU をリセットします。

int main() {
    iwdgInit();
    iwdgStart(&IWDGD, &wd_cfg);
    while(true) {
        // ... do stuff
    }
}

ここでデバッガーを接続し、任意の時点でプログラムを (手動またはブレークポイント経由で) 停止すると、ウォッチドッグ構成で定義されたタイムアウト後にマイクロコントローラーがリセットされます (したがって、デバッグ プロセスで問題が発生します)。

この動作を無効にするにはどうすればよいですか?つまり、デバッガーが原因でコアが停止しているときに IWDG を無効にするにはどうすればよいですか?

完全に無効にしようとしましたが、不要な IWDG リセットをキャッチするために実行したままにする必要があります。

4

3 に答える 3

13

STM32 MCU には、デバッグ フリーズと呼ばれる機能が含まれています。I2C タイムアウト、RTC、そしてもちろんウォッチドッグなど、いくつかの周辺機器を停止できます。

STM32 リファレンス マニュアルのセクション 38.16.4ff「MCU デバッグ コンポーネント (DBGMCU)」を参照してください。

IWDG は APB1 バス上で動作しています。したがって、変更する必要があります。具体的には、そのレジスタDBGMCU_APB1_FZのビットをアサートします。DBG_IWDG_STOP

このレジスタの POR 値 (= デフォルト値) は 0x0 です。つまり、アクティブに無効にしない限り、IWDG は引き続き実行されます。

int main() {
    // Disable IWDG if core is halted
    DBGMCU->APB1FZ |= DBGMCU_APB1_FZ_DBG_IWDG_STOP;
    // Now we can enable the IWDG
    iwdgInit();
    iwdgStart(&IWDGD, &wd_cfg);
    // [...]
}

ソフトウェアでウォッチドッグを有効にしない場合でもWDG_SW、フラッシュ オプション バイトでビットがリセットされると、ハードウェアで有効になる可能性があることに注意してください。

ST HAL (ChibiOS には含まれていません。 STM32CubeF4 を参照してください)を使用している場合は、次のマクロも使用できます。

 __HAL_DBGMCU_FREEZE_IWDG();

(これは基本的に、上記とまったく同じことを行います)

また、 を呼び出す前に、APB2 で DBGMCU クロックを有効にする必要があります__HAL_DBGMCU_FREEZE_IWDG()

 __HAL_RCC_DBGMCU_CLK_ENABLE();
于 2015-09-11T22:18:31.230 に答える
7

ST HAL を使用する場合、使用する適切なマクロは次のとおりです。

__HAL_DBGMCU_FREEZE_IWDG()
于 2016-07-26T11:45:42.233 に答える