STM32に搭載されているUSARTの機能を使ってみます。
ここまで出来れば、作りたいGPSロガーができそうです。
STM32CubeMX
USART1 を有効にします。
プロジェクトを読み込みます。
Peripherals >> USART1 にある Mode を Asynchronous を選択します。
Configuration タブに移動し、 USART1 をクリックします。
Parameter Settings タブを選択します。 Baud Rate を 9600 Bits/s に、 Word Length を 8Bits (including Parity) に設定します。
ここまで設定したら、コードを生成します。
ハードウェアについて
Macと接続して通信するためには USBシリアル変換基板 が必要です。
FT232RL USBシリアル変換モジュールキット: 半導体 秋月電子通商 電子部品 ネット通販 あたりが無難と思われます。入手が容易だし安いです。電子工作をされている方でUSBシリアルが必要でこちらを選択している人は多そうです。
なお、当方は今回、過去大阪の日本橋にある共立電子で購入したものを使用しました。
電子ホビー – 赤フグ株式会社 – FTDI Adapter ←こちらだと思います。どのUSBシリアル変換基板を使用するとしても3.3Vに設定しましょう。
Microsoft Windowsの合はデバイスドライバが必要ですが、LinuxやMacの場合は不要です。
/dev/tty.usbserial-◯◯ などというファイル名で見えます。
Eclipse
Eclipseから以下のようなコードを記述します。受信した情報を送信するという単純なものです。
int main(void) { /* USER CODE BEGIN 1 */ HAL_StatusTypeDef stat; uint8_t c; /* USER CODE END 1 */ : : /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ stat = HAL_UART_Receive(&huart1, &c, 1, 1); if (stat == HAL_OK) { stat = HAL_UART_Transmit(&huart1, &c, 1, -1); } } /* USER CODE END 3 */ }
ところで、こちらの動作確認を行う場合はUSBシリアルとの送受信が必要となります。真っ先に思い浮かぶのは通信ソフトを使用することでしょうが、LinuxやMacならターミナルから screen コマンドを使用する方法もあります。
screen<通信速度>
例えば screen /dev//dev/tty.usbserial-◯◯ 9600 と入力します。
終了は(デフォルトでは) CTRL-a k です。つまり、CTRL-a の後、 k を押すということです。何かと便利なので、知っておいて損はないコマンドだと思います。
閑話休題
USARTもそうだけど、上記のタイムアウト時間を指定して送信/受信する関数以外にタイムアウト時間を指定しない関数、割り込みハンドラを内部を記述するものがあります。上記の場合は受信データが対向側から送信されない場合、 HAL_UART_Receive() は最終の引数で指定した時間(ms)だけ待たされます。今回記述したサンプルだと1msですね。
どのように処理するのが最適なのかについては、情報収集や試行錯誤が必要そうです。
- 割り込みハンドラを使うのが一番効率的そうだけどたくさんの処理を行っても大丈夫なのか?
- OS(FreeRTOS等)を使った場合にどれくらいROM/RAMが増えるのか?また消費電力の差は?
- DMA転送を組み合わせた方が消費電力が減るのか?
- 省電力(STOPモード)を組み合わせた通信は可能か?またそれを使用しない場合の消費電力の差は?
ともあれ、まずは動くモノを仕立て上げなければ。
更に閑話休題
実際にGPSモジュールからのシリアル送信されたデータをSTM32に入力させたところ、どうもうまく受信できませんでした。
どうも、HALドライバの出来がよろしくないようで。
シリアル送受信時の割り込み時に呼び出されるコールバックでバッファリングするという定石で作らないといけないよう。
HALドライバでUARTに関して動かないという情報はWEB上にいろいろ上がっているようだけど、対策についての記載があまりないみたい。
困ったことに、HALドライバについてくる付属してくるExampleもしょぼい…
ちょっと時間がかかりそうです。