2017年1月24日火曜日

stm32duino

最近、海外サイトでstm32f103c8t6(左側)が多くなってきた。Arduino nano(右側)と比較して、少し大きい位のボードである。何故、海外で人気が有るかの理由は、性能とコストパフォーマンスの高さである。Arduino nanoが$3に対し、$2で高性能なボードが入手できるからだ。stm32f103c8t6のBlue Pill(青色基板)のスペックがFlashの公称値64kBだが、128kB(保証している訳でない)と魅力的。入手したBlue Pillの他、Red Pill(赤色基板)Black Pill(黒色基板)がある。更に、使い慣れたArduino IDEから開発が出来るstm32duinoである。



H/Wインストール(USBを使う場合)


USB規格ではD +に1.5kのプルアップ抵抗が必要だが、このボードは誤った値(R10 10kまたは、4.7k)となっている事が知られている。R10を1.5kまたは、1.8kに交換する事が必要である。但し、PCとのマージンの問題なので、通信が行えない場合のみ、改造すれば良い。



stm32duinoインストール


  • Arduino IDE 1.6.9をここでダウンロードしてインストールする。
  • IDEを実行し、ツールメニューでボードマネージャを選択し、使用可能なボードのリストからArduino Zeroを検索し、ARM CortexーM0+をインストールする。
  • STM32のZIPファイルを含むファイルをダウンロード。
  • 解凍してArduino_STM32フォルダを作成する。但し、フォルダ名は変更しない事。
  • Arduino_STM32フォルダをMy Documents / Arduino / hardwareにコピーする。     (hardwareフォルダが存在しない場合は、作成する必要がある)
インストール手順は、wikiから引用した。
Arduino IDE 1.6.9を使う様に書いて有るが、IDE 1.8.1を 使っても問題は起きてない。(但し、全ての機能を試した訳でない)

Bootloader(書込みしない)


Bootloaderとは、スケッチをマイコンボードに書込み、ロードなどを行うstm32f103c8t6のF/Wである。PCからシリアルまたは、ST-LINKを使う場合、Bootloader書込みは不要。USBを使う場合、Bootloader書込みが必要となるが、Power onまたはReset後、スケッチがロードされる迄に数秒待たなければプログラムが動作しない為、USBは使えない。
stm32f103c8t6に書き込まれたオリジナルのF/Wを使えば良い。


BOOTスイッチ(基板上のDIP SW)

 

ST-LINK V2

  BOOT0  0側
  BOOT1  0側

 書込み/Power onまたはRESET時とも同じ設定でOK。但し、シリアルモニタ機能は使えない。

シリアル

書込み時
  BOOT0 1側
  BOOT1 0側

 Power onまたはRESET時
  BOOT0 0側
  BOOT1 0側

 シリアルモニタ機能が使える。


USBアダプタ

ST-LINK V2

アダプタ               stm32f103c8t6
 2pin SWDIO           SWDIO
 4pin GND              GND
 6pin SWCLK          SWCLK
 8pin 3.3V               3.3V









シリアル
左側(CH340G)    stm32f103c8t6   
 TX                         A9     
 RX                         A10
 3.3V                       3.3V
 GND                      GND

右側(FT232RL)    stm32f103c8t6
  RX                         A9  
  TX                         A10
  3.3V                       3.3V
  GND                      GND


   

スケッチ(Lチカ)

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(PC13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(PC13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(PC13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}