当MCU中有两段或以上程序的时候(第一个程序为用户BootLoader程序,其他的为APP程序,这个在前期视频《什么是ISP?什么是IAP》中有讲过),APP程序中都需要做中断向量偏移,那么什么是中断向量偏移,为什么要做中断向量偏移?

上一期常见问题《GD32 MCU是如何进入中断函数的》和大家讲过中断向量表的概念,当一个中断发生时,MCU会根据中断号去中断向量表中查找对应中断函数的入口。那如果APP程序中有中断发生,MCU还在0x08000000地址开始的地方去找中断函数入口显然是不行的,因为找到的中断函数入口对应的是BootLoader中断函数,跳转过去的话程序就运行异常了,这时候就需要做中断向量偏移:即让MCU从0x08000000偏移一段长度的地址开始去查找向量表。

比如一段APP程序保存在0x08008000(不会设置的小伙伴可以参考前期视频《keil中GD32 MCU IAP中APP的存储地址如何设置》),那么就需要MCU去这个地址开始的地方去查APP的向量表,也就是需要偏移0x8000。什么是中断向量偏移,为什么要做中断向量偏移?-LMLPHP

那么如何实现中断向量偏移呢?GD官方库中提供了一个函数:nvic_vector_table_set

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

参数1为中断向量表基地址,一般选择NVIC_VECTTAB_FLASH,也就是flash的基地址0x08000000;

参数2为偏移量,比如这里我们用0x8000。

所以只要在main函数的第一句调用下这个函数就可以实现中断向量偏移啦:

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

是不是特别简单呢?

更多GD32 MCU相关咨询:https://www.gd32bbs.com/

07-18 11:23