从零实战:飞凌OK3562J-C开发板Cortex-M0核全流程启动指南
第一次拿到飞凌OK3562J-C开发板时,很多工程师都会被其异构多核架构吸引——四核Cortex-A53搭配实时性极强的Cortex-M0核,理论上既能跑Linux又能做实时控制。但当你真正想用M0核跑个简单的日志打印或电机控制时,却发现官方资料里只有A核的例程,M核的启动配置完全是个黑盒。这种"看得见用不着"的体验,相信不少朋友都深有体会。
本文将彻底解决这个痛点。不同于网上零散的教程,我们会从芯片架构原理讲起,手把手带你完成设备树配置→RTOS编译→固件烧录→功能验证的全流程。过程中不仅会解释每个步骤的技术背景,还会标注新手容易踩的坑(比如设备树时钟配置遗漏导致M核无法启动)。最终你将获得:
- 一套可复用的M核开发环境
- 理解AMP(非对称多处理)的底层机制
- 掌握通过RPMSG实现A核与M核通信的基础能力
1. 环境准备:搭建开发环境与理解硬件架构
1.1 硬件连接检查清单
在开始之前,请确保你的OK3562J-C开发板已正确连接:
- 电源:使用官方12V/2A电源适配器,避免因供电不足导致烧录失败
- 串口调试:通过Type-C转USB线连接调试串口(通常为UART2)
# 在Linux主机查看串口设备 ls /dev/ttyUSB* # 使用minicom连接(波特率1500000) sudo minicom -D /dev/ttyUSB0 -b 1500000 - 烧录模式:板载的USB OTG接口用于固件下载,需准备Micro USB线
1.2 软件工具链安装
飞凌官方推荐使用Ubuntu 18.04/20.04作为开发环境,关键组件包括:
| 组件 | 版本要求 | 安装命令 |
|---|---|---|
| SCons | ≥3.0.0 | sudo apt-get install scons |
| ARM GCC | 9-2020-q2-update | sudo apt-get install gcc-arm-none-eabi |
| RK开发工具 | 最新版 | 需从瑞芯微开发者网站下载 |
注意:避免使用过新的GCC版本(如11.x),可能导致RT-Thread编译报错。若已安装高版本,可通过
update-alternatives切换:sudo update-alternatives --install /usr/bin/arm-none-eabi-gcc arm-none-eabi-gcc /usr/bin/arm-none-eabi-gcc-9 90
1.3 理解RK3562J的AMP架构
RK3562J的异构多核设计有其特殊性:
- 内存隔离:A核与M核有独立的内存区域(见下图),通过
reserved-memory节点划分+---------------------+ | Linux系统内存 | 0x00000000 - 0x7800000 +---------------------+ | AMP共享内存 | 0x7800000 - 0x7C00000 (4MB) +---------------------+ | RPMsg通信区 | 0x7C00000 - 0x8000000 (4MB) +---------------------+ | M0核专用内存 | 0x8200000 - 0x8300000 (1MB) +---------------------+ - 时钟依赖:M0核依赖A核提供的时钟源,设备树中必须正确配置
cru节点 - 中断路由:GIC需配置
amp-irqs实现核间中断
2. 内核配置:设备树与AMP启动机制
2.1 验证默认设备树配置
飞凌官方SDK通常已包含基础AMP配置,但仍需检查:
cd /path/to/kernel-5.10/arch/arm64/boot/dts/rockchip grep -r "rk3562-amp.dtsi" .正常应看到OK3562-C-common.dtsi中包含:
#include "rk3562-amp.dtsi"若未找到,需手动添加并检查以下关键节点:
- rockchip_amp:定义M核时钟源和中断路由
- reserved-memory:确保
amp_shmem_reserved和mcu_reserved区域无冲突 - rpmsg:配置核间通信的邮箱通道
2.2 常见配置问题排查
问题现象:M核启动后无日志输出
可能原因:
- UART引脚复用冲突:检查
pinctrl-0 = <&uart7m1_xfer>;是否取消注释 - 时钟未使能:确认
clocks列表包含SCLK_UART7和PCLK_UART7
问题现象:A核无法加载AMP驱动
解决方法:
# 检查内核配置 zcat /proc/config.gz | grep AMP # 应输出: CONFIG_ROCKCHIP_AMP=y CONFIG_RPMSG_VIRTIO=y3. RTOS编译:从配置到固件生成
3.1 获取与配置RT-Thread源码
飞凌提供的RTOS通常基于RT-Thread定制:
cd /path/to/OK3562-linux-source/rtos/bsp/rockchip/rk3562-32 cp board/rk3562_evb1_lp4x/defconfig .config scons --menuconfig在配置界面中重点关注:
- Hardware Drivers→ Enable UART7
- AMP Settings→ Set shared memory address (0x7800000)
- System→ Set entry point to
mcu_entry
3.2 编译与产物分析
执行编译命令后:
./build.sh chip # 选择forlinx_ok3562_linux_rtos_defconfig ./build.sh mcu生成的amp.img包含以下关键段:
Section Address Size --------------- ----------- -------- .text 0x8200000 0x20000 .shared 0x7800000 0x40000 .heap 0x8240000 0x10000调试技巧:若编译失败,可查看
build.log中的链接脚本(.ld文件)是否正确定义了内存区域。
4. 烧录与验证:实战操作指南
4.1 使用RKDevTool烧录
- 进入Loader模式:
- 按住Recovery键上电
- 通过
lsusb确认设备ID显示2207:350a
- 配置烧录表:
[PARTITION] amp:amp.img - 高级操作:若需保留原有系统,可仅勾选
amp分区
4.2 U-Boot阶段验证
成功烧录后,在U-Boot命令行中:
# 查看AMP状态 amp status # 手动启动M核 amp start on # 查看串口输出 uart7 on正常启动时,UART7会输出类似日志:
[AMP] M0 core started at 0x8200000 [RT-Thread] msh >4.3 Linux用户空间测试
在A核Linux系统中,可通过RPMSG与M核交互:
# 安装测试工具 sudo apt install rpmsg-char # 发送测试消息 echo "ping" > /dev/rpmsg0 # 接收回复 cat /dev/rpmsg05. 进阶开发:从基础启动到实际应用
5.1 外设驱动开发示例
以PWM控制为例,M核端代码:
// pwm_demo.c #include <rtdevice.h> #define PWM_DEV "pwm3" void pwm_test(void) { struct rt_device_pwm *pwm = (struct rt_device_pwm *)rt_device_find(PWM_DEV); rt_pwm_set(pwm, 0, 1000000, 500000); // 1MHz, 50% duty }需同步修改设备树:
&pwm3 { status = "okay"; pinctrl-names = "active"; pinctrl-0 = <&pwm3m1_pins>; };5.2 性能优化技巧
- 内存优化:调整
.shared段大小(默认4MB可能过大) - 中断延迟:在
amp-irqs中配置CPU亲和性 - 双核同步:使用
atomic指令操作共享内存
遇到寄存器访问冲突时,记得检查iomux配置是否与A核冲突。曾经有个项目因为A核的SDIO和M核的SPI共用引脚,调试了整整两天——这种坑希望你们不用再踩。