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のピン名の定義はこちらのmbedが出しているf401reの概要ページにあります)

テストプログラム

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

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();//念のため
}
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が出しているユーザーマニュアルをみると、8.3 USART communicationに(この記事ではUARTとして使っていますが)、USART2はデフォルトではPA_2/PA_3には繋がっていなくて、代わりにSB13とSB14を介して仮想COMと繋がっているとあります。

さらにページを進めると、それっぽい図も出てきます。
(下の画像のSB62/SB63の橋みたいなところを繋げたらつながりそう)

下の画像はFigure 29. ST-LINK/V2-1の一部です。PA2/PA3がSB14/SB13を介してSTLINKのTX/RXと繋がっています。

f401reの裏面の赤枠の部分、SB62/SB63を繋げてSB13/SB14の0Ω抵抗を外します。

.
.
.
できました。

プログラムを実行すると、1秒周期でLチカしているのが確認できました。

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

まとめ

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

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