STMCU小助手
发布时间:2022-2-17 20:54
|
问题: 该问题由某客户提出,发生在 STM32F407IGT6 器件上。据其工程师讲述:在其产品设计中,使用了IAP+APP 模式的软件架构。IAP 为自行编写的 BOOT 程序,负责系统启动及更新 APP 程序,而 APP则用于处理常规业务。系统启动后,首先运行 IAP 程序,由其完成系统初始化后跳转到 APP。两段程序分别由两个独立的软件工程生成。其中,APP 程序是其于某款 RTOS 构建的。在加入 IAP+APP 模式之前,做了单独的调试,即将其定位到 0x08000000 开始的地址空间直接启动,而不通过 IAP 跳转,证实其可以运行。加入到 IAP+APP 架构中后,这段程序被重新定位到了 0x08004000 开始的地址空间。然而这种情况下 APP 不能正常运行,跳飞掉了。通过打印跟踪,发现从 IAP 到 APP 的跳转可以顺利完成,APP 前几行代码也可以执行,直到执行启动 RTOS 的函数后,不知去向。 调研: 检查 APP 软件工程,发现其软件工程是其于 ST 的标准外设驱动库构建的。于是,检查其中的 system_stm32f4xx.c 文件,找到 systemInit()函数,如表(一)所示。
将其中的行 (1) 由 SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET 改成: SCB->VTOR = FLASH_BASE | 0x00004000 重新下载后,RTOS 可以正常运行。 结论: 没有重新定位中断向量表,导致 CPU 依使用 IAP 的中断向量表,进而 APP 的中断无法被正常的处理。通常,RTOS 需要通过中断来进行任务调度,所以,致使其不能正常的运行。 处理: 修改软件,重新定位中断向量表到正确的位置。 建议: Cortex-M3 和 Cortex-M4 的中断向量表是可以在最低 1GB 的地址空间内浮动的,且专门设有一个偏移地址寄存器 VTOR,用于指示中断向量表的位置,如图(一):
该寄存器的各个位段的定义如表(二):
VTOR 的地址为:0xE000ED08,复位值为:0x00000000。所以,复位后 Cortex-M3 或 Cortex-M4 会到地址 0x00000000 取 SP 的取值,而到地址 0x00000004 取 PC 的取值,来启动程序。一般来说,程序启动后要重新装载 VTOR 的取值,使其指向自身的中断向量表,以保证后续程序能够正确的响应各个中断请求。在 Cortex-M3 和 Cortex-M4 的系统中,对于中断向量表的存放位置的对齐边界有一定的要求,可按如下公式计算:
|
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
OpenSTLinux 6.1发布:M33-TD加持+安全升级,STM32MPU开发效率翻倍!
【经验分享】STM32CubeIDE汉化
手把手教你VSCode搭建STM32开发环境
RTOS在STM32中的应用
微信公众号
手机版