You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PSoC4 MAX设备Bootloader与应用程序向量表访问及调试故障排查

PSoC4 MAX Bootloader+应用程序的向量表与调试问题解答

核心结论:必须在应用程序的链接脚本中显式配置向量表位置

你的问题根源完全和向量表相关,具体原因和解决步骤如下:

  • 为什么应用的Reset_Handler会出错?
    Cortex-M0内核默认从0x00000000地址读取向量表(向量表第一个条目是初始栈指针,第二个就是Reset_Handler的入口地址)。你的Bootloader占用了0x00到0x5000的FLASH区域,而你没给应用程序显式指定向量表位置,编译时链接器会默认把应用的向量表放到0x00地址——这个区域属于Bootloader,会被Bootloader的内容覆盖,导致应用的Reset_Handler地址根本不在正确的向量表位置,内核找不到合法的入口,自然调试失败,甚至运行时崩溃。而Bootloader因为占了0x00起始地址,向量表位置正确,所以用同一起动文件没问题。

  • 应用放在0x5000以上会不会无法访问向量表?
    不会,但你需要做两步关键配置:

    1. 修改应用的链接脚本,强制向量表存到应用FLASH的起始地址
      在你的链接脚本的SECTIONS块中添加向量表的指定,把它放到FLASH_Application区域的起始位置:

      SECTIONS
      {
        .isr_vector :
        {
          . = ALIGN(4);
          KEEP(*(.isr_vector)) /* 确保向量表段不被优化掉 */
          . = ALIGN(4);
        } > FLASH_Application
      
        /* 保留你原有的其他SECTION配置(比如.text、.data等) */
      }
      

      这样链接器就会把应用的向量表放在0x5000的起始位置,和应用代码一起存到专属的FLASH区域。

    2. 在应用代码中重映射向量表地址
      Cortex-M0支持向量表重映射,你需要在应用程序的最开始(比如Reset_Handler的开头,或者main函数之前的初始化代码里)设置SCB寄存器的VTOR字段,告诉内核向量表的新地址:

      SCB->VTOR = 0x00005000; /* 向量表起始地址,和应用FLASH起始地址一致 */
      

      注意:这个操作必须在启用中断之前完成,否则中断会跳转到错误的地址。

  • 调试失败的额外检查点
    除了向量表配置,还要确保Eclipse的调试配置中,应用程序的加载起始地址设置为0x5000,MiniProg4调试器能正确识别应用的FLASH区域;同时Bootloader的跳转逻辑要正确——跳转到应用的Reset_Handler时,应该跳转到0x5000 + 4(因为向量表第一个条目是栈指针,第二个才是Reset_Handler的入口地址)。

内容的提问来源于stack exchange,提问作者nobby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 00:00:07