LoginSignup
6

More than 5 years have passed since last update.

posted at

updated at

STM32F070xBで組み込みBootloaderを使って書き込んでみる

高知工科大 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ではない)
boot_mode.png

  • 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が有効になるかわからないのでフローチャートを見てみる。
bootloader_selection.png
このフローチャートを見ると、USBがDetectすればいいことがわかる。要するにUSB挿せばDFUモードになる。

System memoryに入った状態のボードをPCに挿すとデバイスドライバのインストールが行われた。
DfuSeのAvailable Devicesを見ると STM32 Device in DFU Modeと表示されていた。
この状態でChoose...で生成したdfuファイルを選択し、Upgradeを押せば書き込みが完了する。
dfuse_successful.png

まとめ

  • STM32F070xBで組み込みBootloaderから書き込むことができた。

ハマったこと

ハマったことを書いておく。

STM32F070xB のあるロットのSystem memoryの不具合

最初どうあがいてもSystem memoryが起動しなかった :innocent:
STM32 ST-LINK UtilityでSystem memory(STM32F070xBの場合は0x1FFF C800)を見てみると明らかにベクターテーブルがおかしい :innocent:
STM32F070xBのエラッタシートを見ても特に記載なし :innocent:
いろいろ調べてみるとSTmicroのCommunity siteを見るとなにやら同じような状態の人がいる...
どうも動作しないBootloaderが焼かれたロットがあるらしいことが書いてあった:scream:
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が動くよ!紛らわしいね!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
6