datasheet

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

2018-07-11来源: eefocus 关键字: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  重定位  向量表

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

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

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

推荐阅读

Exynos4412裸机程序之代码重定位初体验

程序当前所处的地址,即程序在运行时,所处的当前地址;二是程序的链接地址,即程序运行时应该位于的运行地址。编译程序时,可以指定程序的链接地址。什么是重定位对于Tiny4412而言,前面我们已经说过:启动时BL1只会从sd等启动设备中拷贝14K的代码到IRAM中,那么当我们的程序超过14K怎么办?那就需要我们在前14K的代码中将整个程序完完整整地拷贝到DRAM等其他更大存储空间,然后再跳转到DRAM中继续运行我们的代码,这个拷贝然后跳转的过程就叫重定位。本章中我们主要学习如何重定位,但是并不会涉如何使用到DRAM,而是简单地将代码从IRAM的0x02023400处拷贝到IRAM的0x0202a000处,然后跳转到0x0202a000处
发表于 2018-10-14
Exynos4412裸机程序之代码重定位初体验

Exynos4412裸机之DDR-SDRAM中重定位

上一此实验我们讲解了如何对代码进行重定位,但是将代码重定位到只有256K的IRAM中作用不大。正确的做法是将代码重定位到容量更大的主存中,即DRAM中。Exynos4412中有两个独立的DRAM控制器,分别叫DMC0和DMC1。DMC0和DMC1分别支持最大1.5GB的DRAM,它们都支持DDR2/DDR3和LPDDR2等,512 Mb, 1 Gb, 2 Gb, 4 Gb and 8 Gbit的内存设备,支持16/32bit的位宽。DRAM0 对应的地址是0x4000_0000~0xAFFF_FFF共1.5GB,DRAM1 对应的地址是0xA000_000~0x0000_0000共1.5GB。DRAM控制器地址映射Tiny4412
发表于 2018-10-14
Exynos4412裸机之DDR-SDRAM中重定位

Tiny210裸机之DDR_SDRAM重定位

u-boot里面的,只是自己从头对照寄存器去理解了一下,完全符合598页的初始化步骤),放在了"Tiny210学习日记_代码"目录下了,名为"7_ddr"注意:之前的代码,包括该部分代码,都没有重定位的操作,IROM最多可以拷贝16K的代码到IRAM中,够用了!但是,由于后面我会讲到LCD显示图片,声卡播放WAV文件,bootloader也随之慢慢变大,16K的大小可能不够,再加上现在已经把重定位的条件都准备好了,所以接下来将是重定位。(相关知识,大家可以学习韦东三一期视频的重定位部分),这里,我就不在细说,直接给出代码,和讲几个关键地方。以下为start.s的代码:.global
发表于 2018-10-13

OK6410裸机片内内存中重定位代码

看门狗     // 往WTCON(0x7E004000)写0     ldr r0, =0x7E004000    mov r1, #0    str r1, [r0]// 重定位     adr r0, _start          // 伪指令,取_start的当前地址   
发表于 2018-10-11

S3c2440代码重定位详解

第001节段的概念重定位的引入S3C2440的CPU可以直接给SDRAM发送命令、给Nor Flash发送命令、给4K的片上SDRAM发送命令,但是不能直接给Nand Flsh发送命令假如把程序烧写到Nand Flsh上,即向Nand Flsh烧入* bin* 文件,CPU是无法从Nand Flsh中取代码执行的。为什还可以使用NAND启动?上电后,Nand启动硬件会自动把Nand Flsh前4K复制到SRAM;CPU从0地址运行SRAM;如果我的程序大于4K怎么办?前4K的代码需要把整个程序读出来放到SDRAM(即代码重定位)。如果从Nor Flash启动,会出现什么问题?将拨动开关拨到Nor Flash启动时,此时
发表于 2018-07-22
S3c2440代码重定位详解

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

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

小广播

何立民专栏

单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved
pt type="text/javascript" src="//v3.jiathis.com/code/jia.js?uid=2113614" charset="utf-8">