ZephyrRTOSでSTM32マイコン再入門~USARTでループバック~

に公開

はじめに

これまでWindows上にZephyrRTOSの開発環境を構築し、NucleoF103RBボードを用いて学習を進めてきた。
https://zenn.dev/gotoooo/articles/894213f95372bd

今回は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