IARのC-SPYマクロでSTM32マイコンのライトプロテクトを解除する

やりたいこと

IAR EWARM環境でSTM32マイコンにプログラムをダウンロードするときに、STM32マイコンのライトプロテクトを自動的に解除する。

経緯

STM32マイコンの内蔵フラッシュメモリにはライトプロテクト機能があります。プロテクトがかかっていると、プログラムをダウンロードできません。

このライトプロテクト機能はSTMマイコンに固有の機能であるため、プロテクト解除にはメーカーが提供する専用のFlashツール STM32CubeProgrammer を使うのが一般的です。STM32CubeProgrammerはモダンなUIの分かりやすいツールで簡単にプロテクト解除ができます。(ライトプロテクト機能を司るオプションバイトを操作する画面があります。)

f:id:licheng:20210924172736p:plain:w480

しかし、STM32CubeProgrammerはST-LINK以外のデバッグプローブには対応していません。IAR EWARMでI-jet等のデバッグプローブを使用して開発している場合に、プロテクト解除のためだけにプローブを差し替えるのはいささか面倒です。IAR EWARMでプログラムをダウンロードする際に自動的にプロテクト解除できると便利です。

方法

IARのデバッガにはC-SPYマクロという機能があります。C-SPYマクロはC言語ライクな文法のマクロで、マイコンのメモリやペリフェラルレジスタを操作することもできます。C-SPYマクロを使えば、STM32マイコンのライトプロテクト解除を記述できます。また、プログラムのダウンロード時の処理もマイコンの型番ごとにC-SPYマクロで記述されています。ここにライトプロテクト解除を記述すれば良いのです。

C-SPYマクロについての詳細は「C-SPY デバッガガイド」を参照してください。

ライトプロテクトを解除するC-SPYマクロ

STM32マイコンのライトプロテクトは、オプションバイトと呼ばれる特別なペリフェラルレジスタの操作によって設定/解除されます。IARでは、STM32F4xxのオプションバイトをC-SPYマクロで操作するサンプルプロジェクトが用意されています。

IARのSTマイクロ用サンプルプロジェクトは、「ヘルプ」→「インフォメーションセンタ」→「サンプルプロジェクト」→「ST」からダウンロードできます。

f:id:licheng:20210927153327j:plain:w480

ダウンロード後、「ST」→「STM32F4xx」→「Option word programming」から目当てのプロジェクトを開けます。このプロジェクトに含まれる stm32_opt_bytes.mac に、オプションバイトを操作するC-SPYマクロが記述されています。

【参考】

プログラムのダウンロード時に実行されるマクロ

IAR EWARMからマイコンフラッシュメモリにプログラムをダウンロードする時、通常はまずフラッシュローダと呼ばれるプログラムをマイコンのRAMにダウンロードします。このとき所定のC-SPYマクロが実行されます。フラッシュローダとC-SPYマクロはマイコンの型番ごとに用意されています。「プロジェクト」→「オプション」→「デバッガ」→「ダウンロード」にそれらの設定があります。

f:id:licheng:20210924162914p:plain:w640

STM32マイコンの場合、デフォルトの設定ファイルおよびC-SPYマクロは、$TOOLKIT_DIR$\config\flashloader\ST\ にあります。$TOOLKIT_DIR$は、通常は C:\Program Files\IAR Systems\Embedded Workbench x.x\arm です。例えば STM32F401xE の場合、関連するファイルの以下の3つです。

  1. FlashSTM32F401xE.board (上記の設定画面で指定する.boardファイル)
  2. FlashSTM32F401xE.flash (1.で指定される.flashファイル)
  3. FlashSTM32F4xxx.mac (2.で指定されるC-SPYマクロファイル)

これらをコピーし、適宜修正して用います。 FlashSTM32F4xxx.mac で定義される execUserFlashInit() が、フラッシュローダをロードする直前に呼び出されるマクロです。このマクロの冒頭でライトプロテクト解除の処理を呼びます。

参考までに修正したファイルを掲げておきます。

注意点

オプションバイトの中のライトプロテクトを制御するビットはSTM32マイコンの型番によって異なります。リファレンスマニュアルの内蔵フラッシュメモリインタフェース(Embedded Flash memory interface)の章に記載があるので、よく読んで必要に応じてC-SPYマクロを修正してください。

まとめ

以上のようにかなり面倒なので、よほど頻繁でないならSTM32CubeProgrammerを使ってプロテクト解除すればよいと思います。