OpenOCDでRead-out Protectionを解除する

ARM,OpenOCD,STM32

仕事の中で、ST-Link V2に搭載されてるSTM32F103CBT6を臨時で使わなければならなくなった。
こいつをひっぺがして、新たにプログラムを書き込もうってわけだけども、デバッグも書き込みもうまくいかない。

当然といえば当然ですが、Read-out Protectionがかけられていて読み書きができないようにされてるからでした。

しかし、こっちとしてはこれを使わざるをえないので無理矢理にでもその錠をこじ開けます(

STM32系のRead-out Protectionは3つのレベルが存在します。

レベル 解説
Level 0 読み取り、書き込み、消去すべての操作が可能。(初期状態)
Level 1 BOOT0=0でデバッガアクセスが検出されない時は、読み取り、書き込み、消去すべての操作が可能。BOOT0=1でデバッガアクセスが検出された時はブロックされる。
Level 2 JTAGインターフェースが無効になってるため、JTAG/SWDによるデバッグ、プログラミングは一切不可能。また、一度Level2に設定するとLevel1以下には戻せない。

と、このようになっています。
ST-Link V2に搭載されているSTM32F103CBT6は、Level 1で設定されていますので、ブロックを解除することは可能です。
Level2だったら死んでいた(

OpenOCD経由でプロテクトを解除する場合には、専用の設定ファイルを作ってやる必要があるようでです。

まず、OpenOCDのインストールディレクトリ内のscriptsディレクトリを開きます。
その中のいずれかのディレクトリに「ocd-unlock.cfg」などの名前のファイルを作成します。
ファイルの中身は以下のように記述します。

# Set RDP to level 1
init
reset halt
stm32f1x lock 0
reset halt
exit

私は

OpenOCD\scripts\test

ディレクトリに作成しました。

あとはOpenOCDの設定引数に

-f test/ocd-unlock.cfg

の一文を追加すればOKです。

これで通常通りのデバッグ、書き込みが可能になります。

ARM,OpenOCD,STM32

Posted by tsubakurame