2020年10月18日

STM32: Flash書き込み時にマイコンを判別してから書込む方法 2020/10

STM32: Flash書き込み時にマイコンを判別してから書込む方法 2020/10
経緯:
事件発生、
(1) Nucleo-F030R8ボードにNucleo-F411REのHEXファイルを誤って書き込んで、
    Nucleo-F030R8ボードを壊した。orz
(2) そのすぐ後にSTM32VLDiscoveryボードに今度は恐らくNucleo-F030R8のHEXファイルを
    誤って書き込んで、
    STM32VLDiscoveryボードを壊した。 orz
原因:
    Makefile中に以下のターゲットを作って
w: all
    st-link_cli.exe -c SWD -P $(TARGET).hex -Rst 
> make w で、お気楽極楽にコンパイルと書き込みを行っていたのが原因。 Nucleoボードでは、さらに、
w: all
    cp $(TARGET).bin /d
の様にドライブへのコピーだけで書けてしまう。こっちも同様に危険。 対策: st-link_cli.exeのオプションを見ても 「マイコンの品種(family)をチェックして違っていたら書き込まない」 というのが見つからなかったのでMakefile中にチェック機構を追加することにした。 mbedのcliなどは似たようなことをやっていた気がするが忘れた。 前提: 上記 st-link_cli.exeを含む「ST-Link Utility」は将来「STM32CubeProg」に置き換えられるのは明らかなので、 今後はSTM32CubeProg中に含まれるFlash書込み用 コマンドライン・プログラム 「STM32_Programmer_CLI.exe」を使うことにする。 これを使って、 > make w と打って(ビルドと)Flash書き込みを行う時の対策とする。 STM32_Programmer_CLI.exeの出力: Nucleo/DiscoveryボードをUSB接続して、 > STM32_Programmer_CLI.exe -c port=SWD を実行するとNucleo-F411reの場合、
...
Board       : --
Voltage     : 3.25V
SWD freq    : 4000 KHz
Connect mode: Normal
Reset mode  : Software reset
Device ID   : 0x431
Revision ID : Rev A
Device name: STM32F411xC/E
Flash size  : 512 KBytes
Device type : MCU
Device CPU  : Cortex-M4
STM32F4Discoveryを繋いだ時は、
...
Board       : --
Voltage     : 2.89V
SWD freq    : 4000 KHz
Connect mode: Normal
Reset mode  : Software reset
Device ID   : 0x413
Revision ID : Rev Z
Device name : STM32F405xx/F407xx/F415xx/F417xx
Flash size  : 1 MBytes (default)
Device type : MCU
Device CPU  : Cortex-M4
という出力になるので「Device name」以降の文字列を「マイコン特定文字列」としてMakefile中で 照合することで誤書込みを防止する。 方法: 前述のMakefile中の書き込みターゲット「w」は以下のように書ける。 Linux/Unixツールズの「grepコマンド」が必要。
# Write to Flash
ST_PROGM_CLI_EXE = "d:/STM32CubeProgrammer/bin/STM32_Programmer_CLI.exe"
DEV_INFO = $(shell $(ST_PROGM_CLI_EXE) -c port=SWD | grep -i "device name")

w: all
ifneq (,$(findstring $(DEV_NAME), $(DEV_INFO)))
	@echo Device = $(DEV_NAME)
	$(ST_PROGM_CLI_EXE) -c port=SWD -d $(BINHEX_DIR)/$(TARGET).hex -Rst
else
	@echo $(DEV_INFO)
	@echo Device = ???? $(DEV_NAME)
endif 
使い方: 例えば、上記Makefileのどこかに、 Nucleo-F411reの場合、DEV_NAME = F411 STM32F4Discoveryの場合、DEV_NAME = F407 を追加して>make wを実行すれば、 「Flashに書き込む前にデバイス名(Device name)の照合(注) を行い、正しいデバイスなら書き込む」 という動作となる。 (注) 上記 "Device name:"以降の黄色文字列ならどの部分でも一致し照合OKと判断する。
posted by Copyright (C) avrin All Rights Reserved. at 19:27| Comment(0) | ARM系 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。