前々回は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の日本語マニュアルの該当しそうなページが以下に。
実機動作結果
通信相手には、パソコンのUSBポートに接続したUSBシリアル変換器を経由して伝統のTeraterm Proを使わせていただいてます。
MicroPythonの上記ソースを起動すればダラダラと送り付けられてくるHELLO!の列が以下に。まあSTM32F401RE側からのTXはOKだと。
一方、上記のTeraterm画面で適当にキーを押してみると(ローカルエコー無なのでTeraterm上は何も見えないけれども)、printの先はこんな感じ。
RX側もちゃんと受信しているみたい。UART6は動いたのに、UART1が動かないのはなんでだろ~ 不思議だ。