STM32F103を使ってみる

開発ボードのバリエーション


STM32F1の開発ボードとしては、Black Pill/Blue Pillが有名ですが、これ以外にもたくさんの開発ボードが有ります。
こちらに色々なボードが公開されていて、見ている だけで楽しいです。
これを見ると、F103とF407が圧倒的に多いことが分かります。
F2xxやF3xxはほとんど入手することができません。

こちらのボードは基板上に色々な周辺機器を実装することができます。
オンボードにはRESET-SW以外にユーザSW(PA8)が実装されています。


裏面にもTF CardやFLASHメモリーなどを実装することができます。


適当なブートローダーを書き込んでLチカしてみましたが、オンボードLEDはPA1に繋がっていました。
そこで、最終的に「generic_boot20_pa1.bin」のブートローダーを書き込んでいます。
ボードの裏側に24C02のi2c EEPROMが実装されています。
こちらのスケッ チでスキャンしてみましたが、i2cアドレス(0x50のはず)を見つけられませんでした。

ESP01をWifiモデムとして使ったMQTTをこちらで公開していま す。
こちらのボードを使うと直接ESP01をマウントできます。
ESP01とは以下を使って通信します。
ESP01(TX)=PA3 ESP01(RX)=PA2




こちらのボードはMaple Miniのクローンです。


マーキングが読み取りにくいですが、裏面にSTM32F103 CBT6が実装されています。
C8T6が実装されている場合、Flash Loader DemonstratorではFLASHサイズを64Kと認識ますが、
CBT6が実装されている場合、Flash Loader DemonstratorではFLASHサイズを128Kと認識します。


Blue Pillとほぼ同じサイズですが、USBコネクターはMiniUSBになっています。


Maple Miniのピンマップはこちらに あります。
このボードにはBootセレクターのジャンパーが有りません。
ブートローダーの書き込みに関してはこちらに 参考となる記事がありました。

この記事によると、オンボードのbutボタンがBoot0に繋がっているようです。
そこで、まず初めにPB2をPullDownします。
これでBoot1がLOWになります。
この状態で、butボタンを押しながらresetボタンを押す(あるいはResetピンをトグルする)とFalsh書き込みモードになり
ブートローダの書き込みが可能となります。
ブートローダーは「maple_mini_boot20.bin」を書き込みました。
ブートローダーを書き込むときに、Flashの内容を消していいかどうかの警告が出ますが、警告を無視して書き込みます。
これでMaple Serialを認識するようになります。

Arduino-IDEで使うときは、ボードタイプに「Maple Mini」を選びます。
Bootloader versionにOriginalとBootloader 2.0を選ぶことができますが、どちらでも書き込みできます。
但し使用できるFLASHサイズ、SRAMサイズが変わります。

【Bootloader versionをOriginalで書き込み】
最大110592バイトのフラッシュメモリのうち、スケッチが19180バイト(17%)を使っています。
最大17408バイトのRAMのうち、グローバル変数が4200バイト(24%)を使っていて、ローカル変数で13208バイト使うことができま す。

【Bootloader versionをBootloader 2.0で書き込み】
最大122880バイトのフラッシュメモリのうち、スケッチが19180バイト(15%)を使っています。
最大20480バイトのRAMのうち、グローバル変数が4200バイト(20%)を使っていて、ローカル変数で16280バイト使うことができま す。

USB経由でスケッチを書き込むときはPB2はPullDownしていても、していなくてもOKです。
オンボードのLEDはPB1に繋がっています。
ボードタイプを「Generic STM32F103C Series」でスケッチを書き込むと、書き込みはできますが、
ブートローダーを破壊し、その後USBを認識しなくなります。(何回も間違えました)


試しに「generic_boot20_pb1.bin」のブートローダーを書き込んでみましたが、USBを認識しませんでした。
ボード上にGPIOのピン番号のシルクがないので、使いずらいですが、5V→3.3VのレギュレータはAMS1117なので、
3.3Vには1A程度出ると思います。
こちらこちらに BluePill、BlackPillの回路図が公開されていますが、5V→3.3VのレギュレータはRT9193(300mA)なので、
SPIのEthernetなど、比較的大きな電流を必要とする3.3Vモジュールは、BluePill、BlackPillでは安定して動きませ ん、



こちらのボードはCPUにSTM32F103 RBT6が実装されています。


48PinのC8T6と比べると、64PinのRBT6のチップサイズは少し大きくなります。


STM32F103Rシリーズを使うときはポートDと、実装されているメモリサイズの扱いに注意が必要です。
Arduino-IDEのボード選択で「Generic STM32F103R Series」を選ぶと、以下の4つのVariantを選択することができます。
この違いはポートDの扱いとFLASHサイズの違いです。
・STM32F103R8(64K) PD2のみ使用可能
・STM32F103RB(128K) PD2のみ使用可能
・STM32F103RC(256K) PD0 PD1 PD2が使用可能
・STM32F103RE(512K)  PD0 PD1 PD2が使用可能

このボードではPA0からPA15、PB0からPB15、PC0からPC13、PD2のポートがピンヘッダーに出ています。
STM32F103R8/STM32F103RBどちらを選んでもPD2のポートは使えます。
STM32F103RC/STM32F103REを選ぶとブートローダーを破壊し、USBを認識しなくなります。

このボードも、ボードの裏側に24C08のi2c EEPROMが実装されています。
こちらのスケッ チでスキャンしてみましたが、ちゃんと4つのアドレスを認識しました。

I2C Scanner
Scanning...
I2C device found at address 0x50  !
I2C device found at address 0x51  !
I2C device found at address 0x52  !
I2C device found at address 0x53  !
done



