保姆级教程:在飞凌OK3562J-C开发板上启动Cortex-M0核(含完整配置与烧录流程)
从零实战飞凌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.0sudo apt-get install sconsARM GCC9-2020-q2-updatesudo apt-get install gcc-arm-none-eabiRK开发工具最新版需从瑞芯微开发者网站下载注意避免使用过新的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 901.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_AMPy CONFIG_RPMSG_VIRTIOy3. 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 UART7AMP Settings→ Set shared memory address (0x7800000)System→ Set entry point tomcu_entry3.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共用引脚调试了整整两天——这种坑希望你们不用再踩。