本帖最后由 IT-ZTP 于 2025-8-1 23:27 编辑
G32R501产品调试经验分享之一--“系统启动(BOOT)”
大家好,最近在研究极海G32R501的产品,作为新手之一,既是在学习也是在巩固自己的开发经验,尤其是掌握双核MCU的运行流程以及开发经验,今天跟大家分享G32R501产品调试经验“系统启动(BOOT)”,下图是系统启动流程图。
根据流程图和调试经验,我继续跟大家讲解下更具体的启动过程:
1. 上电复位阶段 系统上电后,WDRSn(看门狗复位)和RSn(系统复位)信号触发硬件复位,所有核心进入复位状态
2. CPU0主核启动 CPU0的时钟首先使能,开始执行片内BOOTROM代码, CPU1的时钟在此阶段保持关闭状态, BOOTROM完成以下工作:初始化必要的硬件环境,加载安全启动相关配置,执行完整性校验等安全流程。
3. 启动控制配置 BOOTROM执行完毕后,CPU0根据BOOT流程选择跳转到用户代码执行,系统将BOOT_CTL寄存器配置为值3(二进制11),表示: bit0=1:使能CPU1启动, bit1=1:使用BOOT_ADDR1_G寄存器指定的地址启动CPU1
4. CPU1从核启动 当CPU0完成BOOT_CTL配置后,系统使能CPU1的时钟,CPU1开始从BOOT_ADDR1_G寄存器配置的地址开始执行程序,此时CPU0继续执行用户代码,双核进入并行工作状态。
5. 双核协作 典型应用场景:CPU0作为主控核运行主应用程序,CPU1作为协处理器运行实时任务或专用算法,需要通过核间通信机制(如共享内存+中断)实现数据同步
注:实际开发时需注意: 1. BOOT_ADDR1_G需在CPU0代码中正确配置为CPU1程序的入口地址 2. 双核共享资源的初始化时序 3. 核间同步机制需要在用户代码中实现 4. 具体寄存器配置请参考G32R501的参考手册
接下来是Boot Modes,用户手册指引我要参考《G32R501 数据手册》引导 ROM 和外设引导章节。
以下是针对G32R501芯片的Boot模式配置技术调试文档,包含硬件设计指南、软件配置方法和调试经验分享:
1. Boot模式引脚硬件设计规范 ```c // 推荐电路设计(默认引脚) define BOOT_MODE_PIN0 GPIO32 // 10kΩ弱上拉至VDD define BOOT_MODE_PIN1 GPIO24 // 10kΩ弱上拉至VDD
// 禁止使用的GPIO(冲突列表) const uint32_t forbidden_bmsp_gpios[] = { 20,21,22,23,36,38,60-223 // 这些GPIO不可配置为Boot模式引脚 }; ```
2. OTP配置仿真方法(开发阶段) ```c // 通过仿真寄存器预配置(避免烧写OTP) volatile uint32_t EMU_BOOTPIN_CONFIG = (uint32_t)0x40031000; volatile uint64_t EMU_BOOTDEF = (uint64_t)0x40031008;
void debug_boot_config(void) { // 示例:配置SPI引导+修改Boot引脚 EMU_BOOTPIN_CONFIG = 0x00010203; // 设置GPIO3/GPIO2为BMSP EMU_BOOTDEF = 0x46000000; // 使用SPI选项2(GPIO54-57) } ```
3. 外设引导硬件连接指南 4. Boot选项快速配置表 ```markdown
```
5. 双核启动软件配置示例 ```c // CPU0启动后初始化CPU1的代码 define BOOT_CTL ((volatile uint32_t)0x40030000) define BOOT_ADDR1_G ((volatile uint32_t)0x40030004)
void start_cpu1(void) { // 设置CPU1入口地址(需对齐到4字节) BOOT_ADDR1_G = 0x10040000;
// 启动配置:bit0=1(使能CPU1), bit1=1(使用BOOT_ADDR1_G) BOOT_CTL = 0x3;
// 内存屏障确保写入完成 __DSB(); } ``` ............................................... ...............................................
6. 调试问题排查清单 问题1:无法进入UART引导 检查TX/RX引脚是否与BOOTDEFx配置匹配 测量波特率时钟(误差需<2%) 确认上位机发送正确的同步头(0x7F)
问题2:SPI Flash识别失败 使用逻辑分析仪抓取CLK信号 检查Flash的CS引脚是否在引导阶段被正确拉低 验证Flash供电电压(3.3V±10%)
问题:双核不同步 确认BOOT_ADDR1_G指向有效代码 检查CPU1的向量表偏移寄存器(VTOR) 使用核间中断寄存器(IPC)进行握手
7. 量产编程指南 `` 代码示例:OTP烧录工具流程 def program_otp(): if check_security_lock() == False: write_z1_otp_bootpin_config(0x010203) 配置GPIO1/2/3为BMSP write_z1_otp_bootdef_low(0x00000041) UART选项2 write_z1_otp_bootdef_high(0x00000003) Flash默认选项 enable_permanent_lock() ```
关键设计建议: 1. 开发阶段优先使用EMU寄存器模拟,验证稳定后再烧录OTP 2. 所有引导模式引脚必须设计为可外部调试(建议预留测试点) 3. 双核代码需在链接脚本中严格划分内存区域: ```ld / 示例链接脚本片段 / MEMORY { CPU0_CODE (rx) : ORIGIN = 0x08000000, LENGTH = 512K CPU1_CODE (rx) : ORIGIN = 0x10040000, LENGTH = 128K SHARED_RAM (rwx): ORIGIN = 0x20080000, LENGTH = 64K } ```
该文档应与《G32R501参考手册》第7章"系统启动配置"配合使用,硬件设计请参考《G32R501硬件设计指南》第3.2节。好了,如上是跟大家分享G32R501产品调试经验“系统启动(BOOT)”,大家看了有什么启发,可以文章下方留言,谢谢大家!!!
~~未完待续~~
|