STM32F0xx在增加IAP后APP为什么在main函数中要重映射SRAM

发布者:CMOS最新更新时间:2016-12-27 来源: eefocus关键字:STM32F0xx  IAP  main函数  重映射  SRAM 手机看文章 扫描二维码
随时随地手机看文章

1 前言

在使用F0的片子在增加IAP后,我们经常发现,原来的APP必须增加一段代码,将中断向量表从内部FLASH拷贝到SRAM后再执行REMAP到SRAM,这样操作后APP才能正常运行,这一过程一直困扰着蝶粉们,为什么需要这样呢?本文将针对这一问题为大家解惑。

2 问题详细描述


比如F0的下面这部分代码:

#define APPLICATION_ADDRESS     (uint32_t)0x08004000/* Private macro -------------------------------------------------------------*//* Private variables ---------------------------------------------------------*/#if   (defined ( __CC_ARM ))__IO uint32_t VectorTable[48] __attribute__((at(0x20000000)));#elif (defined (__ICCARM__))#pragma location = 0x20000000__no_init __IO uint32_t VectorTable[48];#elif defined   (  __GNUC__  )__IO uint32_t VectorTable[48] __attribute__((section(".RAMVectorTable")));#endifint main(void)
{
  uint32_t i = 0;

  HAL_Init();  /* Configure the system clock to 48 MHz */
  SystemClock_Config();  /* Relocate by software the vector table to the internal SRAM at 0x20000000 ***/  

  /* Copy the vector table from the Flash (mapped at the base of the application
     load address 0x08004000) to the base address of the SRAM at 0x20000000. */
  for(i = 0; i < 48; i++)
  {
    VectorTable[i] = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));
  }  /* Enable the SYSCFG peripheral clock*/
  __HAL_RCC_SYSCFG_CLK_ENABLE(); 
  /* Remap SRAM at 0x00000000 */
  __HAL_SYSCFG_REMAPMEMORY_SRAM();  /* Add your own code here...    
*///…}123456789101112131415161718192021222324252627282930313233343536373839123456789101112131415161718192021222324252627282930313233343536373839

如上所示,在没有加入IAP之前这部分代码不需要的,而加入IAP后,这部分代码在F0中就必须添加了,不然APP会运行部正常! 从代码中可以看出,增加的代码执行了从内部FLASH中拷贝中断向量表到内存,然后重映射SRAM,可是,蝶粉们不禁要问,为什么要这么操作?这个又是什么原因造成的?

3 原因分析


3.1 重映射

在搞懂这个问题之前我们首先先来看看什么是重映射。例如F072的参考文档张SYSCFG寄存器的介绍,如下图: 
CFGR1 
MEM_MODE的介绍如下: 
MEM_MODE 
从以上内容我们可以得到以下信息: 
1. MEM_MODE的值在上电后有BOOT0,BOOT1的状态值决定。 
2. MEM_MODE的值决定了哪个内存映射到地址0x0000 0000 
也就是说: 
 当MEM_MODE =00/10时,Main Flash映射到地址0x0000 0000,即地址0x0800 0000映射到0x0000 0000. 
 当MEM_MODE =01时,System Flash映射到地址0x0000 0000,也就是芯片自带的Bootloader代码部分会映射到地址0x0000 0000,即0x1FFF C800映射到地址0x0000 0000. 
 当MEM_MODE =11时,Embeded SRAM映射到地址0x0000 0000,也就是内存地址0x2000 0000映射到地址0x0000 0000. 
3. 经过映射后,系统访问地址0x0000 0000地址,就相当于直接访问映射的地址,如0x0800 0000. 
4. 由BOOT0,BOOT1的状态决定MEM_MODE的值,进而决定哪个地址映射到地址0x0000 0000,这一过程我们称之为映射。默认映射是系统自动完成的,并由BOOT0,BOOT1的状态决定。 
5. MEM_MODE位是RW的,也就是说可以修改的,如果修改其中,也就会相应的修改映射到0x0000 0000的地址,这一修改的过程,我们就叫其为重映射。重映射是通过用户代码通过修改MEM_MODE的值来完成的。

3.2 系统启动

