ST意法半导体
直播中

wufan931111

11年用户 1240经验值
擅长:370217
私信 关注
[问答]

STM32H723 IAP跳转进入硬件故障怎么解决?

  1、栈顶指针校验不通过;
2、屏蔽栈顶指针校验,跳转进入硬件故障;



回帖(1)

王利祥

2025-3-2 14:20:04

针对STM32H723 IAP跳转导致硬件故障的问题,以下是逐步解决方案:




1. 确认应用程序的链接脚本配置



  • 检查Flash/RAM地址

    确保应用程序的链接脚本(如STM32H723ZGTx_FLASH.ld)中FLASHRAM的起始地址与IAP设计的分区匹配。例如:
    MEMORY {
    FLASH (rx)  : ORIGIN = 0x08010000, LENGTH = 1536K  /* IAP占用0x08000000~0x0800FFFF */
    RAM   (xrw) : ORIGIN = 0x20000000, LENGTH = 564K    /* 根据实际RAM分区调整 */
    }


    • 使用readelf -a application.elf验证Entry point是否为应用程序入口地址。





2. 正确重定位中断向量表



  • 在应用程序初始化代码中设置VTOR

    main()函数起始处或SystemInit()中添加:
    SCB->VTOR = 0x08010000;  // 应用程序的起始地址


    • 使用调试器检查SCB->VTOR寄存器的值是否正确。





3. 跳转前关闭中断与外设



  • 禁用全局中断并复位外设

    在IAP跳转代码中执行以下操作:
    __disable_irq();  // 关闭全局中断
    HAL_RCC_DeInit();  // 复位时钟配置
    HAL_DeInit();      // 复位所有外设
    SysTick->CTRL = 0; // 关闭SysTick




4. 正确设置栈顶指针和程序计数器




  • 跳转代码示例  


    typedef void (*AppEntry)(void);
    uint32_t app_addr = 0x08010000;

    // 获取应用程序栈顶指针和入口地址
    uint32_t app_sp = *(__IO uint32_t*)app_addr;
    AppEntry app_entry = (AppEntry)(*(__IO uint32_t*)(app_addr + 4));

    // 关闭Cache(如果启用)
    SCB_DisableICache();
    SCB_DisableDCache();

    // 设置栈指针并跳转
    __set_MSP(app_sp);
    app_entry();





5. 检查MPU/Cache配置



  • 禁用MPU和Cache

    在跳转前确保MPU未启用或重新配置:
    HAL_MPU_Disable();
    SCB_DisableICache();
    SCB_DisableDCache();


    • 若应用程序使用Cache,需在跳转后重新启用。





6. 调试HardFault根本原因




  • 分析故障寄存器

    触发HardFault后,通过调试器检查以下寄存器:



    • SCB->CFSR:查看故障类型(如IMPRECISERR、PRECISERR等)。

    • SCB->HFSR:检查是否因中断异常升级导致。

    • SCB->MMFAR/SCB->BFAR:获取引发故障的内存地址。




  • 检查堆栈内容

    在HardFault处理函数中打印或观察R0-R3, LR, PC, PSR的值,定位异常指令。






7. 验证应用程序烧录正确性



  • 使用调试器查看Flash内容

    确认应用程序的起始地址(如0x08010000)处的前两个32位值是否为有效的栈顶指针和复位向量。

    • 栈顶指针应指向RAM有效地址(如0x2000xxxx)。

    • 复位向量应指向应用程序的Reset_Handler





8. 确保时钟配置一致性



  • 跳转前恢复默认时钟

    在IAP代码中将时钟切换回HSI,避免应用程序因PLL未正确配置而崩溃:
    HAL_RCC_DeInit();
    HAL_RCC_HSI_Enable();
    __HAL_RCC_SYSCFG_CLK_DISABLE();




9. 其他注意事项



  • 避免使用绝对地址访问外设

    确保应用程序未依赖IAP代码中外设的残留状态(如未重新初始化的GPIO或DMA)。

  • 检查Bootloader大小限制

    确保IAP代码不超过预留的Flash空间(如0x10000字节),避免覆盖应用程序区域。




通过以上步骤逐步排查,可解决栈顶指针校验失败和跳转后HardFault的问题。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分