arduino IDE 1.6.4 で ARM STM32F103C8T6を使ってみる
2017/04/22 追記
本ページへのアクセスが多いので、Blue Pillのセットアップの良記事を紹介いたします。
・DEKOさんのSTM32F103C8T6の記事
http://ht-deko.com/arduino/stm32f103c8t6.html
私も最近ではDEKOさんページの内容を参考にしてセットアップしています。
・Arduino STM32については、下記にまとめを作成しました(2017/10/31 追記)
Arduino STM32関連情報
Arduino STM32 リファレンス
----
arduino IDEの 1.6.x 系列で安価なARMボードが動くらしいので試してみました。
(2017/10/31 追記 この記事は古いです。最新の1.8.x系列を使いましょう)
試したのはSTマイクロエレクトロニクス社(本社 スイス)のARM(ARM 32 Cortex-M3 CPU)を
搭載したボードです。動作クロック 72MHz、64Kbフラッシュメモリ、20kバイトSRAM搭載です。
いつものAliexpressで購入しました。

んで、実物がこれです。

このボードに関する情報はここにまとまってあります(ピンレイアウトを除く)。
(2016/12/03追記)
こちらの記事も参考になると思います。 「Red Pill or Blue Pill?」
「Red Pill or Blue Pill?」によると、私のはBlue Pillボードで、USB接続に問題ありとの
情報があります(USB用のPA12ピン接続のR10の抵抗に問題あり?) 。

USB経由でプログラム書き込みが出来ないっぽいので、ST-Link V2を追加購入しました。
ST-Link V2 は STM32/STM8系CPU用のプログラマーです。

こんな感じで接続して使います。
ドライバー、ユーティリティソフト類は、STマイクロエレクトロニクスの下記のサイトから
入手しました。
ST-LINK/V2ST-LINK/V2 in-circuit debugger/programmer for STM8 and STM32
ST-LINK/V2 in-circuit debugger/programmer for STM8 and STM32 (2016/09/20 更新)
ユーティリティソフトを起動してARMボードに問題なく接続出来ました。
次にarduino IDEの 1.6.4にSTM開発環境を組み込みます。
Arduino STM32という環境を利用します。下記のサイトで配布・情報公開が行われています。
rogerclarkmelbourne/Arduino_STM32
https://github.com/rogerclarkmelbourne/Arduino_STM32/wiki
上記サイトの「Installation」の内容に従って環境を構築しました。
特につまづく箇所もかなく構築出来ました。