从STM32F072的参考手册的2.5章,我们可以看到如下内容: 
BOOT 
从以上内容我们可以得到以下有用信息: 
1. 在复位启动后,系统在系统时钟的第4个上升沿根据BOOT0,BOOT1的配置获取其值,也就是存储到寄存器SYSCFG_CFGR1的MEM_MODE位上,根据前面3.1的信息可知,这里进一步确定了0x0000 0000的映射地址。这一过程是系统自动完成的。 
2. 在系统启动后,CPU从地址0x0000 0000获取栈顶地址,然后从0x0000 0004开始执行代码。换句话说,由于0x0000 0000被映射了其他地址,获取栈顶与执行实际上都是从映射的地址上实施的。也就是从映射的地址开始执行代码,比如从地址0x08000 0004开始执行代码(如Mian Flash映射),比如0x1FFF C804(如System Flash映射,即BootLoader启动). 
于是,我们简单整理下系统的整个启动流程: 
-> 系统复位 
-> CPU在系统时钟的第4个上升沿根据BOOT0,BOOT1的配置确定寄存器SYSCFG_CFGR1的MEM_MODE的值 
-> MEM_MODE进一步决定哪个地址(Main Flash,System Flash,SRAM)映射到地址0x0000 0000. 
-> CPU从地址0x0000 0000获取栈顶,从0x0000 0004开始执行代码,也就是从映射地址获取栈顶,从映射地址+4的地方开始执行代码。 
->映射地址+4对于着复位中断例程(如0x08000 0004),也就是系统一开始就执行Reset_Handler,进而运行SystemInit然后进入到main函数,就这样,整个代码启动完成。

接下来就是中断产生于中断响应了。

3.3 中断与中断向量表

