stm32
STmicroelectronics社製のARMコア搭載マイクロコントローラ
基本的なコアは
- Cortex-M0
- Cortex-M3
- Cortex-M4
- Cortex-M7
- Cortex-M0+
- Cortex-M33 ← New!
Cortex-M33のコアが搭載されたstm32L5が新登場.GCCのコンパイラも7-2018-q2からM33に対応している.
STMicroelectronics Introduces STM32L5 Ultra-Low-Power Microcontrollers for a More Secured IoT
データやアドレスを32bitで扱えるからstm32らしい。
8ビットのstm8マイコンも存在する。
N ビットマイコンの N ビットって何なのか定義を整理してみよう
上の記事を見ると、何を持って厳密にビットを定義しているんだろうか
タイマ機能やアナログデジタル変換器が非常に多く搭載されており、日本語の資料も多い感じ
データサイズについて
DBGMCU
https://stm32.agg.io/
https://stm32f4-discovery.net/2015/07/disable-peripherals-in-debug-mode-on-stm32f4xx/
水晶発振子のマッチング
ペリフェラル
SYSCFG
システム設定コントローラ
- DMAトリガソースを別チャネルへの再配置
- コード領域の銭湯に配置されたメモリの再配置
などに必要.
stm32F031にて,UARTのDMAチャンネルを2,3ではなく4,5を使用する場合には,SYSCFGにて設定を行う.
クロックを有効にしないとチャンネルの再配置が行われないので注意.
GPIO
stm32内部のGPIOの等価回路や,それぞれのレジスタをいじるとどの回路の接続が変化するかなどが詳しく書かれている.
AN4899 Application note STM32 GPIO configuration for hardware settings and low-power consumption
USART/UART
シリアル通信の代表格と言っても過言ではない
仮想COMでPCと通信したり,トランシーバを噛ませてRS485を繋いだりできることいろいろ.
stm32F405,407の場合,UART(4,5)とUSART(1,2,3,6)がいる.通信速度(Baudrate)は
- USART1,6→10.5Mbit/s
- それ以外→5.25Mbit/s
printfでfloat出力使う
1文字だけおくつ関数を使って,syscalls.cのラッパー関数に引き渡すといけるらしい.
stm32 halライブラリ、makefileでprintf(float型)を使えるようにする!
まぁ容量重視でオレオレPrintfを作ったらfloatなんて重くてアレかもしれないが…
Makefileの場合,LDFLAGS
に-u _printf_float
を追加すればよい
STM32でUARTをやってみる6(float型printfをUART経由で出力)
STM32からのprintfデバッグでfloatを出力する
printfでfloat出力使う
CubeIDE+STM32F413CHでprintfを使う話
USB
CDC
PCと通信できる.要はFT232とか使わなくてもシリアル通信で送受信可能
現状ではLLAPIの関数は用意されていない。HALのSysTickを使っているからだろうか
TIM
非常に多彩
モータ制御PWM
Flash
プログラムを書き込む領域の一部にデータを保存する.リンカスクリプトを編集してメモリの領域を確保する必要がある.
今回はstm32F0を使ってみる.
リファレンスマニュアルを読むと
書き込みは16bit(HalfWord)ずつ.
初期はブロック単位,ここでいうブロックとはメモリのアドレス空間をある程度まとまった領域で区切ったもの.
stm32Fの場合,最小単位はPage(1Kbyte)という区切り.4PageがまとまってSectorという区切りになっている.
書き込みのアクセスがロックされているので,所定のシーケンスを踏んで解除しないと書き込めない.
今回はセンサのキャリブレーション値を保存する目的であるが,ガンガン書き換える用途だと読み出しと書き込みを同時に発生する場合がある.しかしFAULTするのやらないように.
ST-LinkやJ-LinkのデバッグプローブはFLASHに書き込むプログラムにて変更がない時,そこは書き直さない模様(日本語が微妙)なのでデバッガで書き込んでも自分で保存したデータは保存される.
逆にCubeProgrammerなどを使えばフラッシュ内の任意のブロックのみ消去することも可能だった.
EEPROM Emulation
ST公式はこれをEEPROMエミュレーションと言っている.
CubeF4のサンプルコードの中にも入っている.
注意として,EEPROMエミュレーションのコードはセクタを2つ設定しておくようなコードが買いてある.セクタは1つだけでもEEPROMエミュレーションの動作はするけど,セクタを2つ使うような関数も嗅いてあるので注意が必要.リンカスクリプトをいじっておかないとせっかく保存したデータも実行コードで上書きされてしまうので気をつけよう.
EEPROM emulation in STM32F40x/STM32F41x microcontrollers (AN3969)
STM32のFlashメモリを書き換える時のメモ
STM32 内蔵Flashメモリ データ保存 Fault
HALライブラリを使ったstm32f0のフラッシュ書き込み
STM32いじってみた(9) Flash編
【Nucleo F401RE】内蔵フラッシュにデータを書き込んでみる(mbed越しに)
STM32のFlashにデータを保存する
EEPROM emulation on stm32 using HAL drivers
STM32 + HAL Flashの書き込み・読み込み
バックアップSRAM
stm32はデバイスによってバックアップSRAMという領域がある。 stm32F4シリーズは搭載されている?これはVbat端子から電源を供給されることで動作しているため、Vbatに電源が供給されていれば他の電源が落ちていても記録が残るというものらしい。 G4には無さそう。Vbat端子が存在するデバイスにのみ存在?
https://gist.github.com/hasenbanck/1e40681b7d74e942a0dd21de8d97bc5e
How to use Backup SRAM as EEPROM in STM32F4
STM32F4のバックアップSRAM
Ethernet
HAL入れたけどHAL_ETH_ReadPHYRegister()
でずっとループしてる.
LANケーブルでネットワークにつなぐく動く.つなぐことでEthenetのチップが動くから?
RTOS
ミドルウェアをこの項目に書くのもどうかと思うが.
CubeMXはMiddleWareでCMSIS RTOSを積むことができる.と言っても中身の実装はFREERTOSでCMSISがラッパーしているのが実態みたい.
CMSIS OSにはv1とv2があり,stm32F4discoveryでCMSIS OSやろうとした結果v2だとHarfFaultハマってしまった.しばらくはv1で進むほうが良さそう.(2019-11-25時点)
開発環境
CubeCLT
STで使う一連のツールがまとまっているパッケージ
CubeCLT
CubeMX
CubeMX
GUIで使用するピンや関数の設定が可能.初期化を含めたコードを自動生成してくれる.
遭遇したバグなど
4.26.0でMakefileのプロジェクト生成でコードは作られるがMakefileが生成されない問題に遭遇した←4.27.0で上の問題は修正された
プロジェクトごとの管理をIDEにやってもらうか,自分で設定するかによって大まかに二分される.
5.0.0で大型アップデートがかかったけど,マルチバイトに対応していないせいで日本語が□になる.最高にクソ
他にもバグが酷いらしいのでアップデートしたくない…
STのフォーラムを見に行ったら幸い過去のバージョンをGoogleDriveにあげてくてる人がいる.感謝
Please provide a way to download older version of the cube.
2019-04-20更新
任意のバージョンのCubeMXがダウンロードできるようになってる.
Ver4.xなら最新は4.27.0
Ver5.xなら最新の5.1.0がよい,5.0.xは非推奨
Tips
Do not generate mainI()オプションにチェックを入れるとmain()が自動生成されない.cppを使って開発したい人には好都合な機能と思われる.
main.c自体は生成されるので,別途main関数を含んだcppファイルを用意してやれば良い.自分が一時期CubeMXをcppで開発したかった時があるが,main()がmain.c内部に生成されてしまうのでそこがネックだった.
Eclipse
Eclipseに拡張機能Eclipse Embedded CDT (C/C++ Development Tools)を追加する.
Cortex-M系のマイコンを開発するときに便利
もともとはLiviu Ionescu氏の開発したGNU MCU Eclipse Pluginだった.今はEclipse Foundationに移行された.
このプラグインにはCDTが必要となる.インストールするCDTのバージョンによって注意が必要.
Eclipse 2020-06以降,CDT 9.11はJava8が必要となり,通常インストールできない.CDT 10はJava11が必要.
対応方法は以下を参照.
ESP-IDF Eclipse Plugin Release v1.1.1 (Build: 1.1.1.202006040612)
https://wiki.eclipse.org/CDT/User/NewIn911#Release
インストール方法→stm32の開発環境まとめ
CubeIDE
STM32CubeIDE
マルチプラットフォームでMacOSでTrueStudioが使える.SW4STM32やTrueStudioはNRNDなので今後はCubeIDEで完結
Javaは一緒にインストールされるので別途インストールは不要.
SystemWorkbench for STM32(SW4STM32)
TrueSTUDIO for STM32
GNU MCU Eclipse Pluginは,あくまでEclipse上でstm32のコードを編集できるようになるだけであり,stm32をふくめたARM用のツールチェイン,OpenOCDなどのデバッガは別にインストールし,パスを設定する必要がある.
しかし,TrueStudioやSW4STM32はインストールするだけで,同時にツールチェイン,デバッガなどのソフトウェアも一緒にインストールされるので楽.
2019年5月12日更新
上記2つはNRNDになり,今後はCubeIDEが主流となる模様
CudeIDEから.iocファイルをインポートしてプロジェクトを作るとApplication StructureがAdvancedに切り替わる.
これはもともとMakefie出力とかでBasicにしていると生じた.CubeMXからCubeIDEへの出力を行う際にBasicにしておけばこの症状は回避される.
CubeIDEに入ってるツールチェイン(実質gcc-arm-none-eabi)のマニュアルがSTから出ていた.
User Manual
GNU Compiler Collection
Preferences→STM32Cube→Toolchain Managerで使うGCCのバージョン切り替えが可能.
MakefileプロジェクトでもCubeIDEの機能を使えるようにする。
Makefile Project wirh Existing Codeからプロジェクトを作成orインポートする。この時「Toolchain for Indexer Settings」で「MCU ARM GCC」を選択する。 この後、プロジェクトのプロパティからC/c++ Build→Settings→Tool Settings, 「MCU Settings」で使っているMCUを指定すればよい。
Is it possible to debug a Makefile project into STM32CubeIDE
CubeIDE マニュアルの翻訳メモ
CubeProgrammer
文字化け対応
CubeMXからコードを生成すると,コメントアウト部の日本語が文字化けする.
Windowsの場合,Javaの環境変数をいじることで解決する.
環境変数に
変数名JAVA_TOOL_OPTIONS
もしくは_JAVA_OPTIONS
変数値-Dfile.encoding=UTF-8
STM32CubeMXのコード生成時にUTF-8が文字化けしないようにする
Makefile
Makefileを書いて開発する方法を最近は推している.
メモリ使用量が知りたい
使用量を表示する
リンカオプションに-print-memory-usage
を追加
CMake
cmakeでも一回やってみておきたい感
https://github.com/ObKo/stm32-cmake
https://github.com/Dima-Meln/stm32-cmake
https://os.mbed.com/cookbook/mbed-cmake
CMake scripts generation from STM32CubeMX projects: how it was developed
CMake
ライブラリ
Standard Peripheral Library(SPL)
以前のstm32に提供されていたライブラリ現在はHALドライバに移行しており,もうST公式でサポートはされていない.
Githubとか,各センサメーカが配布しているサンプルコードはSPLのものが多い.
HAL
STが新しく提供しているライブラリ,SPLよりコードが抽象化されており,コードの移植性が高い.
しかしその分コードサイズも大きい,最適化からは少し遠のいた感じ
LL API
HALよりも抽象度をさげ,最適化を高めたライブラリ.SPLとコードの書き方が似ており,変換ツールもある.
HALとライブラリの共存が可能であるので,HALでさっさと書いてLLで最適化を書けるということが可能.
またLLはすべての機能を網羅しているわけではなく,一部のペリフェラルの関数はまだ用意されていない.
メモ
参考にしたサイトなど
- TIMのOnePluseモードが動かない
TIMEBaseの関数も呼び出すと動いた
Unable to initialize STM32 timer in one pulse mode with ST HAL
VSCodeでGDBデバッグをする場合,Native Debugを入れる
https://marketplace.visualstudio.com/items?itemName=webfreak.debug
OpenOCDへの引数の渡し方がわからん
先にVSCodeのターミナルからOpenOCD開いてから,ビルドを実行した方がいい感じがする.
自動でOpenOCD開くようにlaunch.jsonにコマンドを登録しておいたほうがいいかもしれない.
VSCodeの拡張機能cortex-debugをインストールしたほうが楽にできる.
expected '=', ',', ';', 'asm' or '__attribute__' before '_Bool'
とかのエラー出る時の対処法.
__weak
を __attribute__((weak))
と定義(#define),
__packed
を __attribute__((__packed__))
と定義(#define)しておかないとエラー出てしまう.これはC,C++の文法,コンパイラのバージョンで生じる問題?
HALならstm32f○xx_hal_def.h
で定義されてる.
HAL使ってるなら問題ないけどLLだとこれの定義無いらしい?ので自前で定義しよう.
STM32CubeMX 4.18.0 error in .cproject on OSX