該当するボード、書き込み手段としてSTLinkを指定します。
Lチカを試してみます。ここでハマりました。
デフォルトで用意されている「スケッチの例 /Basics/Blink」を
試してみましたが、コンパイルと書き込みは出来たものの、Lチカしません。
ボード上のLEDは、デジタルピン13ではないようです。
ただし、ボード上のLEDの脇にPC13とのラベルが印刷されています。
インストールしたファイルをチェックすると
.\hardware\Arduino_STM32\examples
にサンプルソースがありました。その中の\Digital\Blink\Blink.inoを見ると
digitalWrite(PB1, HIGH); // turn the LED on (HIGH is the voltage level)
となってました。
これをヒントにデジタルピンの指定を13からPC13に変更するとLチカ出来ました。
ピン設定は互換性が無いようです。
選択したボードGeneric STM32F103C8 のボード関連の設定ファイルを覗いてみると、
(\hardware\Arduino_STM32\STM32F1\variants\generic_stm32f103c\board\board.h)
下記のように定義されています。
#define CYCLES_PER_MICROSECOND 72
#define SYSTICK_RELOAD_VAL 71999 /* takes a cycle to reload */
#define BOARD_NR_USARTS 3
#define BOARD_USART1_TX_PIN PA9
#define BOARD_USART1_RX_PIN PA10
#define BOARD_USART2_TX_PIN PA2
#define BOARD_USART2_RX_PIN PA3
#define BOARD_USART3_TX_PIN PB10
#define BOARD_USART3_RX_PIN PB11
#define BOARD_NR_SPI 2
#define BOARD_SPI1_NSS_PIN PA4
#define BOARD_SPI1_MOSI_PIN PA7
#define BOARD_SPI1_MISO_PIN PA6
#define BOARD_SPI1_SCK_PIN PA5
#define BOARD_SPI2_NSS_PIN PB12
#define BOARD_SPI2_MOSI_PIN PB15
#define BOARD_SPI2_MISO_PIN PB14
#define BOARD_SPI2_SCK_PIN PB13
#define BOARD_NR_GPIO_PINS 35
#define BOARD_NR_PWM_PINS 12
#define BOARD_NR_ADC_PINS 9
#define BOARD_NR_USED_PINS 4
#define BOARD_JTMS_SWDIO_PIN 22
#define BOARD_JTCK_SWCLK_PIN 21
#define BOARD_JTDI_PIN 20
#define BOARD_JTDO_PIN 19
#define BOARD_NJTRST_PIN 18
#define BOARD_USB_DISC_DEV GPIOB
#define BOARD_USB_DISC_BIT 10
// Note this needs to match with the PIN_MAP array in board.cpp
enum {
PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7, PA8, PA9, PA10, PA11, PA12, PA13,PA14,PA15,
PB0, PB1, PB2, PB3, PB4, PB5, PB6, PB7, PB8, PB9, PB10, PB11, PB12, PB13,PB14,PB15,
PC13, PC14,PC15
};
これでGPIO,UART、SPIの指定方法・接続ピンが分かりました。
Arduino STM32のサイトのLibrariesの内容を読むと現在のサポート状況が分かります。
I2Cは現状は、"software (bit-banged) implementation" のようです。
I2C. Working, However this is a software (bit-banged) implementation,
and has a maximum speed of around 250kbps. Speed improvements.
Hardware I2C has been tested by some users, but is not integrated into
the normal Wire library.
ライブラリの利用には色々と制約があるようです。
現状は強引にArduino IDE環境で使うよりはARM開発環境を使った方がよさそうです。
ということで、ARM開発環境も構築してみます。
2016/09/21 追記
公開されているモジュールにいくつか進展があるようで、
USB経由でプログラムの書込みが出来ると分かり早速やってみました。
下記の情報を見てやってみました。
GitHub - rogerclarkmelbourne/Arduino_STM32 stm32duino bootloader
ただしブートローダ書き込みの書込みが なぜかstm32flash.exe コマンドで出来ない
ので(P9,P10ピンにUSB-UART接続のシリアルポートを認識せず。やり方がマズい? )
STM32 ST-LINK Utility を使って書き込みました。
ブートローダはgeneric_boot20_pc13.bin を使いました。
(ブートローダ起動時にLEDを点滅させるのでその対応のブートローダのようです)
ドライバ(Arduino_STM32\drivers\winにあるドライバ)のインストールも行いました。
Arduino IDEにて書込みに"STM32duino bootloader"を選択します。
スケッチの書込みを行うとUSB経由で書込みが出来ました。

ただし、書込み後の後に変なエラーで出ています。書込み後にリセットを行う処理っぽいです。
スケッチ的には問題なしです。アスキーコードをシリアル出力するスケッチが
ちゃんと動きました。USB経由にて読めています。
以前より、使いやすくなった感じなのでちょっと使い込んでみてもよいかも。
2016/09/23 追記
専用のプログラマを利用ではなく、シリアル通信経由でもブートローダやプログラムの
書込みが出来ること判明、試してみました。
黄色いジャンパーピンの仕様がここにありました。
シリアル経由でプログラムを書き込むにはこのジャンパーを写真のようにセットします。
これでリセットするとISPモードとなります。
この時、シリアル通信を行うためのピンは
A9:TXD 、A10:RXD
です。これにクロス接続してUSB-UARTモジュールなんかを使ってパソコンから
シリアル通信出来るようにします。
この状態で、STM32 Flash loader demonstratorを使ってプログラムの書込みが出来ます。

設定値は上記の通りです(Parity Evenもそのままで.. 私はこれでちょっとハマりました)。
NexTを押して、次のステップに進みます。次の画面状態になります。

Nextを押して次に進みます。
設定はそのままで、Nextで次に進みます。
Dounload to device を選択し、ブートローダのファイルを指定します。
(ファイル選択時に拡張子にBINを指定することに注意)

これでNextを押して書込みが行われます。

これでブートローダの書込み完了です。
ジャンパスイッチを元に戻してArduino IDEからはUSB経由で書き込みできるようになります。
2017/01/03 追記
追加購入した左3つ、USB経由の書き込みが出来ませんでした。