从ARM官网上的信息得知(http://infocenter.arm.com/help/index.jsp ),在Coretext-M3与Coretext-M4核中,在System Control Block中存在一个向量表偏移量寄存器 VTOR(0xE000ED08),系统产生中断后,内核通过这个寄存器的值来找到中断向量表的地址,进而执行中断例程代码,当然,此寄存器的值是可以修改的,它的默认值为0。实际上在大部分的M3和M4的工程中,一般都是在SystemInit函数中对此寄存器的值进行设置,当此之前,它的值为默认值0,由于映射关系,实际上就是指向映射地址,比如0x0800 0000. 如下图所示: 
M4
但是,由于STM32F0XX采用的是M0核,它是没有这个VTOR寄存器的,那么它又是怎么找到中断向量表的地址的呢?同样在ARM官网上我们找到如下信息: 
M0 
也就是说,对于M0来说,中断向量表的地址固定在地址0x0000 0000上! 
对此,我们也可以这么理解,将M0理解成M3/M4的特殊情况,M0假设也存在VTOR这么一个虚拟寄存器,只不过它的值不能修改,固定为0罢了,而M3/M4的这个VTOR寄存器一开始时它的值也是为默认值0,只不过在程序运行到SystemInit()函数后,在代码中明确对其进行了修改。

我们整理下STM32F0XX中断的调用过程: 
-> 产生中断 
-> CPU固定到地址0x0000 0000上找中断入口函数,由于映射关系,实际上是在从映射地址上寻找。 
-> 找到并执行中断例程

此时,可以回到我们一开始的问题上来了.

3.4 回到问题分析

3.4.1 从IAP跳转到APP的过程分析

从IAP跳转到APP时到底发生了什么呢?首先我们来看看这个跳转代码:

/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */    if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
    {
      /* Jump to user application */
      JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
      JumpToApplication = (pFunction) JumpAddress;
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
      JumpToApplication();
    }12345678910111234567891011

如上,首先测试APP地址是否存在用户代码,如果存在,则首先将APPLICATION_ADDRESS + 4,作为跳转地址,然后从APPLICATION_ADDRESS取栈顶并赋值给SP寄存器,最后跳转。

于是我们可以得出结论: 
跳转代码后,PC指针变了,SP栈指针也修改了,但是,中断向量表的位置并没有修正为APP的中断向量表位置,还是采用IAP的中断向量表位置。如果此时系统产生中断,CPU还会固定从0x0000 0000地址中去找中断入口,由于从IAP到APP,内存映射并没有改变,因此,实际上还是从0x0800 0000上去找中断入口,也就是还是在IAP的中断向量表上寻找,继续执行IAP的中断例程,进而引发hard fault,这显然不是我们想要的。

3.4.2 问题分析

这里的关键是,如何将中断向量表的寻找位置从0x0800 0000修改到0x0800 3000(假设为APP的地址)? 从之前的分析我们可以得出有两种方法: 
1 修改寄存器VTOR的值 
2 内存重映射 
M3/M4核的MCU显然采用了第一种方法,因此,在M3/M4的MCU上,即使添加了IAP,也不需要增加本文第二章所描述的代码。而这部分代码,正是M0采用的第二种方法,也是唯一可以修改寻找中断向量方式的方法。

通过将SRAM重映射到地址0x0000 0000,那么,M0系统产生中断后,CPU还是从地址0x0000 0000寻找中断入口,但是,实际上不再是寻址0x0800 0000,而是寻址0x2000 0000,这么一来,接下来我们就只需要将中断向量表整个拷贝到SRAM上,也就是0x2000 0000上,就这样,CPU就可以正常寻址中断向量表了。

4 结论

在使用STM32F0XX时,若增加IAP,则必须在APP中将中断向量表拷贝到SRAM,并将系统重映射到SRAM,这样才能使中断恢复正常工作。


关键字:STM32F0xx  IAP  main函数  重映射  SRAM 引用地址:STM32F0xx在增加IAP后APP为什么在main函数中要重映射SRAM

上一篇:USB Audio设计与实现
下一篇:如何使用CubeMx制作一个基于SD卡的文件系统工程

推荐阅读最新更新时间:2024-03-16 15:27

STM32F0xx_ EXIT中断配置详细过程
Ⅰ、概述 EXIT外部中断在使用到按键或者开关控制等应用中比较常见,低功耗中断唤醒也是很常见的一种。因此,EXIT在实际项目开发中也是比较常见的一种。 STM32F0中外部中断EXIT属于中断和事件的章节,请看参考手册第十二章,但需要配合系统配置控制器(System configuration controller)进行操作,为中断分配引脚,详情请看参考手册第十章。 Ⅱ、下载 文章提供的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘,请放心下载测试,如有问题请检查一下你的板子是否有问题。 ST标准外设库和参考手册、数据手册等都可以在ST官网下载,你也可以到我的360云盘下载。关于F0系列芯片的参考
[单片机]
STM32F0xx_ EXIT中断配置详细过程
STM32的IAP方案
简介:本文将讲述一个STM32的综合性应用示例,该示例将涉及到STM32微控制器的时钟系统、GPIO、定时器、中断系统、异步串口以及内置可编程flash等设备的应用,作为一个综合性实验的同时还具有很强的“实用”意义。这个示例就是STM32的IAP方案。 几乎所有的同类书籍都介绍综合性的应用示例如“万年历 +温度显示+闹钟响铃+计时表”这样的一个实时时钟范例或“STM32 +音频解码+大容量存储方案”这样的MP3播放器范例。这些综合性实例的目的在于引领读者进行综合性实验,达到把单片机的基础模块整合运用的目的。这些实例普遍存在一种共同点,即“练手”意义要大于“实用”的意义。本文将讲述一个STM32的综合性应用示例,该示例将涉及到S
[单片机]
58.外部SRAM实验
一。IS62WV51216 简介 1. IS62WV51216 是 ISSI(Integrated Silicon Solution, Inc)公司生产的一颗 16 位宽 512K (512*16,即 1M 字节)容量的 CMOS 静态内存芯片。 实验选用的芯片没有CS2引脚。 2. IS62WV51216读时序 3. IS62WV51216写时序 二。FSMC简介 1. STM32中FSMC框图 为什么VBT6不能用FSMC功能驱动SRAM? STM32与SRAM连接必须要连接19根地址线,FSMC_A0对应的引脚为PF0,而在100脚的STM32芯片上只有A,B,C,
[单片机]
58.外部<font color='red'>SRAM</font>实验
STM32F1_外部SRAM作为运行内存
前言 今天总结“STM32F103 外部SRAM作为运行内存”。对于运行内存应该都知道它的意思,主要是程序运行时所使用的RAM,比如我们定义的全局变量、局部变量这些在程序运行时都会在RAM中为它们开辟一片空间,用于运行时所使用。 今天提供的工程是基于前面“TIM延时”的工程修改而来,但是今天的例子是使用ST官方提供的标准库 里面“system_stm32f10x.c”文件里面现成的函数接口(使用寄存器配置) ,使其控制外部SRAM作为运行内存。昨天的工程使用标准库fsmc相应的函数接口来配置的FSMC,昨天工程的目的就是为了使其大家熟悉参数信息。因此,今天单独再提供一个工程”FSMC读写外部SRAM_官方配置”(就是用寄存器配置
[单片机]
STM32F1_外部<font color='red'>SRAM</font>作为运行内存
一种基于MCU内部Flash的在线仿真器设计方法
由于市场对MCU功能的要求总是不断变化和升级,MCU应用的领域也不断扩展,因此往往需要对最初的设计进行修改。Flash MCU与以往OTP/MASK MCU相比,最大的优点就在于可进行高达上万次的擦写操作,顺应了MCU功能不断修改的需求;另一方面,Flash MCU市场价格也在不断下降。因此,许多OEM已将Flash MCU用于产品的批量生产。对于Flash MCU,基于内部Flash的在线仿真器更接近于程序真实的运行特性,程序调试的效果更好,效率更高。实际上,Flash MCU工作时Flash的延时、读写时充等特性是非常,程序存储在MCU外部仿真板上的SRAM中,由额外的硬件逻辑来模拟Flash的这些特性是费时低效的;同时将Fl
[单片机]
SoC用低电压SRAM技术
东芝在“2010 Symposium on VLSITechnology”上,发布了采用09年开始量产的40nm工艺SoC的低电压SRAM技术。该技术为主要用于便携产品及消费类产品的低功耗工艺技术。通过控制晶体管阈值电压的经时变化,可抑制SRAM的最小驱动电压上升。东芝此次证实,单元面积仅为0.24μm2的32MbitSRAM的驱动电压可在确保95%以上成品率的情况下降至0.9V.因此,低功耗SoC的驱动电压可从65nm工艺时的1.2V降至0.9V以下。   降低SRAM的电压是SoC实现微细化时存在的最大技术课题之一。SRAM由于集成尺寸比逻辑部分小的晶体管,因此容易导致每个晶体管的阈值电压不均。而且,使6个晶体管联动可实现
[模拟电子]
SoC用低电压<font color='red'>SRAM</font>技术
Cortex—M3的SRAM单元故障软件的自检测研究
引言 目前,对于存储单元SRAM的研究都是基于硬件电路来完成,而且这些方法都是运用在生产过程中,但是生产过程并不能完全杜绝SRAM的硬件故障。在其使用过程中,如果SRAM硬件出错,将导致程序出错而且很难被发现。因此在运用的阶段,为防止存储单元损坏而导致系统出错,通过软件的方式对SRAM进行检测是必要的。 1 SRAM运行状态分析 SRAM是存储非CONSTANT变量(如RW),它具有掉电即失的特点。由Cortex—M3的启动步骤可知,系统上电后,首先执行复位的5个步骤: ①NVIC复位,控制内核; ②NVIC从复位中释放内核; ③内核配置堆栈; ④内核设置PC和LR; ⑤运行复位程序。 可以看出,不
[单片机]
Cortex—M3的<font color='red'>SRAM</font>单元故障软件的自检测研究
基于51单片机IAP技术的LED显示屏控制系统
  LED显示屏由于其具有耗电少、使用寿命长、成本低、亮度高、故障少、视角大、可视距离远等特点,已经成为新一代的信息传播媒体工具。LED与LCD相比较最突出的特点是,亮度高、成本低且屏幕尺寸可根据现场情况用标准LED单元板拼制。按安装位置可分为室外、半室外和室内;按颜色可分为单色、双基色和彩色;按发光二极管点距可分为φ5.0、φ3.75及φ3.0等。本文以市场上常见的室内双色LED单元板为控制对象,说明基于单片机IAP技术的LED显示屏控制系统工作原理以及数据组织方法。 1 双色LED单元板硬件组成及工作原理   常见的室内双色LED单元板电路框图如图1(a)所示。其中行扫描电路由2片74HC138(3-8译码器)构成的4
[单片机]
基于51单片机<font color='red'>IAP</font>技术的LED显示屏控制系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved