STMCU小助手
发布时间:2022-2-17 20:54
|
问题:$ ?7 H i6 V% Y2 T1 Y | 该问题由某客户提出,发生在 STM32F407IGT6 器件上。据其工程师讲述:在其产品设计中,使用了IAP+APP 模式的软件架构。IAP 为自行编写的 BOOT 程序,负责系统启动及更新 APP 程序,而 APP则用于处理常规业务。系统启动后,首先运行 IAP 程序,由其完成系统初始化后跳转到 APP。两段程序分别由两个独立的软件工程生成。其中,APP 程序是其于某款 RTOS 构建的。在加入 IAP+APP 模式之前,做了单独的调试,即将其定位到 0x08000000 开始的地址空间直接启动,而不通过 IAP 跳转,证实其可以运行。加入到 IAP+APP 架构中后,这段程序被重新定位到了 0x08004000 开始的地址空间。然而这种情况下 APP 不能正常运行,跳飞掉了。通过打印跟踪,发现从 IAP 到 APP 的跳转可以顺利完成,APP 前几行代码也可以执行,直到执行启动 RTOS 的函数后,不知去向。. o+ u2 t0 j/ D5 W+ t& H7 g+ V 调研: 检查 APP 软件工程,发现其软件工程是其于 ST 的标准外设驱动库构建的。于是,检查其中的 system_stm32f4xx.c 文件,找到 systemInit()函数,如表(一)所示。6 W' K5 t& E3 k( W. }, {
% W! c9 R# x3 W {7 G @7 o% b+ b 将其中的行 (1) 由, v+ ^6 s. i8 j" D/ r6 f SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET 改成:1 @8 [; d: [7 ]+ S+ w4 M# n SCB->VTOR = FLASH_BASE | 0x000040007 _* q6 p+ V' J0 R6 h F 重新下载后,RTOS 可以正常运行。 4 E* g% Z+ L1 K: q& K 结论: 没有重新定位中断向量表,导致 CPU 依使用 IAP 的中断向量表,进而 APP 的中断无法被正常的处理。通常,RTOS 需要通过中断来进行任务调度,所以,致使其不能正常的运行。 " s) J1 k4 W: r" [* y: i0 J 2 g/ u. L( E; s 处理:1 M% P$ b- N+ o; H A O! t' } 修改软件,重新定位中断向量表到正确的位置。 " b8 P, |+ h9 q& S$ h: Q4 P5 J: w 建议:0 Q7 ^% N: i, s1 Q& r# ~3 y Cortex-M3 和 Cortex-M4 的中断向量表是可以在最低 1GB 的地址空间内浮动的,且专门设有一个偏移地址寄存器 VTOR,用于指示中断向量表的位置,如图(一):
! [ _- B1 B* O- b 该寄存器的各个位段的定义如表(二):
VTOR 的地址为:0xE000ED08,复位值为:0x00000000。所以,复位后 Cortex-M3 或 Cortex-M4 会到地址 0x00000000 取 SP 的取值,而到地址 0x00000004 取 PC 的取值,来启动程序。一般来说,程序启动后要重新装载 VTOR 的取值,使其指向自身的中断向量表,以保证后续程序能够正确的响应各个中断请求。在 Cortex-M3 和 Cortex-M4 的系统中,对于中断向量表的存放位置的对齐边界有一定的要求,可按如下公式计算:
" O8 Z& a' w' t/ n- u0 x/ }$ |" h |
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版