ただしその3つ、USBシリアル通信が全く使えないわけではなく、
STLINK経由でUSBシリアル通信を行うスケッチを書き込むと、
USBシリアル通信は行うことが出来ました。
シリアルポートとしては認識しており、
スケッチ書き込み時のリセット等のタイミングがまずいような感じです。
抵抗補正をやっても出ダメでした。
このBlue Pillボード、見た目は同じでも微妙に異なるようです。
基板のパターンは同じようですが、左3つと右2つ、利用している部品が微妙に異なります。
ます、左3つはCPUが中国工場製、右2つはマレーシア工場製です。
LEDの色も左は赤、右は青です。クリスタルも異なります。
上記の左3つのUSB経由の書込みが出来るようになりました。
2019/02/14 永続モードについての修正
ブートローダの書込み後、書き込みがうまくいかない場合、ブートローダを
永続モード(ユーザープログラムの実行に移らず、書き込みを待ち続ける)にすると
上手く書き込める場合があります。
BluePilボードまたは、ブートローダにgeneric_boot20_pc13.bin を使うボードでは、
永続モードにするには、以前はPC14ピンだったのですが、
新しいブートローダでは、BOOT1ピンを1に設定するに変更となりました。
BOOT1ピンを1にした状態で永続モードにして、スケッチを書き込むと上手くいきます。
一旦スケッチを書き込むと、スケッチに不随するシリアル通信ドライバ経由で、
書き込み時にリセットを書けて、DFUに切り替わることが出来るようです。
スケッチで書き込んだプログラムが暴走した等の場合、
書き込み時、シリアル経由でのリセットがかけられない場合があり、
この時は、手動でリセットボタンを押すか、再度永続モードで書き込めばよいようです。
1017/01/07 追記
(仮のメモ)
タイマー割り込み、SPI、DMA周りの機能が理解出来てきたので、
NTSC信号を生成してビデオ出力を実装してみました。
実装において、
「建築発明工作ゼミ2008」さんの四角を表示する解説が大変参考になりました。
http://kousaku-kousaku.blogspot.jp/2008/06/arduino_26.html
さすがARM、高機能なタイマーが利用出来ます。
SPI+DMAを使ってのビットデータ出力も非常に便利です。
(スケッチはここ)

解像度は224x192ドットです。美咲フォントを使って文字を表示してみました。
この当たりはブログ再開時に紹介していきます^^
デモ動画その2(解像度416×216)
1017/01/10 追記
(仮のメモ)
STM32用のTVout互換ライブラリを作成中です。
ArduinoUnoに比べSRAM容量が大きいのでちょっとしたゲームなんかつくれそう。
« IchigoJamでQRコードを表示してみる | トップページ | IchigoJamで自分自身をLIST表示するプログラム »
「arduino」カテゴリの記事
- Freenove Mecanum ホイール カー キットを購入しました(2025.05.28)
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Zorin OSでArduino Uno互換機(CH340)が認識しない(2025.01.19)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- Arduino用 SKK日本語変換ライブラリの開発 その1(2024.12.28)
「ARM」カテゴリの記事
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- PocketGoで遊んでみる(1)(2020.03.24)
- Arduino用 MML文演奏ライブラリの作成 その1(2019.04.01)
- BluePillボードで4桁7セグLEDの制御(2019.03.21)
「STM32」カテゴリの記事
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- 「Arduino STM32 リファレンス 日本語版」が2万アクセス突破!(2021.03.26)
- SPI接続フラッシュメモリモジュールを入手しました(2020.05.13)
- Arduino STM32でキャラクタ液晶ディスプレイを使う(2019.06.01)
コメント
« IchigoJamでQRコードを表示してみる | トップページ | IchigoJamで自分自身をLIST表示するプログラム »


たま吉さん、いつも拝見させていただいています。
Tiny Basicもますます充実してきているようですね。時間があるとき
に焼き直して動作の確認をしています。特にスクリーンエディタの使
いがって良いので、Ichigojam など放っておいて、いっそうのこと
Qbasic:https://archive.org/details/msdos_qbasic_megapack
によく似たインターフェースなど如何でしょうか。
私には力がありませんのでとても作れませんが、昔、DOSで使った
ときはいろいろとそれでアプリケーションを作った思い出があります。
ここに書かせていただいたのは、aitendo のmoving.saleでSTM32マ
イコンボード [MB-STM32F103VET6]を購入しましたので、この記事
が本当によくまとめられているので、参考にさせていただいてセット
アップを試みました。このボードは殆ど情報がありませんでしたが、
他の中華ボードの回路図も参考にして、何とかブートローダーで
Blinkを動かすことができました。
本当にありがとうございました。STM32F103万歳!
投稿: くま | 2017年6月27日 (火) 02時29分
くまさん
コメント&情報ありがとうございます。
スクリーンエディタは、もう少し使い勝手よ良くしたいと考えています。
現在、スクリーンエディタ部は汎用的に利用出来るように修正しています。
(部品化、他のArduino環境での利用、液晶モジュール等のデバイス対応)
Tiny BASICの他に、他の対話的なインタフェースでの利用も考えています。
aitendoのMB-STM32F103VET6、いいですね。私も入手しようかなぁ
投稿: たま吉さん(管理者) | 2017年6月27日 (火) 08時10分