NUCLEO-F302R8 wifi ATコマンド
NUCLEO-F302R8でwifi通信することが目標です。
NUCLEO-F302R8にwifiの機能はありません。ESP32-WROOM-32-DevKitCをUARTで繋ぎ、wifi機能を使用して通信をします。
リファレンス
- マイコンのRM(リファレンスマニュアル)
- マイコンのDS(データシート)
- DS: https://www.st.com/resource/en/datasheet/stm32f302r6.pdf
- マイコンのPin配置やポートの機能一覧、HW特性
- マイコンのPM(プログラミングマニュアル)
- ESP32 ATコマンド ユーザガイド
HW構成

ESP32-WROOM-32-DevKitCのセットアップ
ESP32-WROOM-32-DevKitCをUART通信でATコマンドを送受信できるようにします。
以下の記事を見てください。
https://rt-net.jp/mobility/archives/20230
記事の補足
ESPセットアップ時のHW構成

セットアップでPCからESPにATコマンドを送信するために超小型USBシリアル変換モジュールを使用します。
https://akizukidenshi.com/catalog/g/g108461/
ESP32 書き込みツール
- 書き込むファイル、アドレスを設定した後に左のチェックも入れること。

HWの接続
- 超小型USBシリアル変換モジュールにピンヘッダが付属しています。はんだ付けが必要です。
- 超小型USBシリアル変換モジュールから5Vが出力されます。ESP32-WROOM-32-DevKitCの5Vに入力できます。
- Tx/Rxはクロスします。

ボーレートの設定
ESP32のデフォルトのボーレートは115200ですが、9600に変更して使用します。
9600で使用する理由は以下の通り。
- このプロジェクトのF302R8のクロックをデフォルトの8MHzに設定しています。
- UARTで使用するクロックも8MHzになり、115200のボーレートを設定するとエラーが発生して通信がまともにできなかったので。
ボーレートは以下のコマンドで変更できます。
AT+UART_DEF=<baudrate>,<databits>,<stopbits>,<parity>,<flow control>
SW構成
FreeRTOSのTCPモジュールを使ってみます。

https://github.com/FreeRTOS/FreeRTOS-Plus-TCP/releases/tag/V4.0.0
FreeRTOS TCPモジュールの組み込み
公式のチュートリアルをなぞります。
https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/TCP_Networking_Tutorial.html
Source Code Organisation
読み物だけです。
Adding FreeRTOS-Plus-TCP To a FreeRTOS Project
- Add the following core FreeRTOS-Plus-TCP source files into your project
記載の通りソースをプロジェクトに追加します。 - Add the driver for your network interface (the MAC or Ethernet driver) into your project.
ここがメインです。外部のWIFIモジュールをUARTで動かすネットワークインターフェースがなかったので、ネットワークインターフェースを自作します。(後述) - Add the common PHY handling implementation
PHYはイーサネットやWIFIの物理層のことです。このプロジェクトでは外部のWIFIモジュールを使用します。物理層を制御することはないため不要です。 - Add the following core TCP/IP directories into your compiler’s include path
手順の通りにインクルードパスを追加します。 - Add a FreeRTOSIPConfig.h header file to your project
TCP/IPのコンフィグ設定を行います。IPv6で通信してみたいので、IPv6だけ使用する設定にしています。FreeRTOSIPConfig.h
補足
TCPモジュールを含めてビルドしたときに発生した問題についてメモを残しておきます。
- 標準ライブラリで使用されるシンボルが未定義でリンクエラーになる
ビルドすると次の記事のようなリンクエラーが発生します。リンクエラー
TCPモジュールでsnprintfが使われているところがあり、そこで標準ライブラリがリンクされてしまうようです。そこをコメントアウトするとビルドができました。修正箇所 - .textセクションのサイズオーバー
ビルドするとF302R8のFlash(64KByte)に入りませんでした。原因はコンパイラの最適化をOFF(-O0)にしていたことでした。
最適化(-O1)を設定してビルドすると入りました。ただし、レジスタを使用しているコードは適宜Volatileを付けないと意図通りに動かなくなります。
コード
確認用のATコマンドを送信して応答が返るところまで確認したコードです。
https://github.com/ohmusso/NUCLEO-F302R8/tree/7cf1f7d6fa36a06fa203cf499bba14603a1e50ca
NetworkInterface
自作したNetworkInterfaceは以下のコードになります。
初期化シーケンス
sequenceDiagram
%% participant
participant main
participant FreeRTOS-Plus-TCP
participant NetworkInterface
%% main
main->>+NetworkInterface: FillInterfaceDescriptor
NetworkInterface->>+FreeRTOS-Plus-TCP: FreeRTOS_AddNetworkInterface
main->>+FreeRTOS-Plus-TCP: FreeRTOS_FillEndPoint_IPv6
main->>+FreeRTOS-Plus-TCP: FreeRTOS_IPInit_Multi
FreeRTOS-Plus-TCP->>+FreeRTOS-Plus-TCP: xTaskCreate(prvIPTask)
main->>+FreeRTOS-Plus-TCP: vTaskStartScheduler
%% task wakeup
FreeRTOS-Plus-TCP->>+FreeRTOS-Plus-TCP: prvIPTask
FreeRTOS-Plus-TCP->>+NetworkInterface: xNetworkInterfaceInitialise
NetworkInterface->>+NetworkInterface: initialize uart driver
NetworkInterface->>+FreeRTOS-Plus-TCP: xTaskCreate(NetworkInterface task)
通常シーケンス
sequenceDiagram
%% participant
participant FreeRTOS-Plus-TCP
participant NetworkInterface
participant Uart
%% task wakeup
NetworkInterface->>+NetworkInterface: NetworkInterface task
NetworkInterface->>+Uart: send AT command
Uart->>+NetworkInterface: receive AT command response
次回
PCとWifiで通信します。