目次: Zephyr
前回はシリアルに文字を出力するアプリを作って動かしました。肝心のシリアル出力をどうやって見るのか?これは「使うボードによる」が答えなんですけど、一例としてNUCLEO-F446REでのやり方を説明します。
NUCLEOボードはボードのどこかに型番(MBxxxxみたいな番号)が書いてあります。F446REの場合はMB1136です。この型番に対応する回路図(MB1136-DEFAULT-C05 Board schematic)をダウンロードしてください。
今回使ったボードのSoC STM32F446はシリアル送受信のハードウェアUSART/UARTを6つ持っています。Zephyrのデフォルト設定でIn/Outピンが割当たっているのは、6つのうち2つ(usart1とusart2)でした。それぞれのTX/RXのピンは下記の通りです。
先ほどダウンロードしたMB1136の回路図を見ると、usart1/usart2に割り当てられたピンは下記のように何らかのコネクタに接続されています。
Zephyrのデバイスツリーを見ると、シリアル出力にはusart2を使うようになっています。
/ {
model = "STMicroelectronics STM32F446RE-NUCLEO board";
compatible = "st,stm32f446re-nucleo";
chosen {
zephyr,console = &usart2;
zephyr,shell-uart = &usart2;
zephyr,sram = &sram0;
zephyr,flash = &flash0;
zephyr,canbus = &can2;
};
ハンダ付けできる環境があるなら、SB63やSB62を0Ω抵抗などでジャンパしてArduino Connector(CN9)の2番と1番にUARTケーブルを繋げばシリアル出力が見えるはずです。
ハンダ付け以外の方法として、シリアル出力先を変えてusart1にする方法を紹介します。シリアル出力先を変えるにはZephyrのデバイスツリーを書き変える必要がありますが、Zephyr本体のファイルを変更するとwest updateのときにZephyrが更新できなくなったりして面倒です。
素晴らしいことにデバイスツリーを後から書き換える便利な方法があって、アプリ側にオーバーレイ(Device tree overlay)ファイルを用意するだけでOKです。コンソール出力をusart2からusart1に上書きする例を示します。
/ {
chosen {
zephyr,console = &usart1;
zephyr,shell-uart = &usart1;
};
};
このファイルを作成したら再度アプリをビルドして、Arduino Connector(CN5) 3番とMorpho Connector(CN7) 21番にUARTケーブルを繋げばシリアル出力が見えるはずです。
** Booting Zephyr OS build v4.4.0 *** Hello, World!
うまくいけばこんな感じの出力が得られるはずです。動きましたね。
シリアル出力の受信方法は何でも良いですけど、これも一例を紹介します。まずUARTを送受信できるHWが必要です。私のおすすめは手軽なUSB接続のUARTケーブルです。秋月電子通商のFTDI USBシリアル変換ケーブル(3.3V)みたいなやつです。
PCに接続すると/dev/ttyUSBnのような名前で認識されるので、ターミナルソフトで開きます。pyserial-minitermを使う場合はこんな感じです。
$ sudo apt-get install -y python3-serial $ pyserial-miniterm /dev/ttyUSB0 115200 --eol LF --raw
オプション--eolは行末がCRかLFか指定します。--rawは印字できない文字(エスケープシーケンスなど)を加工せず素通しします。カーソルを移動させたり、色付きの文字を出力するアプリケーションを動かすならこのオプションがあると見やすいです。
ボードに接続する前にケーブルのTX/RXを確認すると良いです。
もし何も表示されない場合は/dev/ttyUSBnのデバイス指定を間違っている可能性が高いので確認してみてください。
この記事にコメントする
目次: Zephyr
前回ZephyrのOut-of-treeアプリがビルドできました。今回は実行と実行結果の確認です。あえてwestに頼らずOpenOCDとGDBで殴っていくスタイルで行きます。OpenOCDのビルド方法は以前(2026年6月2日の日記参照)紹介したのでそちらをご覧ください。使用機材は下記のとおりです。
PCとボードをUSB接続します。NUCLEOにはデバッガがオンボードで搭載されています。ボードのUSBコネクタ(CN1)は給電兼、デバッガの接続用です。NUCLEOは切り込みに沿ってボードを折るとデバッガ部分を物理的に切り離せるようになっていて、面白いですね。よく考えられているな〜と思います。

NUCLEO-F446RE、左側がメインSoC、右側がデバッガ
OpenOCDはオプション-fでデバッガやデバッグ対象の設定ファイルを指定します。今回はST-Link(interface/stlink.cfg)とSTM32F4系(target/stm32f4x.cfg)の設定ファイルを指定します。
オプション-cは起動時に実行するコマンドを指定します。"bindto 0.0.0.0"は他のマシンからの接続を受け付けるためのコマンドで、OpenOCDを実行するマシンとZephyrをビルドするマシンが同じ場合は省略してOKです。"init; reset halt"は初期化後にボードをリセットしてCPU停止状態にしておくために指定しています。要らないはずなんですが、なぜか接続できないときがあるんですよねー。なんでだろ?
$ cd openocd/tcl $ sudo ../src/openocd -f interface/stlink.cfg -f target/stm32f4x.cfg -c 'bindto 0.0.0.0' -c 'init; reset halt'
GDBはARM用ならOKですが、Zephyr SDKにあるarm-zephyr-eabi-gdbを使うのが手軽でしょう。バイナリのパスはビルドしたOut-of-treeアプリ(build/zephyr/zephyr.elf)を指定します。
$ cd work_dir/hello $ ../zephyr-sdk/gnu/arm-zephyr-eabi/bin/arm-zephyr-eabi-gdb build/zephyr/zephyr.elf target remote :3333 monitor reset halt load c
GDBが起動したらtargetコマンドでOpenOCDに接続し、リセット(monitor reset halt)、ロード(load)、コンティニュー(c)すればアプリが実行開始されます。これでやっとHello, World!を拝め……ません。まだNUCLEO-F446REのシリアル出力を見る方法を説明していないからです。
続きは次回。
この記事にコメントする
目次: Zephyr
便利ツールwestとZephyr SDKをインストールしました。やっとOut-of-treeアプリケーション作成の説明ができます。基本的にはZephyr Example Applicationを見たら良いですけど、機能満載すぎてどこ見たら良いかわからんと思うので、最低限必要な要素だけを1つずつ組み立てて紹介します。
最初にwestのマニフェストを作ります。これがないとwest initができません。マニフェストではwestのカスタムコマンドを定義できますが、今は要らないのでzephyr本体だけ記述します。
manifest:
remotes:
- name: zephyrproject-rtos
url-base: https://github.com/zephyrproject-rtos
projects:
- name: zephyr
remote: zephyrproject-rtos
revision: v4.4.0
import:
name-allowlist:
- cmsis_6
- hal_stm32
今回はST-Microのnucleo F446REボードを使いますので、Cortex-M用にcmsis_6とhal_stm32をallowlistに入れました。
$ cd work_dir $ west init -l hello $ west update $ west zephyr-export $ west packages pip --install
チュートリアルに紹介されているコマンドは-m URLオプションでリモートのGitリポジトリを指定する方法でした。これはこれで便利ですが、なんでもかんでもGitHubにアップロードするのも面倒です。今回は-lオプションでローカルディレクトリを指定する方法を使います。
もし間違えてしまったら.westディレクトリを全て消してwest initからやり直せば良いです。zephyr-exportとpackages pip --installは1回やればもうやらなくていいはず。たぶん。
アプリケーションの骨組みを作ります。ディレクトリ名は何でも良いですが、ここではhello/appとします。CMakeLists.txt, Kconfig, prj.confとmain.cを作ります。
cmake_minimum_required(VERSION 3.13.1)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(app LANGUAGES C)
target_sources(app PRIVATE src/main.c)
menu "Zephyr"
source "Kconfig.zephyr"
endmenu
(空っぽでOK)
#include <zephyr/kernel.h>
int main(void)
{
printk("Hello, World!\n");
return 0;
}
作成し終わったらビルドします。
$ cd work_dir/hello
$ west build -b nucleo_f446re app
[158/158] Linking C executable zephyr/zephyr.elf
Memory region Used Size Region Size %age Used
FLASH: 17136 B 512 KB 3.27%
RAM: 4480 B 128 KB 3.42%
BACKUP_SRAM: 0 B 4 KB 0.00%
SRAM0: 0 B 128 KB 0.00%
IDT_LIST: 0 B 32 KB 0.00%
Generating files from /home/ubuntu/work_dir/hello/build/zephyr/zephyr.elf for board: nucleo_f446re/stm32f446xx
もし下記のような既にconfig済だぞ!みたいなエラーで怒られるときは、
ERROR: Build directory /home/ubuntu/work_dir/hello/build targets board nucleo_f446re, but board warp7 was specified. (Clean the directory, use --pristine, or use --build-dir to specify a different one.) FATAL ERROR: refusing to proceed without --force due to above error
ビルド生成物(buildディレクトリ)を全削除してからやり直してください。最小アプリであればビルドにさほど時間はかかりませんし、毎回buildディレクトリを削除してフルビルドするストロングスタイルでもいいと思います。以上がうまくいっていたら、ディレクトリはこうなっているはずです。
work_dir |-- .venv |-- .west |-- hello |-- modules |-- zephyr `-- zephyr-sdk-1.0.1
ビルドできたら実行したいですね。続きはまた今度。
この記事にコメントする
| < | 2026 | > | ||||
| << | < | 06 | > | >> | ||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| - | 1 | 2 | 3 | 4 | 5 | 6 |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | - | - | - | - |
26年1月23日
26年1月23日
24年12月9日
24年12月9日
25年12月18日
25年12月18日
25年12月18日
25年11月28日
25年11月28日
25年11月28日
25年10月6日
25年10月6日
25年9月29日
25年9月29日
20年8月24日
20年8月24日
16年2月14日
16年2月14日
25年7月20日
25年7月20日
wiki
Linux JM
Java API
2002年
2003年
2004年
2005年
2006年
2007年
2008年
2009年
2010年
2011年
2012年
2013年
2014年
2015年
2016年
2017年
2018年
2019年
2020年
2021年
2022年
2023年
2024年
2025年
2026年
過去日記について
アクセス統計
サーバ一覧
サイトの情報合計:
本日: