这次的目标,是在 RA-ECO-RA6M4 开发板上跑通 Zephyr,为后续在 Zephyr 上接入 micro-ROS 做准备。此前我们已经在 RA6M4 上用 e2 studio + FSP 跑通过micro-ROS UART通信,这次我们开始验证 RA6M4 是否可以通过 Zephyr 运行,并最终作为 micro-ROS 的底层运行环境。
基础判断
因为我之前有做过瑞萨RA的Zephyr开发,因此这里我不会细讲Zephyr环境的部署问题,我只简单提一嘴,从使用层来看,Zephyr只要部署成功,其实是一个很方便的开发工具,在芯片原厂已经完成对芯片的支持后,任意的对应开发板只需要写一个简单的板级支持包就可以开始轻松的玩Zephyr了
因此首先确认一个关键前提:RA6M4 这颗 MCU 在 Zephyr 中已经有官方支持。我们只需要为 RA-ECO-RA6M4 这块开发板补充一份简易的板级支持文件。(其实瑞萨RA全系列都支持Zephyr,这个还是很不错的)
本次使用的是 Windows 下已经验证可用的 Zephyr 环境:
当前 Zephyr 版本为:
Zephyr v4.2.0
创建 RA-ECO-RA6M4 板级支持
接下来我们开始为 RA-ECO-RA6M4 创建板级支持包文件,这里我们给这个包取名为out-of-tree board:
这里我们先把官方的EK-RA6M4的板级支持文件包拿过来作为我们修改的框架:
board.yml
ra_eco_ra6m4.yaml
Kconfig.ra_eco_ra6m4
board.cmake
ra_eco_ra6m4_defconfig
ra_eco_ra6m4.dts
ra_eco_ra6m4-pinctrl.dtsi
其中,board.yml 和 ra_eco_ra6m4.yaml 用来描述开发板名称、厂商、架构、RAM/Flash 等基本信息;Kconfig.ra_eco_ra6m4 用来选择 RA6M4 SoC;board.cmake 配置 J-Link 烧录方式;ra_eco_ra6m4_defconfig 打开串口、控制台、GPIO 等基础功能;ra_eco_ra6m4.dts 和 ra_eco_ra6m4-pinctrl.dtsi 则是最关键的板级硬件描述文件。
最小目标
这次没有一开始就加入 LED、按键、I2C、USB 或 Ethernet,而是先做最小可运行配置。第一阶段目标非常明确:让 Zephyr 可以启动,并通过板载 CH340 对应的 UART 输出 Hello World。
根据之前在 e2 studio/FSP 中验证过的硬件连接,RA-ECO-RA6M4 的串口使用 SCI9,对应引脚为:
TXD9 = P109
RXD9 = P110
因此在 ra_eco_ra6m4-pinctrl.dtsi 中配置 SCI9 的 pinctrl:
&pinctrl {
sci9_default: sci9_default {
group1 {
/* TXD9 P109, RXD9 P110 */
psels = <RA_PSEL(RA_PSEL_SCI_9, 1, 9)>,
<RA_PSEL(RA_PSEL_SCI_9, 1, 10)>;
};
};
};
在 ra_eco_ra6m4.dts 中,把 Zephyr 的默认 console 指向 uart9:
chosen {
zephyr,sram = &sram0;
zephyr,flash-controller = &flash1;
zephyr,flash = &flash0;
zephyr,console = &uart9;
zephyr,shell-uart = &uart9;
};
同时启用 SCI9:
&sci9 {
pinctrl-0 = <&sci9_default>;
pinctrl-names = "default";
status = "okay";
uart9: uart {
current-speed = <115200>;
status = "okay";
};
};
时钟配置
RA-ECO-RA6M4 使用的是 12 MHz 外部晶振。参考之前 FSP 工程中的时钟配置,我们将 Zephyr 中的 XTAL 设置为 12 MHz,并配置 PLL:
&xtal {
clock-frequency = <DT_FREQ_M(12)>;
mosel = <0>;
#clock-cells = <0>;
status = "okay";
};
&pll {
clocks = <&xtal>;
div = <2>;
mul = <30 0>;
status = "okay";
};
第一次编译 RA-ECO-RA6M4 自定义 board 时,Zephyr 已经能识别我们的 board,但出现了一个时钟断言错误。原因是我们配置后的系统时钟为 180 MHz,而 Zephyr 默认仍按官方 EK-RA6M4 的 200 MHz 配置进行检查。
解决方法是在 ra_eco_ra6m4_defconfig 中明确设置:
CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=180000000
编译 RA-ECO-RA6M4 Hello World
修正时钟配置后,使用以下命令重新编译:
west build -p always -b ra_eco_ra6m4 D:\Zephyr\external\zephyr\samples\hello_world -d D:\Zephyr\build_ra_eco_ra6m4_hello -- '-DBOARD_ROOT:STRING=D:/Zephyr'
这里文件路径就按照你们自己的文件路径来编就可以了,后面不再说这个事情。
这里还有一个小问题:在 Windows PowerShell 中传递 BOARD_ROOT 参数时,反斜杠和冒号容易被 CMake 或 PowerShell 解析出问题。因此最终使用了带引号的写法:
'-DBOARD_ROOT:STRING=D:/Zephyr'
这样 west 就能正确找到放在 D:\Zephyr\boards 下的 out-of-tree board。
烧录验证
随后通过外接 J-Link 进行烧录:
west flash -d D:\Zephyr\build_ra_eco_ra6m4_hello
烧录过程正常完成,J-Link runner 成功识别并写入固件。
最后,通过 CH340 串口查看输出。串口参数为:
115200 8N1
按下开发板复位键后,串口终端成功输出:
*** Booting Zephyr OS build v4.2.0 ***
Hello World! ra_eco_ra6m4/r7fa6m4af3cfb
接下来我们就准备接入 micro_ros_zephyr_module,通过同样的 SCI9 UART 通道连接 micro-ROS Agent,实现和之前 FSP 工程一样的 /int_publisher 发布功能。