STM32中断向量表复制到SRAM中运行

1、生成Map文件

复制中断向量表前需要知道中断向量表的大小,可以通过编译生成的Map文件查看。
在这里插入图片描述

2、查看中断向量表大小

中断向量表的大小是固定的,与程序代码量无关,打开Map文件,直接搜索0x08000000,我使用的 MCU 是 STM32H743XIH6,中断向量表大小为 664 字节,即 MDK 编译生成的 Bin 文件,开始的 664 个字节是中断向量表

    RESET                                    0x08000000   Section      664  startup_stm32h743xx.o(RESET)
    !!!main                                  0x08000298   Section        8  __main.o(!!!main)
    !!!scatter                               0x080002a0   Section       52  __scatter.o(!!!scatter)
    !!dczerorl2                              0x080002d4   Section       90  __dczerorl2.o(!!dczerorl2)
    !!handler_zi                             0x08000330   Section       28  __scatter_zi.o(!!handler_zi)

3、读取中断向量表的内容,并直接放在指定的SRAM 地址处

// 中断向量表大小 664 字节 
#define  VECTOR_TABLE_SIZE 664
// 中断向量表复制到 SRAM 0x24001000 地址
u8 vector_table[VECTOR_TABLE_SIZE] __attribute__ ((at(0X24001000)));
// 读取 Flash 内容
// STMFLASH_Read(addr,(u32*)vector_table,VECTOR_TABLE_SIZE/4);

值得注意的是,STMFLASH_Read 函数不能读取 Flash 程序代码所在的空间,否则会出现异常

我这里的设计是 BootLoader 程序通过 Can 接收待升级的固件 Bin 文件(然后写入指定的 FLASH 地址处,在把前 664 字节数据读出来复制给 vector_table)并将前 664 个字节的中断向量表直接复制给 vector_table,即完成了中断向量表的复制到 SRAM 的 0x24010000

4、APP程序的设置

以上只是完成了,中断向量表的复制,还需要告诉 APP 程序中断向量表的位置,APP程序中添加如下代码。

SCB->VTOR = D1_AXISRAM_BASE|0x1000;   

再运行 APP 程序的时候,使用的就是 SRAM 中的中断向量表了。
这样做的目的是,固件升级的时候,可以在 FLASH 中存放多个 APP 程序。

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七七云享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值