STM32F030Cxxx 没有SCB->VTOR,如何重定位向量表

2018-07-11 20:25:45编辑:什么鱼 关键字:STM32F030Cxxx  重定位  向量表

最近使用了一款Cortex-M0内核的芯片STM32F030CC,发现它中断向量表的重映射方法与STM32F10x系列的有所区别,在这里记录与分享一下。

     由于需要通过IAP进行固件升级,所以芯片的FLASH里面要烧录两份代码:一个Boot loader, 一个用户应用程序。理所当然的,在用户应用程序中,必须得重新映射中断向量表。

     可是在ST提供的固件库里,我却没有发现类似于stm32f10x固件库中的voidNVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)接口。

     浏览了一下Cortex-M0的Programmingmanual,原来M0并没有SCB->VTOR这个寄存器,难怪ST的库里没有提供NVIC_SetVectorTable这个接口。

     这下要怎么办?在网络上搜索了一下,受到网友findaway123这篇文章的启发,我在STM32F030CC的Reference manual中找到以下说明:

     Physicalremap

  Once the boot mode is selected, the application software can modify the memory accessible in the code area.This modification is performed by programming the MEM_MODE bits in the SYSCFG configuration register 1 (SYSCFG_CFGR1). Unlike Cortex? M3 and M4,the M0 CPU does not support the vector table relocation. For application code which is located in a different address than 0x0800 0000, some additional code must be added in order to be ableto serve the application interrupts. A solution will be to relocateby software the vector table to the internal SRAM:

  ? Copy the vector table from the Flash (mapped at the base of theapplication load address) to the base address of the SRAM at 0x20000000.

  ? Remap SRAM at address 0x0000 0000, using SYSCFG configuration register 1.

  ? Then once an interrupt occurs, the Cortex?-M0 processor will fetch the interrupt handler start address from the relocated vector table in SRAM, then it will jump to execute the interrupt handler located in the Flash.

  This operation should be done at the initialization phase of the application. Please refer to AN4065 and attached IAP code from www.st.com for more details.

  OK,解决方法找到了!


  在用户应用程序中,按照以上方法,添加以下两行代码:

    memcpy((void*)0x20000000, (void*)0x08004000, VECTOR_SIZE); SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);


memcpy((void*)0x20000000, (void*)FLASH_MAIN_FW_START_ADDR, 0xB4); 

  __HAL_SYSCFG_REMAPMEMORY_SRAM();

中括号中是我实际使用的code

   其中,0x2000 0000是SRAM的起始地址,这个不需要改动。

   而之后的两个参数需要根据实际情况作出修改。0x08004000是应用程序的起址地址,从这里开始的VECTOR_SIZE字节,存放是的应用程序的中断向量表。VECTOR_SIZE是指中断向量表的大小,具体多大可以在startup.s文件里计算得到。以下以startup_stm32f030.s为例作说明:



  我们只需关注其中的一小部分。从29行开始,直到75行,每一个DCD都代表一个中断向量(所谓中断向量,说得明白点,其实就是某个中断服务程序的入口地址)。例如第74行的:

  DCD     USART1_IRQHandler              ; USART1

  这里的“USART1_IRQHandler"其实就是UART1中断服务程序USART1_IRQHandler这个函数,同时,它也代表这个函数的入口地址。

  以上代码即定义了这样一张表,这张表包括45个元素,每个元素是一个长度为4字节的地址。除了第一个地址是SP(堆栈指针)外,其它的地址都是某个中断服务程序的入口地址。

  那么,回到我们要解决的问题上来,之前memcpy函数中的第三个参数VECTOR_SIZE,针对本例,就应该是45*4=180(0xB4)个字节。


  在执行完以上两行代码后,若发生中断,CPU就会去SRAM(即0x2000 0000处)取中断向量了,所以,以0x20000000作为起始地址之后的VECTOR_SIZE个字节就不能被改动了。为了达到这VECTOR_SIZE个字节不被修改的目的,如下两种方法可以实现。

  ?在工程文件内修改SRAM的起始地址及长度,如下图

  

  ?如果使用了分散加载文件,则在分散加载文件中修改SRAM的起始地址及长度也能达到目的。


  至此,STM32F0系列Cortex-M0内核芯片中断向量表重映射的问题已解决。


关键字:STM32F030Cxxx  重定位  向量表

来源: eefocus 引用地址:http://www.eeworld.com.cn/mcu/2018/ic-news071140236.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32L4xx下bootloader重设中断向量表的一个问题
下一篇:为什么中断向量表重映射到高地址

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

