STM32或GD32修改ROM起始地址和中断向量表起始地址程序运行情况

一、实验环境:

IDE:IAR8.32,硬件平台:GD32F4xx

二、实验现象:

修改ROM地址为0x08010000,vector地址0x08010000,main函数中中断向量表不设置为0x08010000(即默认值),dubug模式全速运行时出现Hardfault。main函数中中断向量表设置为0x08010000时dubug运行正常。无论是否设置中断向量表,断电重启时,程序无法正常运行。

三、分析原因:

1.在调试状态下:

ROM地址为0x08010000,vector地址为0x08010000,在debug模式下,能在(0x08010000+4)处找到ResetHandler,进而能正常进入main函数,不过SCB->VTOR的值是默认值0x0(对应flash地址应该就是0x08000000),当系统中断发生时,在中断向量表里找不到中断服务函数的地址,因此出现Hardfault。main函数开始时对SCB->VTOR=0x08010000,因此能够正常运行。

2.在断电重启状态下:

断电重启后,系统会从0x08000000处启动,给sp,和pc指针赋值,而ROM地址为0x08010000,vector地址0x08010000,即烧程序时会将程序烧在0x08010000地址处,0x08000000处是空的,因此断电重启无法正常启动

四、其他思考

vector地址0x08000000,ROM地址0x08010000呢?

实际测试结果是无论是调式状态运行还是断电重启运行,都正常。因为此时ResetHandler的地址在0x08010000之后,中断向量表在0x08000000之后,中断向量表的内容(中断函数地址),有正确的ResetHandler的地址,因此中断发生时能够正常运行。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值