中断是处理器与外设通信的一种方式,它的出现使得处理器不需要通过轮询来等待外设的响应,提高了处理器的效率。然而,中断处理还需要用到中断向量表,它是一张表格,存储了各个中断服务例程的入口地址,当中断来临时,处理器会从中断向量表中找到相应的中断服务例程的入口地址进行响应。
在STM32中,中断向量表是存储在内存的一段区域,其地址默认为0x0800 0000。但是,由于STM32的Flash中包含了Bootloader、内核代码和应用程序等多个部分,需要对中断向量表进行偏移。
首先,由于stm32芯片采用了Harvard结构,指令和数据存储在不同的存储空间中,因此需要将指令存储在FLASH中,而数据存储在RAM中。在Flash中,中断向量表的地址为0x0800 0000,而在RAM中,其地址为0x2000 0000。因此,当程序从Flash中复制中断向量表到RAM中时,需要对中断向量表进行偏移才能正确读取。
其次,STM32的Flash有多个扇区,每一扇区的大小都不相同。因此,需要对中断向量表进行偏移才能保证中断向量表始终存储在Flash的第一个扇区中。
在工程中,可以通过修改链接脚本来进行中断向量表的偏移。链接脚本的作用是定义可执行文件中各个段的长度、位置和属性,告诉链接程序如何将目标文件链接成可执行文件。实际上,链接脚本也就是加载程序需要的信息表,其中包含了程序的入口地址、中断向量表的起始地址等信息。
在进行中断向量表的偏移时,需要修改链接脚本中的中断向量表起始地址,让其指向正确的位置。使用MDK环境的话,可以通过修改startup_stm32f10x_x.s文件中的中断向量表起始地址来实现。
中断向量表是STM32中实现中断处理的重要标志,中断向量表的偏移使得STM32在处理中断时更加高效和灵活。在编写STM32的代码时,一定要根据实际情况对中断向量表进行偏移,以免出现不必要的错误。