硬汉嵌入式论坛

 找回密码
 立即注册
查看: 894|回复: 3
收起左侧

[STM32H7] 记VTOR偏移对齐导致的奇怪Bug

[复制链接]

2

主题

1

回帖

7

积分

新手上路

积分
7
发表于 2024-10-31 19:24:22 | 显示全部楼层 |阅读模式
硬件环境: STM32H750VB+W25Q32JV

旧项目从M4更换到H750.先开发bootloader跳转QSPI地址0x90000200执行正常.后移植application程序时触发了bug.
新建工程点灯即包含Systick中断,正常.一般到此就证明bootloader跳转没问题,是干净的.移植Free RTOS执行正常,可以正常切换任务,此时我还没有意识到问题即将到来.
移植串口失败: 只要串口中断接收到数据就会立即跳转并卡在startup_stam32h7xxx.s的B.位置.也算是移植中常见的bug,一定是移植的时候忘记CV某个中断函数.然后开启debug心路历程
  • 对照确认全部中断函数都在.debug查看NVIC寄存器,确认没有遗漏
  • 去掉RTOS,删减代码,就留下HAL的初始化和开启串口中断接收.还是存在问题.
  • 怀疑只有内核中断是好的,外设中断挂?因此开启外部中断测试,触发外部中断一切正常.
  • 尝试将application不偏移,直接在0x08000000执行,没问题
  • 怀疑boot代码问题,没有清理干净现场.修改boot功能到初始化后立即跳转app,最简化.还以存在问题.
  • keil配置或者SDK问题?从网络上下载可用的H750程序到QSPI执行,开启相同串口接收也触发bug
  • 至此开始怀疑人生.省略800字艰辛过程说结论: 我是个XX


故障本质:SCB->VTOR偏移值设定错误

项目中有个需求,在bin的头部存储一些配置和校验信息,用于OTA升级时处理bin文件和执行时校验bin内容.因此application的执行地址要向后偏移一些,项目规定偏移512字节.问题也就出在这里了

这是M7手册的一段.对VTOR设定的偏移地址有要求.即需要将中断数量向上取2的幂才合法.对于之前项目选用的M3和M4内核来说,一般只有100个左右中断向量(16+60+),此时按照512取整来偏移地址就没问题了.
但是H750这颗中断就相对多一点.向量表尺寸0x298,因此需要按照1024取整.
至于为何有的中断可以而串口中断就会报错,内核中断都在向量表前方,测试外部中断也在前部.而出问题的LPUART1_IRQHandler恰好在表尾.导致了无法命中问题.
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-11-1 09:07:17 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

4

主题

1459

回帖

1471

积分

至尊会员

积分
1471
发表于 2024-11-1 15:33:54 | 显示全部楼层
回复

使用道具 举报

3

主题

91

回帖

100

积分

初级会员

积分
100
发表于 2024-11-2 12:12:44 | 显示全部楼层
明明system_stm32h7xx.c注释都说得清清楚楚,你修改偏移的时候没看的吗?

/************************* Miscellaneous Configuration ************************/
/*!< Uncomment the following line if you need to use initialized data in D2 domain SRAM (AHB SRAM) */
/* #define DATA_IN_D2_SRAM */

/* Note: Following vector table addresses must be defined in line with linker
         configuration. */
/*!< Uncomment the following line if you need to relocate the vector table
     anywhere in FLASH BANK1 or AXI SRAM, else the vector table is kept at the automatic
     remap of boot address selected */
/* #define USER_VECT_TAB_ADDRESS */

#if defined(USER_VECT_TAB_ADDRESS)
#if defined(DUAL_CORE) && defined(CORE_CM4)
/*!< Uncomment the following line if you need to relocate your vector Table
     in D2 AXI SRAM else user remap will be done in FLASH BANK2. */
/* #define VECT_TAB_SRAM */
#if defined(VECT_TAB_SRAM)
#define VECT_TAB_BASE_ADDRESS   D2_AXISRAM_BASE   /*!< Vector Table base address field.
                                                       This value must be a multiple of 0x400. */
#define VECT_TAB_OFFSET         0x00000000UL       /*!< Vector Table base offset field.
                                                       This value must be a multiple of 0x400. */
#else
#define VECT_TAB_BASE_ADDRESS   FLASH_BANK2_BASE  /*!< Vector Table base address field.
                                                       This value must be a multiple of 0x400. */
#define VECT_TAB_OFFSET         0x00000000UL       /*!< Vector Table base offset field.
                                                       This value must be a multiple of 0x400. */
#endif /* VECT_TAB_SRAM */
#else
/*!< Uncomment the following line if you need to relocate your vector Table
     in D1 AXI SRAM else user remap will be done in FLASH BANK1. */
/* #define VECT_TAB_SRAM */
#if defined(VECT_TAB_SRAM)
#define VECT_TAB_BASE_ADDRESS   D1_AXISRAM_BASE   /*!< Vector Table base address field.
                                                       This value must be a multiple of 0x400. */
#define VECT_TAB_OFFSET         0x00000000UL       /*!< Vector Table base offset field.
                                                       This value must be a multiple of 0x400. */
#else
#define VECT_TAB_BASE_ADDRESS   FLASH_BANK1_BASE  /*!< Vector Table base address field.
                                                       This value must be a multiple of 0x400. */
#define VECT_TAB_OFFSET         0x00000000UL       /*!< Vector Table base offset field.
                                                       This value must be a multiple of 0x400. */
#endif /* VECT_TAB_SRAM */
#endif /* DUAL_CORE && CORE_CM4 */
#endif /* USER_VECT_TAB_ADDRESS */
/******************************************************************************/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 18:57 , Processed in 0.068505 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表