BluePillのシリアルポート
http://wiki.stm32duino.com/images/a/ae/Bluepillpinout.gif

この図によると、
| PIN NAME | USART |
|---|---|
| PA9 | TX1 |
| PA10 | RX1 |
| PB6 | TX1 |
| PB7 | RX1 |
| PA2 | TX2 |
| PA3 | RX2 |
| PB10 | TX3 |
| PB11 | RX3 |
はて?
TX1とRX1が2つありますね。
そういえば、Arduino開発環境(STM32duino)上ではUSBポートが仮想シリアルポートになっていてシリアルモニターなども使えるようになっていますね。ソフトウェアシリアルとの兼ね合いも含め、そこらへんどうなるのか調べてみました。
STM32duinoでのSerialオブジェクト
こんな感じのプログラムで調べてみました。
void setup(){
Serial.begin(19200);
while (!Serial.isConnected()) delay(100);
Serial.println("Serial port");
}
...
これがどこに出力されるかは、 Upload Method によって異なりました。
| Upload Method | Serialオブジェクトの出力先 | Upload接続先(Blue Pill上の物理ポート) | Upload接続に使用したハードウェア | Linux上のデバイス |
|---|---|---|---|---|
| STM32duino bootloader | Blue Pill 上のmicroUSBコネクタ | Blue Pill 上のmicroUSBコネクタ | Micro USB ケーブル | /dev/ttyACM0 (Maple Mini) |
| Serial | PA9 TX1 PA10 RX1 | PA9 TX1 PA10 RX1 | 秋月電子「FT232RQ USBシリアル変換キットシリアルアダプタ」 | |
| STLink | Blue Pill 上のmicroUSBコネクタ | SWD(シリアルワイヤデバッグ)ポート | ST-LINK/V2(の多分パチモン) |
Serial1,Serial2,Serial3
ハードウェアシリアルポートが沢山ありますが、それはどこにつながっているか?
USBブートローダーから書いた場合およびST-Linkで書いた場合
| PinName | Signal | Serial Object |
|---|---|---|
| PA9 | TX1 | Serial1 |
| PA10 | RX1 | Serial1 |
| PB6 | TX1 | |
| PB7 | RX1 | |
| PA2 | TX2 | Serial2 |
| PA3 | RX2 | Serial2 |
| PB10 | TX3 | Serial3 |
| PB11 | RX3 | Serial3 |
TX1とRX1にUSBシリアルをつなげて書いた場合
| PinName | Signal | Serial Object |
|---|---|---|
| PA9 | TX1 | Serial |
| PA10 | RX1 | Serial |
| PB6 | TX1 | |
| PB7 | RX1 | |
| PA2 | TX2 | Serial1 |
| PA3 | RX2 | Serial1 |
| PB10 | TX3 | Serial2 |
| PB11 | RX3 | Serial2 |
うーむ、USBによる仮想シリアルポートが使えるときはそれがSerialオブジェクトに、そうでなければUSART1がSerialオブジェクトになり、それぞれで番号がずれるみたいですね。
ちなみにTX1とRX1にUSBシリアルをつなげて書いた場合、Serial3を指定するとエラーとなりました。
STM32F103チップのシリアルポート
ところで、上の図のPB6,PB7にあるTX1、RX1とは何でしょう?
これによると、STM32F103CxのUSARTは3つある。
| PIN名 | USART | Default/Remap |
|---|---|---|
| PA9 | USART1_TX | Default |
| PA10 | USART1_RX | Default |
| PB6 | USART1_TX | Remap |
| PB7 | USART1_RX | Remap |
| PA2 | USART2_TX | Remap |
| PA3 | USART2_RX | Remap |
| PA10 | USART3_TX | Remap |
| PA11 | USART3_RX | Remap |
ということで、ソフトウェアの指定によってUSART1はPA9/PA10からPB6/PB7にリマップできるそうです。
まだ調べてませんが、Arduino開発環境でもそういった設定ができるのかも知れませんね。
STM32duino の仮想シリアルポート
AVRを使ったArduino開発環境では、割と仮想シリアルポートが自由に使えるのでSTM32duinoでも使えるのかと思ってましたが
#include <SoftwareSerial.h>
とするとエラーが出ました。
http://www.stm32duino.com/viewtopic.php?f=13&t=6
こういった議論や開発もされているようですが、少なくとも STM32duino の本家である
ではソフトウェアシリアルは使えないようです。