高知工科大 Advent Calendar 2017 3日目の記事です。
概要
- STM32F070xBの組み込みブートローダーを使って書き込む話。
- あとハマった話とかも。
環境
Windows 10
STM32F070RB
System workbench for STM32
STM32CubeMX 4.16.1
STM32CubeF0 1.6.0
Boot mode
STM32F0には三種類のBoot状態がある。
BOOT0 pinを操作することによりFlash起動かそれ以外かを切り替えることができる。
nBoot1 bitを操作することによりFlash起動じゃない場合に組み込みブートローダー(System memory)か内蔵SRAMか選択できる。
nBoot1 bitはOption ByteというFlash領域に存在する。(Main Flash memoryではない)
-
Main Flash memory
- 通常は Main Flash memoryで起動する。
- 動作としてはブートメモリ空間(0x0000 0000)にMain Flash Memory(0x0800 0000)がエイリアスされる。
-
System memory
- System memoryはSTM32系固有の組み込みBootLoader
- UART,I2C,DFU(USB)などを用いてFlash全領域を書き換え可能。
- System memory自体の書き換えはできない。
-
Embedded SRAM
- ブートメモリ空間(0x0000 0000)に内蔵SRAM(0x2000 0000)がエイリアスされる。
今回は組み込みBootloderであるSystem memoryを使うため、
nBoot1 bit = 1
BOOT0 pin = 1
となる。
nBoot1 bitは工場出荷時状態が1なのでそのままで良い。
BOOT0 pinはタクトスイッチで行うことにした。
組み込みBootloader
_AN2606 STM32 microcontroller system memory boot mode_を読むとマイコンのシリーズごとにSystem memoryの内容が異なることがわかる。
今回はSTM32F070xBを使用するので、その項目を見ると以下のようなbootloaderがある。
- USART1 bootloader
- USART2 bootloader
- USARTx bootloader
- I2C1 bootloader
- DFU bootloader
今回はUSBからFlashを書き換えたいのでDFU(Device Firmware Upgrade) bootloaderを使う。
書き込みファイル準備
PC側はSTMicroのDfuSeを用いて書き込む。
DfuSeから書き込む場合のファイル形式は*.dfuである必要があるので*.elfから変換する。
fw.elfが書き込みたいファイルだとする。
elfファイルから直接dfuに変換する方法は見つからなかったので、一旦intel HEXフォーマットにしてからdfuにする。
$ arm-none-eabi-objcopy -O ihex fw.elf fw.hex
DfuSeをインストールすると付属するDfu File Manegerを起動する。
S19 or Hexをクリックしfw.hexを選択する。
Generate をクリックするとdfuファイルが生成される。
書き込み
System memoryを起動した後、どうすればDFUが有効になるかわからないのでフローチャートを見てみる。
このフローチャートを見ると、USBがDetectすればいいことがわかる。要するにUSB挿せばDFUモードになる。
System memoryに入った状態のボードをPCに挿すとデバイスドライバのインストールが行われた。
DfuSeのAvailable Devicesを見ると STM32 Device in DFU Modeと表示されていた。
この状態でChoose...で生成したdfuファイルを選択し、Upgradeを押せば書き込みが完了する。
まとめ
- STM32F070xBで組み込みBootloaderから書き込むことができた。
ハマったこと
ハマったことを書いておく。
STM32F070xB のあるロットのSystem memoryの不具合
最初どうあがいてもSystem memoryが起動しなかった
STM32 ST-LINK UtilityでSystem memory(STM32F070xBの場合は0x1FFF C800)を見てみると明らかにベクターテーブルがおかしい
STM32F070xBのエラッタシートを見ても特に記載なし
いろいろ調べてみるとSTmicroのCommunity siteを見るとなにやら同じような状態の人がいる...
どうも動作しないBootloaderが焼かれたロットがあるらしいことが書いてあった
https://community.st.com/thread/18955?commentID=139468&et=watches.email.outcome#comment-139468
ハズレを引いたと思って、別の所で買いなおしたらあっさり解決。
HSEを外したら動かなくなった
クリスタル外したくて内部クロックにしたら動作しなくなった。
AN2606のNoteをちゃんと読むとSTM32F070xBの場合HSE(外部クロック)が存在しないとDFUのみ使えなくなるとのこと。
AN2606のNoteに書いてあるのでデータシートちゃんと読め案件。
でもSTM32F071xx/72xxは内部クロックでもDFUが動くよ!紛らわしいね!