web-dev-qa-db-ja.com

構成されていない場合のSTM32WWDG割り込みの発生

ライセンスの問題のため、Keil IDEから移植して、GNUツールチェーンでビルドするアプリケーションがあります。正常にセットアップできましたが、デバイス上でアプリケーションをビルド、フラッシュ、実行します。

GNU側のアプリケーションは、何らかの理由で、無限ループであるWWDGの弱いリンクされたIRQハンドラーでスタックしています。アプリケーションはWWDGを有効にせず、で無効になります。デフォルトでリセットされます。また、構成レジスタがデフォルトの起動値になっていることも確認しました。

コンパイラ以外の唯一の違いは、リンカファイルとスタートアップファイルです。ただし、両方のスタートアップファイルと、両方のツールチェーンで使用されるリンカーファイルは、STMによってデフォルトで生成されます。

何がこれを引き起こしているのか考えていますか?私はここで私の知恵の終わりに近づいています。

Stm32f103XXを使用して、他の情報が役立つかどうかをお知らせください。

編集:以下のコメントを使用して、実際にトリガーされているのはHardFault_Handlerであることを確認できました。それが役立つかもしれない場合、私は以下のバックトレース出力を含めました

GDB BT:

0 HardFault_Handler()

1 (signal handler called)

2 0x720a3de in ?? ()

3 foo()の0x80005534

バックトレースが停止しました:前のフレームがこのフレームと同じです(スタックが破損していますか?)

gdbの専門家ではありませんが、2つのことが私には際立っています。 1)fooは関数ではなく、charのconst配列であり、2)0x0720a3deは有効なメモリアドレスではありません。フラッシュアドレス範囲は0x08000000から始まります。

18
gettingSmarter

だから、Dクルーガーによるズボンのキックに感謝します。 HardFault_Handlerが実際に呼び出されているものであることがわかりました。したがって、この投稿につまずいた人は、HardFaultなどの原因をカバーする一時的な関数を記述して、どのIRQが本当に呼び出されているかを確認してください。 IRQ呼び出しの真の問題は、次に解決しようとしているmemcpyによるメモリアクセスの不良です。

11
gettingSmarter

STM32CubeF3ライブラリ(v1.1.0)を使用してCooCox CoIDE 1.7.7でコンパイルするSTM32F3ディスカバリボードの例を移植すると、OPとまったく同じエラーが発生しました(見かけのWWDG割り込みですが、実際にはHardFault_Handlerが発生します)。割り込みを使用しない限り、コードは正常に実行されましたが、SysTickタイマー割り込みをオンにするとすぐに、HardFault例外が発生しました。

問題は、プロジェクトにstm32f3xx_it.hファイルとstm32f3xx_it.cファイルを含めることを怠っていたことです。それらがないため、コンパイラの警告/エラーは発生していません。それらがコンパイルされてリンクされると、割り込みのあるコードは正常に実行されました。

5
Bjarne Hansen

awilhite と同じ根本原因が原因で、この問題が発生しました。 Atollic TrueStudio8.0.0を使用しています。これを使用してSTM32F030のプロジェクトを開始し、ADC1_IRQn(NVICセットアップで使用されるIRQチャネル番号)を定義するstm32f0xx.hでライブラリフォルダーを(おそらく手動で)追加しました。

そして、main.cにADC1_IRQHandler(void)を実装しました(これまでのところ、これまでは常に機能していました-x_IRQn-> x_IRQHandler)

しかし、2日間のフラストレーションの後、私のプロジェクトのstartup_stm32f0xx.sがADC1_COMP_IRQHandlerを定義していることがわかりました。

そのため、最終的に、ADC割り込みハンドラーは未定義であり、ADCが割り込みを生成すると、プログラムがクラッシュしました(WWDG割り込み)。

これが、ハンドラーを実装したと思っているが実際には実装しなかった私のような人々に役立つことを願っています。

5
Mike

STM32F2XXプロセッサ用にSTM32CubeMXによって別々に生成された2つのプロジェクトをマージするときに、非常によく似た問題が発生しました。 1つのプロジェクトはイーサネット周辺機器を使用していましたが、もう1つのプロジェクトは使用していませんでした。その1つの違いに加えて、2つのプロジェクトは同じ周辺機器のセットを使用しました。

ファイルを手動でコピーして2つのプロジェクトを統合した後、アプリケーションは最初のタスクを開始した後(割り込みが初めて有効になったとき)にWWDG_IRQHandlerに入れられます。最初に、WWDGレジスタのWDGAビットが実際に設定されていないこと、したがってWWDGペリフェラルが無効になっていることを確認しました。次に、割り込みベクタテーブルが正しく初期化されていることを確認しました。最後に、数時間掘り下げた後、stm32f2xx_it.cでETH_IRQHandler関数を定義していなかったことに気付きました。これにより、イーサネット割り込みがデフォルトハンドラーによって処理され、WWDG_IRQHandlerとしてマスクされました。おそらく最適化が原因です。

3
awilhite

中心的な問題は、別のirqハンドラーの代わりにデフォルトハンドラーが呼び出されることです。私たちの状況が同じであるとは思えませんが、ここに私の解決策があります:

私はc ++プロジェクトに取り組んでいましたが、同じことが起こりました。ゼロからCMSISでプロジェクトを作ったのはこれが初めてでした。いくつかの試みが失敗した後、stm32xxxx_it.hでIRQハンドラー関数のプロトタイプがこれらによって保護されていることに気付いたときに、生成されたプロジェクトを実行しました。

extern "C"
{
    void TIM7_IRQHandler(void);
}

これらのガードを使用すると、リンカは独自の割り込みハンドラ関数を見つけることができます。

2
bmann