ST意法半导体
直播中

王军

7年用户 1753经验值
私信 关注
[问答]

类似于IAP的引导加载程序和主应用程序无法正常工作的原因?如何解决?

我有自己的引导加载程序应用程序,类似于 ST 提供的 IAP 示例,它运行并确定要运行 2 个主要应用程序中的哪一个,然后启动该应用程序。引导加载程序工作正常,主应用程序工作正常,但是当我将它们组合在一起时,主应用程序总是以硬故障告终。如果我从 STM32CubeMX IDE 启动主应用程序,它启动正常,但如果我重新启动整个处理器,引导加载程序运行然后启动主应用程序,但它总是在同一点出现硬故障。如果我让主应用程序从闪存开始运行,它工作正常并且没有硬故障。
我已经尝试取消初始化引导加载程序中使用的所有外围设备,这似乎没有什么区别。唯一仍在运行的是 Systick 计时器。
是否有任何寄存器可以暗示为什么会发生硬故障?
如何确保主应用程序运行时一切都处于干净的状态?
我应该提一下,主应用程序是一个 FreeRTOS 项目,并且在初始化默认任务时发生硬故障。







回帖(1)

丁峙昌

2023-2-6 10:45:14
> 唯一仍在运行的是 SysTick 定时器。
为什么?禁用它。
> 我试过取消初始化所有外围设备
不要(永远)信任 HAL 函数,验证寄存器是否处于重置状态。使用 RCC *RSTR 寄存器,参见参考手册。
验证所有中断实际上在 NVIC->ICER* 寄存器中被禁用(参见 PM0253 编程手册中的描述)
验证 SCB->VTOR 始终指向应用程序的向量表。愚蠢的 SystemInit() 代码往往会在那里写入错误的值,尽管它可以使用正确的值 (g_pfnvectors)。不要相信 SystemInit()。
> 是否有任何寄存器可以暗示为什么会发生硬故障?
如果它总是在同一点发生硬故障,为什么不在那里设置一个断点,并检查那里发生了什么。
STM32CubeIDE有一个故障分析面板,我不知道它是否好用,但你可以试试。
异常堆栈帧记录在编程手册中。
> 如何确保主应用程序运行时一切都处于干净的状态?
不要相信生成的代码,不要相信库,不要相信示例代码,即使它们来自 MCU 供应商。验证参考手册和编程手册中的所有内容。
举报

更多回帖

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