ARM中断向量表重定位到片外RAM方法

由于ARM CPU产生中断或者异常后,PC指针自动跳转到0x00地址执行(同时执行一些CPSR寄存器的保存、运行模式的转换等),所以要在0x00地址处存放中断向量表。而如果我们想将中断向量表重定位到片外ram的 话, 有2中方法:1、启用MMU将片外RAM空间隐射到0x00处2、在0x00(片内RAM)地址处存放一份和片外RAM一模一样的中断向量表标准做法是将程序存放在NAND FLASH里面,S3C2440 CPU启动后,会将程序复制到片内RAM里面,此时中断向量表也复制到了IRAM里3、有部分CPU支持设置中断向量表的寄存器这样也可以实现重定位
发表于 2018-07-11 20:31:09

ARM remap与重定位摘抄

;1)使用它的NAND boot模式。为什么NAND boot会比较快,那是因为2410里面有块小石头——"SteppingStone",一块 4KB SRAM,它是映射在0x0的。启动程序会自动被copy到这个石头里面。自然异常向量的入口放到这个地方,一样可以达到比NOR boot快的启动、异常响应速度。    2)如果你对NOR Boot情有独衷,那么你只好把你的异常向量的入口copy到SDRAM里面,实现所谓的High Vector对重定位我的理解:关于重定位,基于NOR BOOT的情况下,需
发表于 2018-06-04 21:11:08

ARM中断向量表重定位到片外RAM方法

由于ARM CPU产生中断或者异常后,PC指针自动跳转到0x00地址执行(同时执行一些CPSR寄存器的保存、运行模式的转换等),所以要在0x00地址处存放中断向量表。而如果我们想将中断向量表重定位到片外ram的 话, 有2中方法:1、启用MMU将片外RAM空间隐射到0x00处2、在0x00(片内RAM)地址处存放一份和片外RAM一模一样的中断向量表      标准做法是将程序存放在NAND FLASH里面,S3C2440 CPU启动后,会将程序复制到片内RAM里面,此时中断向量表也复制到了IRAM里3、有部分CPU支持设置中断向量表的寄存器     这样
发表于 2018-06-04 21:10:34

ARM中的链接地址为什么ARM要重定位

在考虑为什么要重定位的问题之前,我们首先要明白一下几点:          1. 链接地址的定义:我自己理解是,程序被定义的开始执行的内存地址。          2. 当ARM从nandflash启动的时候,CPU所做的工作是将nandflash中的前8K代码自动的到6410的0地址(即Stepping Stone)中去,然后从0地址开始执行程序。          3. 程序在执行过程中,用链接地址来访问全局变量。全局变量一般被存放于程序
发表于 2016-06-22 09:57:30

一种基于TI TMS320 DSP的软件动态链接技术

    摘要:介绍了软件动态链接技术的概念和特点,提出了基于TI TMS320系列DSP的软件动态链接技术。该技术解决了可重配置的DSP系统中关于软件二进制目标代码的动态加载和卸载的问题。采用该技术的软件重配置方案已成功运用于某多功能通信系统,为基于其他系列DSP的可重构数字处理系统提供了一定的参考,在无人值守设备、多功能信号处理设备方面具有一定的应用价值。关键词:动态链接;TI TMS320 DSP;COFF文件;重定位    基于数字信号处理器(DSP)的多功能自适应通信系统在软件无线电领域正变得日益普遍,如何使DSP系统在运行期间自适应的改变通信协议是实现这种
发表于 2012-08-19 22:22:36
一种基于TI TMS320 DSP的软件动态链接技术

为什么中断向量表重映射到高地址

、0x04000000-0x05ffffff,这样进程切换就省事多了,不必进行重建页表等工作。    但是,这同时带来了中断跳转的问题。当发生异常时,需要跳到0x0位置的异常向量表,这个0x0应该是VA,且小于32M,如果开启了MMU,就会被转换为MVA,而不同的PID产生不同的MVA,这就导致异常向量表的地址不统一了。所以,Linux采取了将0x0位置的向量表映射到高地址0xffff0000处,就没有上述的问题了,看了半天原来是这么回事。。。    接下来,就是MVA如何映射PA的工作。s3c2410的datasheet中说到4中映射方案,其中最方便的是段(section)操作,具体见《s3c2410 MMU》的后半文。
发表于 2018-07-11 20:26:35

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved