Nucleo Board STM32F401reのUART2を使う

#はじめに
f401reは3つのUARTが使えるのですが、その内の1つが購入時の状態だと使えなかったので使えるようしました。

今回の記事ではPlatformIO IDE for VSCodeを使っていますが、記事の本題とはあまり関係ないです。



# 動作環境
今回の動作環境は

+ Windows10
+ PlatformIO IDE for VSCode
+ STSTM32(ver4.4.0)

STSTM32はmbed対応のstm32bitマイコンをmbedで書くためのPlatformIOのプラットフォームの1つです。

# 配線
パソコンとMini USBをつなぐだけでf401reの電源が入るように、リセットボタンのすぐ下にあるジャンパをPWRがU5Vと繋がるように差し替えます。
一応抵抗を間に挟んでUART1のTXピン(PA_9)とUART2のRXピン(PA_3)をつなぎます。
(mbedで使うf401reのピン名の定義は[こちら](https://os.mbed.com/platforms/ST-Nucleo-F401RE/)のmbedが出しているf401reの概要ページにあります)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414367/82d239a0-7275-45d4-826f-91ce0e14249c.png)


# テストプログラム
UART1のTXから適当な信号を送ってUART2で受け取ったらLチカするだけの簡単なプログラムです。

```c++:src/main.cpp
#include <mbed.h>

void Receiving();//受信時割り込み

Serial send(PA_9, PA_10, 19200);//(TX, RX, baud)
Serial receive(PA_2, PA_3, 19200);
DigitalOut userLED(PA_5);//LD2

int main() {
  userLED = 0;
  receive.attach(&Receiving,Serial::RxIrq);
  while(1) {
    send.putc('a');
    wait(0.5);
  }
}

void Receiving(){
  userLED =!userLED;//Lチカ
  receive.getc();//念のため
}
```
```ini:platformio.ini
; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[env:nucleo_f401re]
platform = ststm32
board = nucleo_f401re
framework = mbed
```

# 本題
しかしこれだけではUART2を使うことはできません。
STMicroelectronicsが出している[ユーザーマニュアル](https://www.st.com/content/ccc/resource/technical/document/user_manual/98/2e/fa/4b/e0/82/43/b7/DM00105823.pdf/files/DM00105823.pdf/jcr:content/translations/en.DM00105823.pdf)をみると、8.3 USART communicationに(この記事ではUARTとして使っていますが)、USART2はデフォルトではPA_2/PA_3には繋がっていなくて、代わりにSB13とSB14を介して仮想COMと繋がっているとあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414367/5434171d-fa15-dc6f-c1a1-365c0561ba97.png)

さらにページを進めると、それっぽい図も出てきます。
(下の画像のSB62/SB63の橋みたいなところを繋げたらつながりそう)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414367/f645c57d-4ccf-0f72-a4e9-5f9a7a0e8447.png)

下の画像はFigure 29. ST-LINK/V2-1の一部です。PA2/PA3がSB14/SB13を介してSTLINKのTX/RXと繋がっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414367/604a121f-7dba-8e0e-92c0-93c30d0bff1f.png)

f401reの裏面の赤枠の部分、SB62/SB63を繋げてSB13/SB14の0Ω抵抗を外します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414367/c52812fc-c366-486c-0eec-a4e60c0a9cbd.png)
.
.
.
できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414367/5fb95acc-6d2b-e6d9-2ec0-62423591d16e.png)

プログラムを実行すると、1秒周期でLチカしているのが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414367/d699ed4a-21e3-b80d-b36b-0ad28303a9ee.png)

送るのをUART2に変えてもLチカできたので、TXRX共に正常に動いているようです。

# まとめ
このピンの接続法(というかボードの設計)はMB1136をベースにした STM32 Nucleo-64マイコンで共通らしいのでnucleo f411reやその他のマイコンでも同様の作業を行う必要がある。
そしてこの作業をするとUSBTX/USBRXが使えなくなる(debug時とかにこの名前でSerialをつくればマイコンをパソコンと接続するだけでTera Termかなんかを使って通信できる)。
が、今回自分はその機能は必要なかったしまあいいかなと思う。

また、自分のメモ用にと思って初めてQiitaで記事を書いてみたが、それにあたって色々なサイトを調べてより理解が深まったので、また何かあれば記事を書いていこうと思う。