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 の本家である
ではソフトウェアシリアルは使えないようです。