STM32C0を使ってみる4 -8PinのSTM32C0を使いこなせ!-

今回は秋月電子さんから販売された8ピンのSTM32C011J4M7を使いこなします。
STM32G0の時と違ってGPIOの設定が厳密になっているのでそこら辺も掘り込んで
詳しく紹介します。

●ねむいさん的STM32C011やっけつ回路

今回紹介する8ピンSTM32C011の回路図はG0の頃と同じ感じです。
8ピンSTM32G0をそのまま差し替えて使用できるようにしてみました。
もちろん1-Wireも使えます!

ちなみに最低限のやっけつ回路なので真似される方は電源ラインは
適宜強化願います。


●GPIOのリマップとマルチプレクス

さて、8ピンのSTM32C011はひとつのピンに多重にGPIOや周辺機能が
割り当てられています。


ねむいさんは8ピンのSTM32G0と同じ回路でI2Cを動作させたかったの
ですが、STM32C011のI2Cは1つしか存在しないためSTM32G0では可能
だったI2C2が使用できずI2C1のみとなっております。
その結果PA11,PA12をそのまま使用することができないので"リマップ"
を行う必要があります。



SYSCFGのCFGR1レジスタをいじってGPIOのリマップを行うことによりI2C1
(PA9,PA10)がようやく使用可能となります。


実際はHALライブラリのRemap関数が提供されているのでそれを使用しております。


また、STM32G0ではガバガバだったGPIOの設定もC0では厳密になっており、
例えば8Pin版STM32C0でPC14を選択して使用したい場合はSYSCFGのCFGR3
レジスタのPINMUXビットをいじる必要があります(ついでにPA9とPA10も)。


また、20Pin版STM32C011F4P6では他のI/Oポートと重複がなくPINMUXをいじる
必要がないため、上で提示したコードのようにパッケージレジスタを参照し、
PINMUXをいじるか否かを判定しております。


てわけで改めてSTM32C011J4M7を使ってI2Cデバイス(秋月OLEDSHT40)を
使った温湿度計を稼働させてみました!楽勝ですね☆

秋月から8pinSTM32G0がなくなった今、8ピンのSTM32C011J4M7がSTM32への
入門の定番となっていくでしょう!

今回紹介したプロジェクトはSTM32C0-NUCELOのプロジェクトと合体させて
公開しております!どしどしご活用ください!



●STM32C011J4M7のフラッシュ容量は実際32kByteもある?
STM32C011J4M7のフラッシュ容量は公称では16kByteとなっております。
しかし実際には32kByteもあるようです…マジかよ…
実際に以下の方々が32kByteあることを確認をしております。
しっぽいいんちょ様
amanoya3様


ねむいさんもSTM32C0-NucleoからSWDを引き出してSTM32C011に接続し、
STM32CubeProgrammerで確認してみました!


…ッッマジだ…32kByteってなってる…


わざと16kByteを超える30kByte超えのバイナリを作って書き込んで
みました…書き込める…ちゃんとベリファイも通る…!!!


もちろんちゃんと動いてるし…!


てわけで秋月で売っているSTM32C011J4M7は16kByteではなく実際は
32kByteもあることがわかりましたがこのおまけ容量に頼った設計を
しないように!ちゃんと16kByteの範疇で遊びましょう!





なお、OpenOCDでは16kByte以上を書き込むことができず、16kByte
以降の領域は書き込まれていないためベリファイが通りません。


なんでかというとOpenOCDのSTM32C0のフラッシュ書き込みドライバは
STM32C0に仕込んであるフラッシュ容量レジスタを参照して厳密に書き込める
容量を決定しているためです。

逆に言うとSTM32CubeProgrammerのほうがガバッガバなドンブリ設計…
STマイクロ公式がそれでいいのか!?


ちなみに超セコい技ですがCubeProgrammerで予め16kByte以降の領域を
書き込んでおくとOpenOCDでもベリファイが通りプログラムも正常に
動作します。全然意味ないですがー!

このおまけ容量の使い方としてはどうしてもプログラムサイズが
増えがちなデバッグ時に一時的な使い方として用いるのがよいです。
まぁロットが変わっておまけの16kByte分が無くなったら出来ない
技なので当たり引けたらラッキー的な感じで遊んでいきましょ〜


20240821追:
STM32CubeProgrammer2.17.0で対策されてしまい、正規の16kByte分しか
認識しなくなってしまいました。

てわけでプログラムはちゃんと16kByte以内になるように作りこみましょう!

Go to top of page