什么是中断向量偏移,为什么要做中断向量偏移?

[复制链接]
1769|6
 楼主| 聚沃科技 发表于 2024-7-18 09:35 | 显示全部楼层 |阅读模式
本帖最后由 聚沃科技 于 2024-7-18 09:37 编辑

MCU中有两段或以上程序的时候(第一个程序为用户BootLoader程序,其他的为APP程序,这个在前期视频《什么是ISP?什么是IAP》中有讲过),APP程序中都需要做中断向量偏移,那么什么是中断向量偏移,为什么要做中断向量偏移?
上一期常见问题《GD32 MCU是如何进入中断函数的》和大家讲过中断向量表的概念,当一个中断发生时,MCU会根据中断号去中断向量表中查找对应中断函数的入口。那如果APP程序中有中断发生,MCU还在0x08000000地址开始的地方去找中断函数入口显然是不行的,因为找到的中断函数入口对应的是BootLoader中断函数,跳转过去的话程序就运行异常了,这时候就需要做中断向量偏移:即让MCU0x08000000偏移一段长度的地址开始去查找向量表。
比如一段APP程序保存在0x08008000(不会设置的小伙伴可以参考前期视频《keilGD32 MCU IAPAPP的存储地址如何设置》),那么就需要MCU去这个地址开始的地方去查APP的向量表,也就是需要偏移0x8000
图片1.png
那么如何实现中断向量偏移呢?GD官方库中提供了一个函数:nvic_vector_table_set
图片2.png
参数1为中断向量表基地址,一般选择NVIC_VECTTAB_FLASH,也就是flash的基地址0x08000000
参数2为偏移量,比如这里我们用0x8000
所以只要在main函数的第一句调用下这个函数就可以实现中断向量偏移啦:
图片3.png
是不是特别简单呢?

教程由GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网,GD32MCU技术交流群:859440462

tpgf 发表于 2024-7-19 08:28 | 显示全部楼层
中断向量的偏移是头文件中已经定好了的吗
paotangsan 发表于 2024-7-19 09:44 | 显示全部楼层
中断向量的偏移量是固定不可更改的吗
renzheshengui 发表于 2024-7-19 20:00 | 显示全部楼层
所有偏移量的起始地址是一样的 那么这个其实地址如果更改的话 会造成混乱吗
keaibukelian 发表于 2024-7-19 21:39 | 显示全部楼层
所有的向量的偏移的基地址会因为芯片的不同而不同吗
heimaojingzhang 发表于 2024-7-19 22:45 | 显示全部楼层
用户自己可以更改这个中断向量的偏移量吗
guanjiaer 发表于 2024-7-19 23:51 | 显示全部楼层
其实我理解的就是不同的中断针对基地址的差值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

170

主题

190

帖子

13

粉丝
快速回复 在线客服 返回列表 返回顶部