1

私は現在 stm32l152 に取り組んでいます。

0x0800 0000私のブートアップ ベクター テーブルは、有効なリセット ハンドラー ベクターとスタック ポインターがあるflashにあります。残りの例外/割り込みベクトルは、単なる無限ループです。次に、RAM に別のベクター テーブルをセットアップします0x2000 0000。このベクター テーブルには、必要なすべてのベクターが含まれます。

私の問題は、にマップするメモリの再マップを行った後0x0000 00000x2000 0000割り込みが発生したときに、MCU がまだ のベクトルを探しているように見えることです0x0800 0000。フラッシュ テーブルの関連ベクトルを RAM テーブルの関連ベクトルに変更することで、これを確認しました。フラッシュ テーブルの関連ベクトルが無限ループを指している場合、プログラムは無限にループします。また、0x0000 00000x0800 00000x2000 0000.

次に、mcu の VTOR を変更する別の方法を使用して、ベクトル テーブルを オフセットします0x2000 0000。これで動作し、MCU は RAM 内のベクトルを見つけます。この方法では、上記のメモリの再マッピングは一切行っていないことに注意してください。

私の質問は: メモリの再マップを使用してベクター テーブルを再配置できますか (VTOR を変更せずに)?

メモリの再マッピングには他にどのような用途がありますか?

ランタイム中にフラッシュに書き込み0x0000 0000(フラッシュにマッピング0x0800 0000) してフラッシュを変更できますか?

4

1 に答える 1

0

おそらく、最初の試みでそれを正しく行ったでしょう。ただし、IDE によって提供される SystemInit() 関数は、サイレントに VTOR = 0x8000000 を設定するため、メモリの再マップ設定に関係なく、フラッシュの先頭にあるテーブルが使用されます。

于 2020-11-12T20:53:48.297 に答える