MM32 IAP中断向量表重定义

  • MindMotion
  • LV4工程师
  • |      2018-02-01 17:22:07
  • 浏览量 771
  • 回复:0
来源 灵动MM32有客户需要用到MM32L073,需要通过IAP进行固件升级,在FLASH里面要烧录两份代码:一个Boot loader,一个用户应用程序。在开发应用程序时,使用中断函数不能相应中断。 在开发IAP的用户应用程序时,必须得重新映射中断向量表,中断向量表即某个中断服务程序的入口地址的集合。 在Cortex-M3内核的MCU上可以通过设置SCB->VTOR =FLASH_BASE | VECT_TAB_OFFSET;该寄存器的值来实现中断向量表的重定义。但用户反馈在MM32L0xx系列以Cortex-M0为内核的单片机中却怎么也找不到这个设置中断向量表的寄存器,用户可以通过以下方法来实现中断向量表重定义。 实现方法基本思想:1、将中断向量表放入到RAM的起始地址(只需要在应用程序中保留RAM起始地址的0x100大小不使用即可)。2、在bootload中将应用程序的中断向量表从Flash中拷贝到RAM中。3、设置MM32L073中断向量表位于RAM中。 0x20000000是SRAM的起始地址,0x08010000是应用程序的起址地址,从0x08010000开始的字节,存放应用程序的中断向量表。 应用程序代码及自身中断矢量表存放在离0X08000000加某个地址偏移量的地方,即从0x08000000+偏移量的地址开始存放APP代码及中断矢量。这个偏移量要大于IAP的程序空间,防止程序覆盖重定义的中断向量表的数据。在本程序中的偏移量为0x10000,即APP程序的起始地址为0x08010000。 当应用程序发生中断时,内核就从地址0x00处的向量表取相应中断的入口地址,即相当于从0x20000000处的向量表取中断入口地址,当然也相当于从0x08010000处的向量表取中断入口地址,然后去执行相应中断程序。 可以根据startup_MM32L0xx.s的中断函数的入口地址数计算需要预留的空间大小。 如上图所示,每一个DCD都代表一个中断向量。例如:DCD WWDG_IRQHandler ;Window Watchdog“WWDG_IRQHandler "其实就是WWDG中断服务函数WWDG_IRQHandler的入口地址。 中断向量的集合定义了一张中断向量表,这张表包括48个元素,每个元素是一个长度为4字节的地址。除了第一个地址是SP(堆栈指针)外,其它的地址都是某个中断服务程序的入口地址。中断向量表的所占内存大小为48*4=180(0xC0)个字节。
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子