18
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-02

高知工科大 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が動くよ!紛らわしいね!

18
6
0

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
  3. You can use dark theme
What you can do with signing up
18
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?