STM32F103C8T6    

 1 ボードのメモ  
 2 ライタソフトのインストール STM32 ST-LINK Utility使い方 
 3 Lチカ(CP_13) 
 4 シリアル通信テスト 
 5 arduino-IDEで使う 
 6 arduino-IDE U いろいろテスト 
 7 mbed いろいろテスト 
 8 arduino ブートローダー書き込み 
 9 arduinoとして復習など 2019.06.16
 10 arduino+ST-Linkで 2019.06.27





 1 ボードのメモ    2016.09.25
 アマゾンでリストを見ていると「HiLetgo STM32F103C8T6 ARM STM32 Minimum システム 開発ボードモジュール Arduinoと互換 」というのが目に入りました。 様子からmbedで使えそうです。64Kフラッシュメモリ、20K SRAMというスペックで 価格は送料込みで¥310です。LPC1114のROMが32kBで、メモリの不足を考えていたので64kBあればととにかく注文しました(送料無料は魅力です)。

しかし、webで調べるとUSB-シリアルでは書き込みができない模様で、書き込み機 ST-LINK V2 がいるとのこと。しまったと思いましたがこれを調べてみると送料込み¥500で購入できます。すぐに申し込みました。10日あまりかかって両方共届きました。



双方を付属のケーブルでつなぎ、USBに挿入するとPC13に接続されてた赤LEDが点滅しました。ボードの常でテスト用のプログラムが書き込まれているようです

mbedのweb IED では、このボードは登録されていません。NUCLEO-F103RB を選びます。これはSTM32F103C8Tより、ROMが大きい(128kB)、ピンが多い(64pin)ものだそうです。構造は同じなので、ないピンは使わない、ROMに注意する、の2点を考慮すれば問題がないそうです。
ピン配置:
 1  VBAT SV BAT 
 2  PC13-ANTI_TAMP(4) I/O PC13 ANTI_TAMP 
 3  PC14-OSC32_IN(4) I/O PC14-OSC32_IN 
 4  PC15-OSC32_OUT(4) I/O PC15-OSC32_OUT
 5  OSC_IN I OSC_IN
 6  OSC_OUT O OSC_OUT
 7  NRST I/O NRST 
 8  VSSA SV SSA 
 9  VDDA SV DDA
