MicroPython的午睡(90) STM32F401RE、UART6はOK、UART1?

Joseph Halfmoon

前々回はSPI、前回はI2C、ときて今回はUART接続のテストです。Nucleo-F401REボードのマイコンであるSTM32F401REは非同期通信だけでなく同期式もできる回路なのでUARTでなくUSARTと唱えます。このUSARTを3チャネル搭載、好き勝手に使えるのかいなと思って実験してみたら、そうでないような。

※「MicroPython的午睡」投稿順 Indexはこちら

※ST Microelectronics社製Nucleo-F401REボード上で使用しているSTM32版MicroPythonについてはこちら

STM32F401REのUSART

STM32F401REはUSARTを3チャネル搭載していますが、STM32シリーズ内での「互換性」のため、飛び飛びの番号で呼ばれています。USART1、2、6搭載。そのうちUSART2については、Nucleo-F401REボードではオンボードのST-LINK「デバッガ」のUSBポートを経由してホストの仮想シリアルポートに接続するようになってます(ボード裏面を細工すれば他の目的に使用可能ですが、デバッグ不便になるのでUSART2は使わんとこう。)

残るはUSART1と6なので、当初USART1のUART使いで実験しようとしてハマりました。MicroPython上でエラーでまくり使えませぬ。それならばということで、UART6に変更したところすんなり動きました。なんでUART1が使えないのだろ~。要調査であります。

表にまとめたものを以下に。

USART# TX pin RX pin 適用
1 PB6 PB7 使用不可?
2 PA2 PA3 USB仮想COMポートに接続
6 PC6 PC7 使用可

まあ、とりあえずUART6は動作するみたいだったので、今回はこれを使って送受信ができることだけテストしておきます。

実験用のMicroPythonコード

簡素な(簡素すぎる)実験コードが以下に。

from pyb import UART
import time
uart6 = UART(6, 9600)
uart6.init(9600, bits=8, parity=None, stop=1)
while True:
    uart6.write('HELLO!\r\n')
    rc = uart6.readchar()
    if rc > 0x20:
        print(chr(rc))
    time.sleep(2)

ご覧いただければお分かりのように、2秒に1度、通信先にHELLOし、また一文字受信し、受信文字を仮想COMポート側にprintしてます。意味なしコードですが、通信ができていることは確認できるっと。

MicroPythonの日本語マニュアルの該当しそうなページが以下に。

クラス UART — 二重シリアル通信バス

実機動作結果

通信相手には、パソコンのUSBポートに接続したUSBシリアル変換器を経由して伝統のTeraterm Proを使わせていただいてます。

MicroPythonの上記ソースを起動すればダラダラと送り付けられてくるHELLO!の列が以下に。まあSTM32F401RE側からのTXはOKだと。STM32uart6TX
一方、上記のTeraterm画面で適当にキーを押してみると(ローカルエコー無なのでTeraterm上は何も見えないけれども)、printの先はこんな感じ。STM32uart6TX

RX側もちゃんと受信しているみたい。UART6は動いたのに、UART1が動かないのはなんでだろ~ 不思議だ。

MicroPython的午睡(89) STM32版、I2C接続EEPROM読み書きテスト へ戻る

MicroPython的午睡(91) STM32F401RE、USART(USART)の続き へ進む