datasheet

STM32f030 boot iap升级时keil配置注意事项

2018-07-10来源: eefocus 关键字:STM32f030  boot  iap  升级  keil配置  注意事项

最近使用了一款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 canmodify the memory accessible in the code area.This modification isperformed by programming the MEM_MODE bits in the SYSCFGconfiguration register 1 (SYSCFG_CFGR1). Unlike Cortex? M3 and M4,the M0 CPU does not support the vector table relocation. Forapplication code which is located in a different address than0x0800 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 configurationregister 1.

  ? Then once an interrupt occurs, the Cortex?-M0 processor willfetch the interrupt handler start address from the relocated vectortable in SRAM, then it will jump to execute the interrupt handlerlocated in the Flash.

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

  OK,解决方法找到了!


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

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

SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);

   有些地方会多一行代码

memcpy((uint32_t*)0x20000000, (uint32_t*)0x08004000, VECTOR_SIZE); 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_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内核芯片中断向量表重映射的问题已解决。



关键字:STM32f030  boot  iap  升级  keil配置  注意事项

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

上一篇:STM32 BootLoader跳转APP,中断特殊处理
下一篇:STM32F030C6外部中断的配置(按键触发)

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

推荐阅读

STM32F10x系列UART中断异常调试经历

硬件环境: STM32F105RCT6软件环境:FreeRTOSV8问题描述:采用中断方式接收数据,然后将收到的一帧数据放入消息队列,然后有专门的一个任务用来从消息队列中取数据并处理。jlink调试以及烧录运行都是可以的,但是当随着通信频率的增加以及运行时间的加长,系统会出现“死机”(即,不停的进入中断而致使主程序流程无法执行);问题分析:根据现象猜测   1、是否为堆栈溢出了呢?  2、是否频率太高了呢? 3、是否标志位忘记没有清除呢?然后逐项进行测试:1、查htm文件确定大概需要的堆栈,发现确实存在溢出的可能:而我分配的为:然后更改为0x00000800,烧录测试,还是存在同样问题,然后在调试串口
发表于 2018-12-03
STM32F10x系列UART中断异常调试经历

STM32F103做从机SPI通信SPI3中断异常

在做AM335D板子与STM32F103使用SPI通信时,需要用到STM32的从机模式,所以特别对于ST的从机模式进行了研究,由于硬件上使用的是STM32F103的SPI3,所以过程中遇到了一点麻烦,这里记录一下过程,以备查阅:使用SPI3通信时,从机时钟产生不了中断,经过查阅资料,是因为spi3的nss口与JTAG有共用引脚,所以配置错误会导致SPI3无法使用。需要注意以下两点就可以了:1.开启GPIO时钟的同时,开启AFIO时钟,如下:RCC_APB2PeriphClockCmd(    RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE ); 
发表于 2018-12-03

STM32F030使用RTC周期性唤醒STOP模式

首先,F030与F072的RTC唤醒功能是不一样的,在相关定义文件stm32f0xx_exti.h中有如下定义:#define EXTI_Line17      ((uint32_t)0x00020000)  /*!< Internal interrupt line 17                                            
发表于 2018-12-03

STM32F429之中断服务函数名

以下内容在startup_stm32f429_439xx.s文件内;******************** (C) COPYRIGHT 2015 STMicroelectronics ********************;* File Name          : startup_stm32f429_439xx.s;* Author             : MCD Application Team;* @version           
发表于 2018-12-03

STM32F407学习笔记——Systick中断

#include <stm32f4xx.h> GPIO_TypeDef* io_led=GPIOC;const u16 pin_led=GPIO_Pin_1; static __IO uint32_t TimingDelay; void Led_Init(){ GPIO_InitTypeDef GPIO_init_l; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); GPIO_init_l.GPIO_Pin=GPIO_Pin_1; GPIO_init_l.GPIO_Mode=GPIO_Mode_OUT
发表于 2018-12-01

stm32f103 rcc时钟寄存器设置和usart寄存器

这几天把rcc时钟搞明白了。其实主要是流程 看错了计算器1到31位,结果是错位了,一直找不到原因。原来mac 自带编程计算器也是从0到31stm32中文手册讲得比较明白自己摸索下设置了串口发送数据自己用的是蓝色药丸 (blue pill )淘宝10块不到一小块 stm32f103c8t6led灯是portc 13脚本程序全部是用寄存器方式设置#include "stm32f10x_lib.h"#include#include "sys.h"//测试c++ class LED{public:  LED();  ~LED();  }; 
发表于 2018-11-30
stm32f103 rcc时钟寄存器设置和usart寄存器

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,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">