10  PA0-WKUP/ USART2_CTS/ ADC_IN0/TIM2_CH1_ETR I/O PA0 WKUP/USART2_CTS(6)/AD C_IN0/ TIM2_CH1_ETR(6)
11  PA1/USART2_RTS/ ADC_IN1/TIM2_CH2  I/O PA1 USART2_RTS(6)/ ADC_IN1/ TIM2_CH2(6)
12  PA2/USART2_TX/ ADC_IN2/ TIM2_CH3  I/O PA2 USART2_TX(6)/ ADC_IN2/ TIM2_CH3(6)
13  PA3/USART2_RX/ ADC_IN3/TIM2_CH4  I/O PA3 USART2_RX(6)/ ADC_IN3/TIM2_CH4(6)
14  PA4/SPI1_NSS/ USART2_CK/ADC_IN4 I/O PA4 SPI1_NSS(6)/ USART2_CK(6)/ ADC_IN4 
15  PA5/SPI1_SCK/ ADC_IN5 I/O PA5 SPI1_SCK(6)/ ADC_IN5 
16  PA6/SPI1_MISO/ ADC_IN6/TIM3_CH1 I/O PA6 SPI1_MISO(6)/ ADC_IN6/TIM3_CH1(6)
17  PA7/SPI1_MOSI/ ADC_IN7/TIM3_CH2  I/O PA7 SPI1_MOSI(6)/ ADC_IN7/TIM3_CH2(6)
18  PB0/ADC_IN8/ TIM3_CH3 I/O PB0 ADC_IN8/TIM3_CH3(6) 
19  PB1/ADC_IN9/ TIM3_CH4 I/O PB1 ADC_IN9/TIM3_CH4(6)
20  PB2 / BOOT1 I/O FT PB2/BOOT1
21  PB10/I2C2_SCL/ USART3_TX I/O FT PB10 I2C2_SCL/USART3_TX(5)(6)
22  PB11/I2C2_SDA / USART3_RX I/O FT PB11 I2C2_SDA/ USART3_RX(5)(6)
23  VSS_1 SV 
24  VDD_1 SV 
25  PB12/SPI2_NSS / I2C2_SMBAl/ USART3_CK / TIM1_BKIN I/O FT PB12 SPI2_NSS(5) /I2C2_SMBAl(5)/ USART3_CK(5)(6)/ TIM1_BKIN(6)
26  PB13/SPI2_SCK / USART3_CTS / TIM1_CH1N I/O FT PB13 SPI2_SCK(5)/ USART3_CTS(5)(6)/ TIM1_CH1N (6
27  PB14/SPI2_MISO / USART3_RTS / TIM1_CH2N I/O FT PB14 SPI2_MISO(5) /USART3_RTS(5)(6) TIM1_CH2N (6)
28  PB15/SPI2_MOSI TIM1_CH3N  I/O FT PB15 SPI2_MOSI(5)/ TIM1_CH3N(6)
29  PA8/USART1_CK/ TIM1_CH1/MCO I/O FT PA8 USART1_CK/ TIM1_CH1(6)/MCO 
30  PA9/USART1_TX/ TIM1_CH2 I/O FT PA9 USART1_TX(6)/ TIM1_CH2(6)
31  PA10/USART1_RX/ TIM1_CH3 I/O FT PA10 USART1_RX(6)/ TIM1_CH3(6)
32  PA11 / USART1_CTS/ CANRX / USBDM/ TIM1_CH4 I/O FT PA11 USART1_CTS/ CANRX(6)/ TIM1_CH4(6) / USBDM
33  PA12 / USART1_RTS/ CANTX / USBDP/ TIM1_ETR I/O FT PA12 USART1_RTS/ CANTX(6) / TIM1_ETR(6) / USBDP
34  PA13/JTMS/SWDIO I/O FT JTMS/SWDIO PA13
35  VSS_2 SV SS_2 
36  VDD_2 SV DD_2
37  PA14/JTCK/SWCLK I/O FT JTCK/SWCLK PA14
38  PA15/JTDI I/O FT JTDI PA15
39  PB3/JTDO/TRACESWO I/O FT JTDO PB3/TRACESWO 
40  PB4/JNTRST I/O FT JNTRST PB4
41  PB5/I2C1_SMBAl I/O PB5 I2C1_SMBAl 
42  PB6/I2C1_SCL/ TIM4_CH1 I/O FT PB6 I2C1_SCL(6)/ TIM4_CH1(5)(6)
43  PB7/I2C1_SDA/ TIM4_CH2 I/O FT PB7 I2C1_SDA(6)/ TIM4_CH2(5) (6)
44  BOOT0 I BOOT0 
45  PB8/TIM4_CH3 I/O FT PB8 TIM4_CH3(5) (6) 
46  PB9/TIM4_CH4 I/O FT PB9 TIM4_CH4(5) (6) 
47  VSS_3 SV SS_3 
48  VDD_3 SV 
IO端子:
PA0-WKUP/ USART2_CTS/ ADC_IN0/TIM2_CH1_ETR I/O PA0 WKUP/USART2_CTS(6)/AD C_IN0/ TIM2_CH1_ETR(6)	
PA1/USART2_RTS/ ADC_IN1/TIM2_CH2  I/O PA1 USART2_RTS(6)/ ADC_IN1/ TIM2_CH2(6)	
PA10/USART1_RX/ TIM1_CH3 I/O FT PA10 USART1_RX(6)/ TIM1_CH3(6)	
PA11 / USART1_CTS/ CANRX / USBDM/ TIM1_CH4 I/O FT PA11 USART1_CTS/ CANRX(6)/ TIM1_CH4(6) / USBDM	
PA12 / USART1_RTS/ CANTX / USBDP/ TIM1_ETR I/O FT PA12 USART1_RTS/ CANTX(6) / TIM1_ETR(6) / USBDP	
PA13/JTMS/SWDIO I/O FT JTMS/SWDIO PA13	
PA14/JTCK/SWCLK I/O FT JTCK/SWCLK PA14	
PA15/JTDI I/O FT JTDI PA15	
PA2/USART2_TX/ ADC_IN2/ TIM2_CH3  I/O PA2 USART2_TX(6)/ ADC_IN2/ TIM2_CH3(6)	
PA3/USART2_RX/ ADC_IN3/TIM2_CH4  I/O PA3 USART2_RX(6)/ ADC_IN3/TIM2_CH4(6)	
PA4/SPI1_NSS/ USART2_CK/ADC_IN4 I/O PA4 SPI1_NSS(6)/ USART2_CK(6)/ ADC_IN4	
PA5/SPI1_SCK/ ADC_IN5 I/O PA5 SPI1_SCK(6)/ ADC_IN5	
PA6/SPI1_MISO/ ADC_IN6/TIM3_CH1 I/O PA6 SPI1_MISO(6)/ ADC_IN6/TIM3_CH1(6)	
PA7/SPI1_MOSI/ ADC_IN7/TIM3_CH2  I/O PA7 SPI1_MOSI(6)/ ADC_IN7/TIM3_CH2(6)	
PA8/USART1_CK/ TIM1_CH1/MCO I/O FT PA8 USART1_CK/ TIM1_CH1(6)/MCO	
PA9/USART1_TX/ TIM1_CH2 I/O FT PA9 USART1_TX(6)/ TIM1_CH2(6)	
PB0/ADC_IN8/ TIM3_CH3 I/O PB0 ADC_IN8/TIM3_CH3(6)	
PB1/ADC_IN9/ TIM3_CH4 I/O PB1 ADC_IN9/TIM3_CH4(6)	
PB10/I2C2_SCL/ USART3_TX I/O FT PB10 I2C2_SCL/USART3_TX(5)(6)	
PB11/I2C2_SDA / USART3_RX I/O FT PB11 I2C2_SDA/ USART3_RX(5)(6)	
PB12/SPI2_NSS / I2C2_SMBAl/ USART3_CK / TIM1_BKIN I/O FT PB12 SPI2_NSS(5) /I2C2_SMBAl(5)/ USART3_CK(5)(6)/ TIM1_BKIN(6)	
PB13/SPI2_SCK / USART3_CTS / TIM1_CH1N I/O FT PB13 SPI2_SCK(5)/ USART3_CTS(5)(6)/ TIM1_CH1N (6	
PB14/SPI2_MISO / USART3_RTS / TIM1_CH2N I/O FT PB14 SPI2_MISO(5) /USART3_RTS(5)(6) TIM1_CH2N (6)	
PB15/SPI2_MOSI TIM1_CH3N  I/O FT PB15 SPI2_MOSI(5)/ TIM1_CH3N(6)	
PB2 / BOOT1 I/O FT PB2/BOOT1	
PB3/JTDO/TRACESWO I/O FT JTDO PB3/TRACESWO	
PB4/JNTRST I/O FT JNTRST PB4	
PB5/I2C1_SMBAl I/O PB5 I2C1_SMBAl	
PB6/I2C1_SCL/ TIM4_CH1 I/O FT PB6 I2C1_SCL(6)/ TIM4_CH1(5)(6)	
PB7/I2C1_SDA/ TIM4_CH2 I/O FT PB7 I2C1_SDA(6)/ TIM4_CH2(5) (6)	
PB8/TIM4_CH3 I/O FT PB8 TIM4_CH3(5) (6)	
PB9/TIM4_CH4 I/O FT PB9 TIM4_CH4(5) (6)	
PC13-ANTI_TAMP(4) I/O PC13 ANTI_TAMP	
PC14-OSC32_IN(4) I/O PC14-OSC32_IN	
PC15-OSC32_OUT(4) I/O PC15-OSC32_OUT	
 



 2 ライタソフトのインストール    2016.09.25
 プログラムライタST-LINK V2の仕様には専用のユーティリティが必要です。
このページに詳しく解説されています。STMicroelectronicsのサイトからダウンロードします。
上記のpdfの支持に従って進み、「STSW-LINK004 ST STM32 ST-LINK utility」をクリックして最後に「Get Software」をクリックします。これでインストーラーがダウンロードできます。あとはインストーラーの指示に従ってインストールを続けます。

プログラムライタの使い方:
1 デスクトップに作られるショートカットアイコンなどから STM32 ST-LINK UTILITY を起動します。
2 ボードとライタをつなぎ、USBに接続して、Target→ConnectをクリックするとMCUを読み取ります。
3 Program Verifyアイコンをクリックすると書き込みの画面が現れるのでFile Pathから目的の.binファイルを指定します。
4 スタートボタンを押します。
(注意)File Path は設定した時点で読み込むようです。.binを更新したときは指定し直さないと以前のファイルを書き込みます

(2019.06.27)STM32 ST-LINK Utilityの使い方
 しばらく使わないと忘れますので備忘録として書きます。
1 utilityを起動します。

2 ハードウエアの接続をします。(USB刺し直しが必要かもしれません)

3 @のコネクトボタンを押します。(ボードが読まれます)

4 Aの操作で最新の.binファイルを読み込みます(ファイルを更新します)。ファイルが読まれていない状態ならブラウズ画面になります。

5 Bのプログラムボタンを押します。書き込みの窓が出ます。

6 スタートボタンを押します。このとき、address欄が橙色のカラー表示なっていることが必要です。カラー表示になっていればbinファイルが更新されています。
下側の図はカラー表示になっていません。図を作る時のミスです。

ardino-IDEでコンパイルするときは、Upload method を STLink にしておくことが大切です。

このソフトは書き込むデータ(.bin)を保持しているようです。更新を明示的にしないと古いデータを書き込みます。最も注意するところでしょう。

     




 3 Lチカ(CP_13)    2016.09.25
mbed IDE に NUCLEO-F103RB をセットして、新規から blink-led を選びました。ポート指定は LED1 になっているのですが私のボードはどうなっているのかわからないのでPC3に置き換えました。しかし、”PC3”は登録されていません。P3もだめです。しかしwebを探していると”PC_3”の表記を発見しました。LED1をPC_3に書き換えてビルドしたところエラーなく.binができました。
早速ライタで書き込んでみると期待通りの点滅をしました。
#include "mbed.h"

DigitalOut myled(PC_13);

int main() {
    while(1) {
        myled = 1; // LED is ON
        wait(2.0); // 2 sec
        myled = 0; // LED is OFF
        wait(2.0); // 2 sec
    }
}
     



 4 シリアル通信テスト    2016.10.02
当分の間、プログラム作成はweb上のIDEを NUCLEO-F103RB ボードとして使い(ピン名とROM容量に注意が入りますが)、プログラム書き込みには St-link V2 と STM32 ST-LINK UTILITY を使うことにします。

シリアル通信では TX RX GND の引き出しが必要ですから、今後のことを考えてユニバーサル基板(再利用品)に乗せてみました。

四隅のピンだけをユニバーサル基板に真鍮の針金ではんだ付けして、その他の端子はその都度はんだ付で引き出す予定です。とりあえずTX、RX、GNDを引き出しました。特に理由はないのですが USART2(TX=PA_2、RX=PA_3)を使うことにしました。

プログラムはwebにあるサンプルを使っています。ただ、今のIDE環境ではこのボードのピン指定は PA_2 のように大文字で書き、かつアンダースコアを入れておかないとコンパイル時にエラーになります。

プログラムは次のとおりです。
#include "mbed.h"
 
Serial pc(PA_2, PA_3); // tx, rx
//Serial pc(USBTX, USBRX); // tx, rx
 
int main() {
    pc.printf("Hello World!");
    while(1) {
        pc.putc(pc.getc() + 1);
    }
}
シリアル通信はデフォルトで、9600bps、8ビット、ノンパリティだそうです。
TX、RX端子をUSB-シリアル変換器を経由してPCにつなぎ、teratarmを起動して、リセットボタンを押すとHello World!と表示され、キーボードから文字を送るとアスキーコード+1の文字が返ってきました。シリアル通信はこの形でできるようです。

これだけの内容ですが、ROM使用量は 23.9kB とかなり大きくなっています。ROM容量が64kBあるのでそこそこには使えると思うのですが思いの外ROMを消費します。      



 5 arduino-IDEで使う  2016.10.03
STM32F103C8T6をaruduinoとして使う(aruduino-IDEで使う)方法がこのサイトで紹介されています。トレースして実現を試みましたが、結果的に十分理解できず書き込み方法がわかりませんでした。しかし、手元にある st-link V2 で書き込めば Arduino-IDE で作成したプログラムが書き込み・実行できることが分かりました。
https://github.com/rogerclarkmelbourne/Arduino_STM32/wikiのinstallationに従って、
@ Arduino_STM32-master.zipをダウンロードし、解凍しました。
A できたArduino_STM32-masterをC:\Program Files (x86)\Arduino/hardweareにコピーしました。
B この中の drivers\win\install_drivers.bat を実行しました。(その他に幾つかの操作をしましたが覚えていません多分関係ないと思います)
以上の作業が終わった時点でarduino-IDEを起動します。そして、
@ メニュー→ツール→ボード から ボードマネージャーを起動して、Arduino SAM Boards(32bits ARM Cortex-M3)…をインストールします。
A メニュー→ツール→ボード で ARM の選択肢が出るから、Generic STM32F103C series を選び、
B メニュー→ツール→variant… で 64k Flash のものを選びます。
C メニュー→ツール→Upload Method:"STLink"を選びます。
この状態でArduino-IDEでプログラムを書き「右矢印マーク」(コンパイルと書き込み)ボタンをクリックするとST-LINK経由で書き込まれます。
(記述に間違いがあるかもしれませんが確認できません)

プログラム"blink"
void setup() {
  pinMode(PC13, OUTPUT);   // PC13に変更 PC13にLED
}

void loop() {
  digitalWrite(PC13, HIGH);
  delay(1000);
  digitalWrite(PC13, LOW);
  delay(200);
}
プログラム"serial_test"
void setup(){
  Serial2.begin(19200);
  Serial2.println("Hello Serial 2");
}

void loop() {
    Serial2.println("Hello World!");
    while(1) {
        Serial2.write(Serial2.read() + 1);
    }
}
ハードウエアは USART2 を引き出しています。 TX、RXはUSB-シリアル変換器経由でPCに接続しています。
teratarmで通信しました。 aruduinoには"printf"関数はありませんが、約13kBのプログラムとなり、mbedより小さなROMで動くようです。(mbedでは約23kBになりました)

(2016.10.04) ブートローダーを書き込むと USB-シリアル変換器 で書き込みができるようですが、ジャンパーピンを毎回差し替えなければならないようです。現在、手持ちの ST-LINK があり、これだと切り替えが必要なく、かつ、aruduino-IDEから直接書き込めるので便利です。ブートローダーの利用は考えないことにします。     



 6 arduino-IDE U いろいろテスト
2016.10.06 一つのプログラムの中に複数のテスト項目を書き込み、teratarm表示のメニューを選択することで各項目のテストができるように考えました。


メニューはとりあえず次のとおりです。リセットで選択できます。
--- MENU ---
1 blink02
2 blink2_1
3 serial to PC
4 LCD
5 --- ---
     1 -- 5 ?
メニュー1は内蔵LEDの速い点滅です。
メニュー2は内蔵LEDの遅い点滅です。
メニュー3はPCのteratarmに文字を送ります。(ここまでで 13,652バイト)
メニュー4はLCD(1602)に文字列を書き込みます。(ここまでで 14、564バイト)

ボードの使用端子:
  USART2 - PA2:TX PA3:RX
  LCD - PB10:rs PB11:en PB12:D4 PB13:D5 PB14:D6 PB15:D7 
    付 LCDコネクタ 1:GND(黒) 2:Vcc(橙) 3:RS(茶) 4:EN(黄) 5:D4(緑) 6:D5(青) 7:D6(灰) 8:D7(白)
  I2C1 - PB6:SCL PB7:SDA (予定)

プログラムです。


    





 7 mbed いろいろテスト 
2016.10.09 aruduinoで始めたのですが、I2Cで行き詰ったので本来のmbedで同じことを試みました。
一つのプログラムのなかでteratarmのメニューによって幾つかの動作をテストする方法です。実験で適当に増やしていますので無駄なことも入っています。
 --- M E N U ---
1 led blink 02_1   LED早い点滅
2 led blink 2_1    LED遅い点滅
3 serial to PC    teratarmで通信
4 LCD         キャラクタLCD表示
5 CLOCK_1       時刻表示LCD
6 CLOCK_2 SD     時刻・気圧・温度表示 および SD記録
  1 -- 6 ?

使用したポートは
serial: USART2 PA_2 PA_3 //tx,rx
lcd: PB_10,PB_11,PB_12,PB_13,PB_14,PB_15  // rs, e, d4-d7
I2C: PB_7, PB_6 // sda, scl
SD: PA_7,PA_6,PA_5,PA_4, "sd" //mosi,miso,sck,cs

LPC1114ではできなかったSDカード記録ですが、流石にこれでは可能でした。しかし、ROMを64kB中55kBを消費しています。良いところもあるのでしょうがROMの使用量は想像を超えています。
なお、テストのため1秒毎の日付・時刻・気圧・温度を記録しています。
//Nucleo_serial22_NUCLEO_F103RB
#include "mbed.h"
#include "TextLCD.h"  //Copyright (c) 2007-2010, sford, http://mbed.org
#include "I2C.h"
#include "BMP180.h"  //Copyright (c) 2014 Kenji Arai / JH1PJL
#include "SDFileSystem.h"  //Copyright (c) 2016 Neil Thiessen
 
//Create an SDFileSystem object
SDFileSystem sd(PA_7,PA_6,PA_5,PA_4, "sd");
 
Serial pc(PA_2, PA_3); // tx, rx
I2C i2c(PB_7, PB_6);        // sda, scl
DigitalOut led(PC_13);
TextLCD lcd(PB_10,PB_11,PB_12,PB_13,PB_14,PB_15); // rs, e, d4-d7
BMP180      bmp180(PB_7,PB_6);   // Bosch sensor dat clk


const int addr1 = 0xd0; // define the I2C Address 8bits RTC DS3232
 
int main() {
    
    char s[20],d[10];
    uint8_t day,hour,min,sec,year,month,t0,t1;
    lcd.cls();wait(0.5);
    
   //Mount the filesystem
    sd.mount();    
    
    pc.printf("%s\r","--- M E N U ---");
    pc.printf("%s\r","1 led blink 02_1");
    pc.printf("%s\r","2 led blink 2_1");
    pc.printf("%s\r","3 serial to PC");
    pc.printf("%s\r","4 LCD ");
    pc.printf("%s\r","5 CLOCK_1");
    pc.printf("6 CLOCK_2 SD\n\r");
    
    pc.printf("%s\r"," 1 -- 5 ? ");
    char c=pc.getc();
    
    if(c=='1'){
        while(1) {
            led = 1;
           wait(1);
            led = 0;
            wait(0.2);
        }
    }
            
   if(c=='2'){
        while(1) {
            led = 1;
            wait(1);
            led = 0;
            wait(2);
        }
    }
        
   if(c=='3'){
        pc.printf("%s\r","Hello World! 999");
        while(1) {
            led = 1;
            wait(0.1);
            led = 0;
            wait(0.1);
        }
    }
        
   if(c=='4'){
       lcd.cls();
       lcd.locate(1,0);//int column,  int row 
       lcd.printf("Hello World!\n");
       wait(2);
       lcd.locate(2,1);//int column,  int row 
       lcd.printf("2016.10.08 SAT");
       while(1) {
            led = 1;
            wait(0.1);
            led = 0;
            wait(0.05);
        }
    }
        
   if(c=='5'){
        pc.printf(" Clock on LCD\n\r");  
        while(1){//--2
            s[0]=0; s[1]=0;
            i2c.write(addr1,s,1,true);
            i2c.read(addr1|1,d,3);

            lcd.locate(0, 0);
 
//            lcd.writeCommand(12); wait(0.1); //cursor off
            lcd.locate(0, 1);
            lcd.printf("                ");
            lcd.locate(0, 0);
            lcd.printf(" TIME %d%d:",d[2]/16,d[2]%16);//hour
            lcd.printf("%d%d:",d[1]/16,d[1]%16); //min
            lcd.printf("%d%d"  ,d[0]/16,d[0]%16);  //sec
            wait(0.1);
        }// end of while 2


   }
   
   if(c=='6'){
        pc.printf(" Clock on LCD\n\r");
        while(1) { //--2
            s[0]=0;
            s[1]=0;
            i2c.write(0xd0,s,1,true);
            i2c.read(0xd0|1,d,7);

            year=(d[6]/16)*10+d[6]%16;
            month=(d[5]/16)*10+d[5]%16;
            day =(d[4]/16)*10+d[4]%16;
            hour=(d[2]/16)*10+d[2]%16;
            min =(d[1]/16)*10+d[1]%16;
            sec =(d[0]/16)*10+d[0]%16;

//            lcd.writeCommand(12);   //cursor off
            wait(0.05);             //cursor off
            lcd.locate(0, 0);
            lcd.printf("%d/%2d/%2d ",year,month,day);
            lcd.locate(0, 1);
            lcd.printf("%2d:%02d:%02d ",hour,min,sec);
            
            if(sec%10 == 0) { // per 10secs lcd display pressure
                        //  ---------- Barometer Sensor / BMP180 ---------------
                bmp180.normalize();
                lcd.locate(10,0);
                lcd.printf("%4.0f  ",bmp180.read_pressure()+4.4);
                lcd.locate(10,1);
                lcd.printf(" %2.1f ",bmp180.read_temperature() );            
            }
    
            t1=min;
            if(t1 != t0){
                //Perform a write test
                pc.printf("\nWriting to SD card...");
                FILE *fp = fopen("/sd/sdtest.txt", "a");
                if (fp != NULL) {
                    fprintf(fp, "%d/%2d/%2d %2d:%02d:%02d %4.0f   %2.1f \r"
                            ,year,month,day,hour,min,sec,
                            bmp180.read_pressure()+4.4,bmp180.read_temperature() );
                    fclose(fp);
                    printf("success!\n");
                } else {
                    printf("failed!\n");
                }
                t0=t1;
            }        
        }
    }
}
    



 8 arduino ブートローダー書き込み   2019.02.11

 このページ(STM32F103)に出会って、arduinoとして使えるのではないかと思い試してみました。結果としてST-LINKで boot loader を書き込むことができ、ライターなしで使えることがわかりました。
上に書いたようにArduino-IDEで使えるようにしていたのですがHDD(SSD)の交換でwin10をクリーンインストールしてからSTM32F103C8T6関係の設定をしていなかったのではじめからやり直すことになりました。
この記事で私の所有しているものは Blue Pill (STM32F103 minimum development board) と呼ばれているようです。
Arduino-IDEにボードを追加:IDEの「ツール」→「ボード」→「ボードマネージャー」でArduino SAM Boards (32-bits ARM Cortex-M3)を探して最新バージョンをインストールしました。

Arduino_STM32 の導入:  STM32F103の記事に従って https://github.com/rogerclarkmelbourne/Arduino_STM32のページの[Clone or Download] ボタンを押し、[Download ZIP] で Arduino_STM32-master.zip ダウンロードして、解凍して得られた Arduino_STM32-master を <Arduino IDE インストールフォルダ>\hardware フォルダに( Arduino_STM32-master をArduino_STM32にフォルダ名を変えて)移動しました。
続けて、drivers\win フォルダにある install_drivers.bat を ([管理者として実行] で) 実行し、USB DFU / Serial ドライバをインストールしました。

ST-Link で STM32duino ブートローダーを書き込み: 他の方法もあるようですがST-Linkを持っていますのでこの方法を使うことにしました。
STM32F103の記事は非常に丁寧に書かれていますのでその通りを実行しました。ST-Linkを使うには ST-LINK Utility が必要ですが以前にダウンロードして使える状態にありました。記事に従ってST-LINK 「ファームウェアのアップデート」して、ST-LINK Utility を起動。
ST-Link に STM32F103 ボードを接続する。
STM32F103 ボードの BOOT 0 ジャンパを 1 側にセットする (ISP ブートモード)
[Target | Program & Verify...]を押す
Blue Pill の場合、File path に generic_boot20_pc13.bin を指定する
[START] ボタンを押す。
ブートローダーが書き込まれる
STM32F103 ボードの BOOT 0 ジャンパを 0 側にセットする (FLASH ブートモードに戻しておく)

テストラン: Arduino-IDEを起動して Blink を準備します。「ツール」の設定は
ボード: Generic STM32F103C series
Variant: STM32F103C8 (20k RAM, 64k Flash)
CPU Speed(MHz): 72MHz (Normal)
Upload method: STM32duino bootloader
シリアルポート: (Maple Mini) が見えていればそれを。(初回はポートが見えていなくても書き込めるそうです。)
ボードの指定を間違うと STM32Duino のブートローダーを簡単にフッ飛ばしますので注意してくださいとのことです。

通常のArduinoと全く同じ操作でスケッチを書き込むことができました。(成功!)

    





 9 arduinoとして復習など   2019.06.16

 久しぶりにSTM32F103C8T6を取り出しました。上に書いた方法でarduinoとして使えるようにブートローダを書き込んだものです。
常時使用のデスクトップPCには扱う環境ができていますので、復習をする意味を込めてノートPCに環境をとくりながら思い出していました。上に書いたとおり、@Arduino-IDEにボードを追加、AArduino_STM32 の導入、Bテストランと進むのですが、Aではインストールのバッチファイル実行を忘れて気づくまでに長時間かかったりなど不注意によるトラブルが続出でした。

トラブルの一つは、一応blinkが書けて動いていたのですがボードを触るとやけどをするほどに熱くなっていたことです。MCUではなく指で探してみると裏面の5V→3.3VのレギュレーターICでした。通常の電源につないでみると5Vでは150mAほど流れ、3.3Vにすると100mAほどに落ちます。電流が変わるのはおかしいと思いました。また、この電流は大きすぎます。そして、3.3Vにすると発熱がずいぶん少なくなりました。さらに、5V電源で3.3V端子の電圧を測ると4.1Vあり、高すぎます。
このことからレギュレーターの故障と判断しました。代わりの部品があればいいのですがあるはずがありません。手持ちの三端子レギュレータをつければ良いと考えましたが適当な場所がありません。いろいろといじっている間に三端子とボードの端子が同じ並びになっていることがわかりました。これならボードの丸穴端子(ピンヘッダ用のもの)にはんだ付けでよい。さらに、ブレッドボードにセットするなら直挿しでも良いとわかり写真のようにセットしました。電流値は50mAほどに落ち着き、3.3V回路も正常になりました。


二つ目のトラブルは、ノートPCではCOMポートが見えない、ということです。デスクトップPCでは問題なく Maple Serial(COM3) が見えるのですがノートPCの左のUSB(3.0)では見えないので書き込みができません。試しにと思ってハブを入れると正しく認識されます。また、左のポート(2.0)につなぐと正常に見えます。ハブを使えば問題はないのですが、落ち着くまで時間がかかりました。


    





 10 arduino+ST-Linkで   2019.06.27

 書き込みソフトのくせもわかってきたことと、BluePillを追加購入したことで、arduino+STLinkでしばらく遊んでみようと考えています。
arduinoは自分のPCだけで処理できるので落ち着いて扱えますが、mbedはweb上でなれないライブラリを探さねばなりません。また、.binファイルもarduinoのほうが小さくできるようです。
書き込みはarduinoのUSBでもできるのですが、STLinkを持っていること、書き込みが極めて速いこと、arduinoは書き込みごとにコンパイルしなければならないことがあってarduinoでコンパイルしてSTLinkで書き込む方法を取ることにしました。

STLink用のケーブルを作りました。

付属のケーブルがやや短く硬いことと、電源をUSBから取ることfを好まないので(5V、3V3の電源は常にある。電流がいつも読める。)Vccのない3線のケーブルを作りました。ロボットケーブルを使ったので柔らかくて扱いやすいです。
結線方法をよく忘れますのでここに写真を置きます。



(2019.07.31追記)プログラムの書き込みは ツール → Update Method "STLink" でArduino-IDEから直接できます。
 



    




























工事中























 2 予    定   2016.00.00

    








inserted by FC2 system