本文记录了从基于RA6M5的移植迁移到RA-ECO-RA6M4的全过程:
1. 目标
目标是在 RA-ECO-RA6M4 板子上运行 micro-ROS,使 MCU 通过 UART 与 Ubuntu 中的 micro-ROS Agent 通信,并在 ROS 2 中看到 MCU 发布的 topic。
2. 前置经验
在 RA6M5 CPK IOT 板上已经完成过一次 micro-ROS UART 移植。RA6M5 的经验包括:
- micro-ROS 静态库接入 e² studio。
- 使用
rmw_uros_set_custom_transport() 自定义 UART transport。
- 使用
rclc 创建节点和 publisher。
- 在 Ubuntu 中启动 micro-ROS Agent。
- 通过
ros2 topic echo 验证 MCU 发布数据。
本次 RA6M4 不是直接复制官方 EK 板例程,而是借鉴 RA6M5 已跑通工程的结构,迁移到 RA-ECO-RA6M4 的实际引脚、时钟和下载方式。
3. 前言
最开始尝试使用官方资料包中的RA6M4-UART工程文件作为基础模版,但是RA6M4的工程包是用FSP3.2,而我目前用的是FSP5.8,在编译的过程中出现了一些问题,于是为了节省时间,我新开了一个基于FSP5.8的UART文件
目的是先保证最小 UART 通信正常,再接入 micro-ROS。
4. UART 引脚和下载方式确认
新建工程后,首先确认 RA-ECO-RA6M4 板上 CH340 的 UART 连接。
最终确认:
P109 = SCI9_TXD9
P110 = SCI9_RXD9
FSP 中配置:
UART Stack Name: g_uart0
Channel: 9
Baudrate: 115200
Callback: user_uart_callback
同时确认:
- 板载 CH340 只负责串口通信,不负责下载。
- 外接 J-Link 才能下载和调试 RA6M4。
- SWD 引脚需要保留,不能被 UART 或其他外设占用。
SWD:
P108 = SWDIO
P300 = SWCLK
5. 一些烧录方面的问题
因为这块芯片不带板载烧录,需要外接烧录器,这边我一开始用的是瑞萨的E2 LITE,而且进行了最新的驱动升级,但是我调了很久也下载不成功,真的很奇怪,我后面一直在想这个失败的原因,但是为了不浪费时间,我改成了J-link,一下子就调通了。
6. UART Hello World 验证
在接入 micro-ROS 之前,我先写了一个普通 UART 输出程序,验证 CH340 通信链路。
但是一开始 MobaXterm 能打开 COM 口,但输出是乱码。最后也是一通检查,发现这块板子的晶振是12的,和系统自动生成的24差别过大了,导致出现了乱码,于是进行了一些简单的调整:
XTAL: 12MHz
PLL Div: /2
PLL Mul: x30.0
Clock source: PLL
修改后 UART 115200 输出正常。
7. micro-ROS 文件迁移
从 RA6M5 成功工程迁移以下内容到 RA6M4 工程:
micro_ros_renesas2estudio_component/
src/microros_allocators.c
src/microros_allocators.h
src/microros_app.c
src/microros_transport_uart_adapter.c
src/microros_transports.h
src/uros_transport_uart.c
src/uros_transport_uart.h
新增:
src/microros_time.c
RA6M4 适配修改:
g_uart2 改成 g_uart0。
- UART callback 改成
user_uart_callback。
- transport 注释和命名改为 RA6M4 SCI9。
- 节点名改成
ra6m4_node。
- 发布 topic 保持
/int_publisher。
- 移除 RA6M5 LED/OLED 依赖,保留 weak hook。
8. e² studio 工程路径配置问题
第一次接入 micro-ROS 后,编译报错:
fatal error: rcl/rcl.h: No such file or directory
原因:
micro-ROS include 路径没有进入 C 编译器 include path。曾出现路径只进了 Assembler include 的情况。
解决:
在 .cproject / 工程属性中加入:
GNU Arm Cross C Compiler -> Includes:
${workspace_loc:/${ProjName}/micro_ros_renesas2estudio_component/libmicroros/include}
同时 Linker 加入:
Library search path:
${workspace_loc:/${ProjName}/micro_ros_renesas2estudio_component/libmicroros}
Libraries:
microros
之后构建通过。
9. heap / stack 问题
程序第一次运行时停在 allocator 相关断点附近。检查后发现我忘了修改堆栈大小:
RA6M4 工程初始配置:
#define BSP_CFG_STACK_MAIN_BYTES (0x400)
#define BSP_CFG_HEAP_BYTES (0)
micro-ROS 使用 malloc/realloc/free,没有 heap 必然无法运行。
修改:
Main stack size (bytes): 8192
Heap size (bytes): 65536
Generate 后生成文件中变为:
#define BSP_CFG_STACK_MAIN_BYTES (8192)
#define BSP_CFG_HEAP_BYTES (65536)
构建 map 中确认存在 64KB heap:
__HeapBase = 0x20005c48
__HeapLimit = 0x20015c48
g_heap size = 0x10000
10. allocator 返回值判断问题
即使 heap 修复后,程序仍停在:
__BKPT(0);
代码原本写法:
if (RCUTILS_RET_OK != rcutils_set_default_allocator(&custom_allocator))
{
__BKPT(0);
}
进一步检查本工程 rcutils/allocator.h 发现:
bool rcutils_set_default_allocator(rcutils_allocator_t * allocator);
也就是说该函数返回 bool,不是 rcutils_ret_t。
错误原因:
RCUTILS_RET_OK 等于 0。
- 成功时
rcutils_set_default_allocator() 返回 true。
- 原判断变成
0 != true,所以成功也会进断点。
最终修复:
if (!rcutils_set_default_allocator(&custom_allocator))
{
__BKPT(0);
}
修复后板端继续运行,micro-ROS 通信成功。
经验:
不同版本的 micro-ROS / rcutils 头文件接口细节可能不同。移植时不要只照抄旧工程判断方式,要以当前 libmicroros/include 中的声明为准。
11. VirtualBox Ubuntu 问题
本次使用 Oracle VirtualBox 中的 Ubuntu 22.04 运行 ROS 2 Humble 和 micro-ROS Agent。
11.1 虚拟机启动失败
VirtualBox 启动失败,日志显示:
Failed to open host device '\\.\COM5'
VERR_INVALID_HANDLE
原因:
虚拟机曾配置旧的物理串口 COM5 映射,但主机 COM5 不存在或被占用。
解决:
关闭 VirtualBox 的旧串口映射:
uart1 = off
改用 USB 直通 CH340。
11.2 CH340 直通
VirtualBox 菜单选择:
设备 -> USB -> QinHeng Electronics USB Serial
Ubuntu 中检查:
ls /dev/ttyUSB*
成功显示:
/dev/ttyUSB0
12. micro-ROS Agent 安装问题
Ubuntu 中尝试安装:
sudo apt install ros-humble-micro-ros-agent
报错:
Unable to locate package ros-humble-micro-ros-agent
解决:
使用源码构建 micro_ros_setup:
sudo apt install -y git python3-colcon-common-extensions python3-rosdep python3-pip
source /opt/ros/humble/setup.bash
mkdir -p ~/microros_ws/src
cd ~/microros_ws/src
git clone -b humble https://github.com/micro-ROS/micro_ros_setup.git
cd ~/microros_ws
colcon build
source install/local_setup.bash
过程中 rosdep update 从 GitHub raw 拉取索引超时,但直接 colcon build 成功完成:
Summary: 38 packages finished
验证:
ros2 run micro_ros_agent micro_ros_agent --help
能够输出 Agent 参数说明。
13. Agent 串口权限问题
第一次启动 Agent:
ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0 -b 115200 -v6
报错:
open device error
device: /dev/ttyUSB0, errno: 13
Please re-run with superuser privileges.
原因:
当前 Ubuntu 用户没有 /dev/ttyUSB0 权限。
临时解决:
sudo bash -lc 'source /opt/ros/humble/setup.bash && source /home/ooo/microros_ws/install/local_setup.bash && ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0 -b 115200 -v6'
注意:
直接 sudo ros2 run ... 会失败,因为 sudo 环境里找不到 ROS 2 环境变量。
长期解决:
sudo usermod -aG dialout $USER
然后重启 Ubuntu。
14. 最终成功链路
最终链路:
RA6M4 firmware
-> SCI9 UART
-> CH340 USB serial
-> VirtualBox USB passthrough
-> Ubuntu /dev/ttyUSB0
-> micro-ROS Agent
-> ROS 2 graph
-> /int_publisher
Agent 命令:
cd ~/microros_ws
sudo bash -lc 'source /opt/ros/humble/setup.bash && source /home/ooo/microros_ws/install/local_setup.bash && ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0 -b 115200 -v6'
板子复位后,Agent 显示连接日志。
第二个终端验证:
source /opt/ros/humble/setup.bash
source ~/microros_ws/install/local_setup.bash
ros2 topic list
ros2 topic echo /int_publisher
最终看到递增整数,说明 RA6M4 micro-ROS 移植成功。