マイコン(STM32)の開発でドハマりする話

こんちには、kthdです

割と長いことSTM32のプログラムを作っていますが、はじめての問題というか謎現象が起こり、その解決にドハマりしたので同じ問題に悩む人がでないように情報を公開しておきます。

(結果から考えたらとても単純なミスなのですが...)

STM32F042F6でデバッグができない

症状

  • チップはSTM32F042F6で自作基板に実装

  • OSとしてChibiOSのmasterブランチの2018/7/31の最新版を利用

  • SWDでJ-Linkと接続しデバッグ実行するとChibiOSのchThdSleepMilliseconds(500)の実行が終わらず、そこから進まなくなってしまう
  • 一時停止するとシステムメモリ(ブートローダー)の場所へジャンプしてそこを実行している
  • ステップ実行で詳しく追いかけるとWFI()で止まってるというかループしている
  • WFIのループでまた実行するとシステムメモリへジャンプする
  • J-Linkを外して単体で実行するとうまく動く(ここが謎)
  • Nucleo付属のST-Link-v2でも同様の症状
  • chprintf()も正しく動かない
  • STM32CubeMXで作成したfreeRTOSでもOSの初期化段階で処理が進まなくなる

原因

  • STM32のブートの設定が正しくない
  • ピンの少ないSTM32でPB8-BOOT0をBOOT0端子ではなくGPIOとして使っていた場合に起こる問題のようです
  • PB8-BOOT0はデフォルトでBOOT0として機能するようで、この端子をオープンにしていたために、chThdSleepMilliseconds(500)の後、何らかの原因でブートローダーが起動してしまっていたと考えられる
  • J-Linkを外した場合に正しくFlashメモリから起動できていた理由はよくわからない

対策

  • PB8-BOOT0を正しく配線するか、STM32のOption bytesを正しく設定しBOOT0を無効にしてFlashメモリから起動するようにする
  • 今回はPB8-BOOT0をGPIOとして使用するのでST-LINK Utilityの画面上でOption bytesのnBoot0_SW_Cfgのチェックを外してnBoot0のチェックを入れた
  • あとはそのままApplyボタンでOption bytesを書き換えればすべてうまくいくようになる

さいごに

最初全く原因がつかめずあきらめかけていましたが、stのフォーラムに同じ症状での投稿を発見し、なんとか解決することができました。

参考情報