stm32:index.html

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 ビットって何なのか定義を整理してみよう
上の記事を見ると、何を持って厳密にビットを定義しているんだろうか

タイマ機能やアナログデジタル変換器が非常に多く搭載されており、日本語の資料も多い感じ

デバッグ

ペリフェラル

豊富なペリフェラルが魅力の1つ

ADC
SPI
ブートローダ

システム設定コントローラ

  • DMAトリガソースを別チャネルへの再配置
  • コード領域の銭湯に配置されたメモリの再配置

などに必要.
stm32F031にて,UARTのDMAチャンネルを2,3ではなく4,5を使用する場合には,SYSCFGにて設定を行う.
クロックを有効にしないとチャンネルの再配置が行われないので注意.

stm32内部のGPIOの等価回路や,それぞれのレジスタをいじるとどの回路の接続が変化するかなどが詳しく書かれている.
AN4899 Application note STM32 GPIO configuration for hardware settings and low-power consumption

シリアル通信の代表格と言っても過言ではない
仮想COMでPCと通信したり,トランシーバを噛ませてRS485を繋いだりできることいろいろ. stm32F405,407の場合,UART(4,5)とUSART(1,2,3,6)がいる.通信速度(Baudrate)は

  • USART1,6→10.5Mbit/s
  • それ以外→5.25Mbit/s

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を使う話

D+,D-どちらが1.5kΩでプルアップされているかを検出してLS,HSを切り替える.
基本的にD+をプルアップしとけばいいかな.stm32ならUSB-HSがのっているので
デバイスの型番によって1.5kΩのプルアップ抵抗が内蔵されているものとそうでないものがあるので,USB通信を使いたいときには注意すること. なお,このプルアップ抵抗を外付けする場合,GPIOでプルアップを切り替えられるようにしておくと良い.
プルアップしただけにしておくと,stm32のリセットをかけても接続したOS側はデバイスが切り離されたとは認識してくれない, GPIOで制御するにようにしておけば,リセットがかかったときにプルアップも切断される.

http://www.stm32duino.com/viewtopic.php?t=386
https://robo.fish/wiki/index.php?title=Programming_STM32F042
https://www.compuphase.com/electronics/usb_lowspeed.htm
LTM2884

USBデバイスと言ってもいろいろある.
USBのパケットの処理 一回の転送での最大データ量は64バイト(アイソクロナス転送以外) このため、CDC_Receive_FS関数においてLenの最大値は64となりそう。
CubeMXから出力すると

USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);

が呼ばれている。これはどうやら次受信するデータを入れるバッファの先頭アドレスを入れる。 これはhUsbDeviceFS.pClassData->RxBufferに記憶される。 しかし、&Buf[0]から次に入れるバッファの場所をずらさないのであればこれは初期化の時に指定していたuint8_t UserRxBufferFS[APP_RX_DATA_SIZE];を再び入れているだけなので、毎回呼び出す必要ななさそう。 もしもUSBからのデータを受け取るバッファをリングバッファとかで構成し、次に入れる場所のアドレスをずらしたいならここを逐一ずらしていばいいだろう。

USBD_CDC_ReceivePacket(&hUsbDeviceFS);

が呼ばれると次のデータの受信準備をする。データが受信されると再びCDC_Receive_FSが呼び出される。 注意点として、次に受信するデータを入れるバッファの場所を変えていない場合、そのバッファの場所のデータをそのまま上書きしてしまうので、先にバッファから受信したデータを回収し、その後USBD_CDC_ReceivePacketを呼び出したほうがいいと思われる。

STM32のUSB使う際の注意
エンドポイント0は64バイトまでしか一回に送信できない。(これはUSBエンドポイントの仕様?) なので送受信はそのあたりを配慮し、細切れにするのがいい? しかしSTのUSBデバイスライブラリはその辺をよしなにやってくれているのだろうか
STM32 USB CDC注意点
秋月電子通商で売られているSTM32F042K6T6を使ってUSBシリアルデバイスを作る
[STM32メモ] USBでCDCを2つ持つ複合デバイスを作る ディスクリプタ編(IADとか)

stm32のmainstreamシリーズは(ここではstm32f1を指す)、CANとUSBのSRAMが同じバッファを分断して共有するので、両方を使う場合には注意が必要。
AN4879 STM32 マイクロコントローラを使用した USB ハードウェアと PCB のガイドライン

PCと通信できる.要はFT232とか使わなくてもシリアル通信で送受信可能
現状ではLLAPIの関数は用意されていない。HALのSysTickを使っているからだろうか

非常に多彩

TIM

プログラムを書き込む領域の一部にデータを保存する.リンカスクリプトを編集してメモリの領域を確保する必要がある.
今回は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の書き込み・読み込み

stm32はデバイスによってバックアップSRAMという領域がある。   stm32F4シリーズは搭載されている?これはVbat端子から電源を供給されることで動作しているため、Vbatに電源が供給されていれば他の電源が落ちていても記録が残るというものらしい。 G4には無さそう。Vbat端子が存在するデバイスにのみ存在?

https://gist.github.com/hasenbanck/1e40681b7d74e942a0dd21de8d97bc5e
How to use Backup SRAM as EEPROM in STM32F4
STM32F4のバックアップSRAM

HAL入れたけどHAL_ETH_ReadPHYRegister()でずっとループしてる.
LANケーブルでネットワークにつなぐく動く.つなぐことでEthenetのチップが動くから?

ミドルウェアをこの項目に書くのもどうかと思うが.
CubeMXはMiddleWareでCMSIS RTOSを積むことができる.と言っても中身の実装はFREERTOSでCMSISがラッパーしているのが実態みたい.
CMSIS OSにはv1とv2があり,stm32F4discoveryでCMSIS OSやろうとした結果v2だとHarfFaultハマってしまった.しばらくはv1で進むほうが良さそう.(2019-11-25時点)

開発環境

STで使う一連のツールがまとまっているパッケージ
CubeCLT

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は非推奨

Do not generate mainI()オプションにチェックを入れるとmain()が自動生成されない.cppを使って開発したい人には好都合な機能と思われる.
main.c自体は生成されるので,別途main関数を含んだcppファイルを用意してやれば良い.自分が一時期CubeMXをcppで開発したかった時があるが,main()がmain.c内部に生成されてしまうのでそこがネックだった.

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の開発環境まとめ

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 マニュアルの翻訳メモ

CubeMXからコードを生成すると,コメントアウト部の日本語が文字化けする. Windowsの場合,Javaの環境変数をいじることで解決する. 環境変数に
変数名JAVA_TOOL_OPTIONSもしくは_JAVA_OPTIONS
変数値-Dfile.encoding=UTF-8
STM32CubeMXのコード生成時にUTF-8が文字化けしないようにする

Makefileを書いて開発する方法を最近は推している.
メモリ使用量が知りたい
使用量を表示する リンカオプションに-print-memory-usageを追加

以前のstm32に提供されていたライブラリ現在はHALドライバに移行しており,もうST公式でサポートはされていない.
Githubとか,各センサメーカが配布しているサンプルコードはSPLのものが多い.

STが新しく提供しているライブラリ,SPLよりコードが抽象化されており,コードの移植性が高い.
しかしその分コードサイズも大きい,最適化からは少し遠のいた感じ

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

  • stm32/index.html.txt
  • 最終更新: 2024/04/06
  • by yuqlid