✨
ZephyrRTOSでSTM32マイコン再入門~USARTでループバック~
はじめに
これまでWindows上にZephyrRTOSの開発環境を構築し、NucleoF103RBボードを用いて学習を進めてきた。
今回はZephyrでのUSARTの使い方を学ぶ。
サンプルプログラムは見当たらなかったのでUSART送受信のミニマムなコードを自作した。
なお、動作確認にあたってUSB-Serialボードを使用する。
ハードウェアの接続
NucleoF103RB と USB-Serial の接続は次のとおりである。
ピン | 機能 | 接続先 | 備考 |
---|---|---|---|
PA_9 | Serial1 TX | USB-Serialボード RX | |
PA_10 | Serial1 RX | USB-Serialボード TX | |
GND | GND | USB-Serialボード GND |
なお、PlatformIOにインストールされるZephyr環境のNucleoF103RBのデバイスツリーでは予めUSART1(Serial1)が有効化されていた。もし有効化されていない場合、デバイスツリーのoverlayファイルを作成してUSART1を有効化する必要がある。このあたりの仕組みは今後必要になった際に調べることとする。
コード
main.cのコード全体
main.c
#include <zephyr/kernel.h>
#include <zephyr/drivers/uart.h>
#include <zephyr/sys/printk.h>
const struct device *uart1_dev = DEVICE_DT_GET(DT_NODELABEL(usart1));
const struct device *uart2_dev = DEVICE_DT_GET(DT_NODELABEL(usart2));
int main(void)
{
if (!device_is_ready(uart1_dev) || !device_is_ready(uart2_dev)) {
printk("UART device not ready\n");
return -1;
}
printk("UART bridge started\n");
while (1) {
unsigned char c;
int ret = uart_poll_in(uart1_dev, &c);
if (ret == 0) {
uart_poll_out(uart2_dev, c);
}
k_msleep(1);
}
return 0;
}
デバイスツリー
usart1, usart2は以下のように定義されている。
いずれもボーレートは115200bpsであり、usart1はPA9(TX), PA10(RX)、usart2はPA2(TX), PA3(RX)に割り当てられている。
データ送受信
unsigned char c;
int ret = uart_poll_in(uart1_dev, &c);
if (ret == 0) {
uart_poll_out(uart2_dev, c);
}
uart_poll_inでusart1から1バイト受信し、受信に成功した場合はuart_poll_outでusart2に1バイト送信している。
処理の中身を追っていくと以下のコードにたどり着いた。
-
受信
-
送信
おわりに
今回は最小限のループバック処理を実装し、ZephyrでのUSARTの使い方を学んだ。
今後は割り込み、DMA転送などより実践的な機能を調べていきたい。
Discussion