こちらのボードもCPUにSTM32F103 RBT6が実装されていますが、上のボードと違ってJTAG/SWDのMIPI-20ピンが実装されています。
SW2はパワースイッチ、PWRはパワーLED、オンボードLED(LED1)はPB11に繋がっています。
この手のボードにパワースイッチが実装されているのは珍しいです。
GPIOはPA0からPA15、PB0からPB15、PC0からPC15、PD0からPD2のポートがピンヘッダーに出ています。
USBはマイクロではなくミニとなっています。


裏面にはRTCバックアップ用のボタン電池(CR2102 3.3V)が入れられるようになっています。
3.3VレギュレータはAMS1117です。


オンボードLEDがPB11のブートローダはないので、適当なブートローダを書き込みましたが、
GUIの「Flash Loader Demonstrator」ではFLASHサイズを64Kと認識しました。


このようにFLASHサイズを誤認識する場合は、次の画面で正しいサイズを指定する必要が有ります。


正しいFLASHサイズを指定すると、きちんとブートローダを書き込むことができます。


ちなみに、CUIの「stm32flash.exe」ではFLASHサイズを128Kと認識します。
GUIの「Flash Loader Demonstrator」のFLASHサイズ認識ロジックは少し怪しいです。


上のボードでも紹介しましたが、Arduino-IDEのボード選択で「Generic STM32F103R Series」を選ぶと、4つのVariantを選択することができます。
現在のCoreLibraryではSTM32F103RC/STM32F103REしかPD0 PD1ポートをサポートしていません。
このボードではPD0、PD1、PD2のポートがピンヘッダーに出ていますが、PD0とPD1は使えません。

同じ基板設計でSTM32F103RCT と STM32F103RETのボードが、色々なベンダーから供給されています。
メモリはRBT(128K)<RCT(256K)<RET(512K)ですが、値段はほとんど変わらないので、購入するときはしっか り値段を比較した方がいいです。
RBT6 $6.29 RCT6 $6.29 RET6 $6.39 でした。




こちらのボードもCPUにSTM32F103 RBT6が実装されていますが、オンボードにRS232のポートが実装されています。




USBポートはTYPE-Bとなっています。


ものすごく巨大なボードです。
比較のためにArduino UNO(互換機)と並べてみました。


適当なブートローダーを書き込んでLチカしてみましたが、オンボードLEDはPB9に繋がっていました。
そこで、最終的に「generic_boot20_pb9.bin」のブートローダーを書き込んでいます。

オンボードにS2 S3のユーザスイッチがあります。それぞれPC0 PC1とGNDに繋がっています。
このスイッチ用のPullUp抵抗は実装されていないので、このスイッチを使うときは、
pinMode(PC0, INPUT_PULLUP);
pinMode(PC1, INPUT_PULLUP);
として、スイッチが押されていないときの状態を決めてやる必要があります。

商品ページに
One RS232 serial port, UART1 and UART2 can be set by jumper
と記載されているのでJ4ジャンパーでUARTとRS232を切り替えできる様ですが、まだ試していません。
判明しましたら、こちらに追記します。

<追記>
RS232ポートの詳細が判明しました
オンボードにMAX3232(3-V to 5.5-V Multichannel RS-232 Line Driver)が実装されていて、STM32と以下のように接続されています。
ボード上のJ4ジャンパーでRS232と接続するポートをUART1/UART2に切り替えますが、標準のジャンパーを使うと
UART-TX -> DIN -> DOUT -> RS232C-RX
UART-RX <- ROUT <- RIN <- RS232C-TX
の接続となり、この時点でTX/RXがクロスします。
つまり、標準のジャンパーで、このボードとArduinoやRaspberryとRS232通信するときはストレートケーブルを使 うことになります。
クロスケーブルで接続するときはJ4ジャンパー上でクロスにする必要があります。

</追記>


こちらのボードはCPUにSTM32F103 VET6が実装されています。


上で紹介しているRBT6のボードと配置がよく似ていますが、ボードサイズが全然違います。


オンボードのLEDはpc13に繋がっています。
古いバージョンのArduino_STM32 Coreでコンパイルすると以下のエラーとなります。

C:\Program Files (x86)\Arduino\hardware\Arduino_STM32-master\STM32F1\variants\generic_stm32f103v\board.cpp:168:1: error: too many initializers for 'const stm32_pin_info [79]'

 };

最新のArduino_STM32 Coreを使うことでコンパイルが通ります。
GPIOは以下のポートが使えますが、こんなに沢山のGPIOを使うことはないでしょう...
Aポート 0〜15
Bポート 0〜15
Cポート 0〜15
Dポート 0〜15
Eポート 0〜15

2018年7月時点で、AliでもEbayでもRBT6(上の写真の上側のボード)を購入すると、なぜかこのボードが届きます。
VET6が$12ぐらい、RBT6が$7ぐらいなので、お得といえばお得ですが、RBT6ボードが欲しくても入手することができません。
VxT6はPA15 PB3 PB4 がデフォルトでJTAGにアサインされているので、GPIOとして使えません。
afio_cfg_debug_ports(AFIO_DEBUG_NONE)
でJTAG機能を無効にすることができます。

このボードも、ボードの裏側に24C08のi2c EEPROMが実装されています。
こちらのスケッ チでスキャンしてみましたが、ちゃんと4つのアドレスを認識しました。

I2C Scanner
Scanning...
I2C device found at address 0x50  !
I2C device found at address 0x51  !
I2C device found at address 0x52  !
I2C device found at address 0x53  !
done



こちらのボードはCPUにSTM32F103 VCT6が実装されています。


VET6とVCT6はピンコンパチなので、VET6ボードと設計は同じです。


FLASHサイズはVCT(256K)よりもVET(512K)のほうが大きいですが、値段はVETのほうが安価でした。