STM32从Flash地址0x08000000的启动重映射
在初写STM32程序时,遇到一个困惑,STM32的Flash在MDK里被设置为起始地址0x0800 0000,而CM3手册规定芯片复位时要从0x0000 0000地址开始取出中断向量 ,那STM32怎么样执行代码呢?地址重映射?或者在0x0000 0000里有对应有实际存储器?
仔细阅读手册,发现这件事是因为STM32设计的Flash起始地址是在0x0800 0000位置开始的。全部代码都只能从这里开始存储。详见STM32 referenc manual手册第54页。
那既然从这里才能存储代码,就必须在MDK里设置Flash地址为0x0800 0000,下面是MDK设置页面,这个应该都看到过:
这样就还有一个问题,理论上,CM3中规定上电后CPU是从0地址开始执行,但是这里中断向量表却被烧写在0x0800 0000地址里,那启动时不就找不到中断向量表了?既然CM3定下的规矩是从0地址启动,SMT32当然不能破坏ARM定下的“规矩”,所以它做了一个启动映射的过程,就是和芯片上总能见到的BOOT0和BOOT1有关了,当选择从主Flash启动模式后,芯片一上电,Flash的0x0800 0000地址被映射到0地址处,不影响CM3内核的读取,所以这时的CM3既可以在0地址处访问中断向量表,也可以在0x0800 0000地址处访问中断向量表,而代码还是在0x0800 0000地址处存储的。这就是最难理解的地方,其实,这是基本上所有ARM芯片采用的启动映射方法。ARM7,ARM9没有内部Flash的通常都是这样做的。这个过程出自STM32 referenc manual手册,里面是有说明的:
还要注意,这个中断向量表是可以在程序中再次被映射的。控制它的就是CM3已经规定的NVIC寄存器SCB->VTOR。在STM32库中给出的启动代码里,startup_stm32f10x_hd.s文件里,第146行,是上电后读取中断向量表中的复位中断位置,并执行复位中断处理代码,代码如下:
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
注意复位后第一个被执行的是SystemInit代码,这个代码在库目录下的system_stm32f10x.c文件里,它初始化了时钟,NVIC等一系列操作,这里摘要与中断向量有关的代码:
void SystemInit (void)
{
......
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif
}
可以看出中断向量重映射是一个选择性编译,通常宏定义VECT_TAB_SRAM都没有被定义,所以这里执行结束后,SCB->VTOR就是FLASH_BASE了,值为0x0800 0000。以后CM3再取中断向量里,就会根据SCB->VTOR的设置,从这里取向量执行了。中断向量自此终于转正。
注意这时连__main函数都还没进,看起来中断向量的重映射位置还是够早的。
STM32从Flash地址0x08000000的启动重映射相关推荐
- 为什么STM32设置Flash地址0x08000000而不是0x00000000?STM32的启动过程
STM32F103ZE芯片存储空间的地址映射关系图. 在MDK编译程序设置ROM和RAM地址时候发现: IROM1为片上程序存储器,即片上集成的Flash存储器,对该处理器Flash大小为512KB, ...
- STM32工作笔记0050---端口复用和重映射
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 端口复用重要,端口重映射作为了解,有些复杂.
- STM32学习日记3---定时器TIM3重映射PWM波呼吸灯实验
文章目录 1. 代码 关于PWM波的输出,我们需要用到定时器的4个通道(通用定时器和高级定时器有,基本定时器没有这4个通道)里面的PWM生成.然后查看数据手册,了解定时器的重映射引脚情况.所以配置时, ...
- stm32运行java_STM32之——3种启动方式学习
参考: https://blog.csdn.net/wwt18811707971/article/details/78678059 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第 ...
- OK6410 tftp下载内核、文件系统以及nand flash地址相关整理、总结
飞凌官方提供了一键下载烧写linux的方式,相对来说比较方便,但是对于开发来说不够灵活,因此这篇文章把tftp相关的点介绍一下,整理下其中遇到的一些问题. 一键烧写本质上是启动位于SD卡中的Uboot ...
- STM32——端口复用与重映射
目录 端口复用的概念 内置外设的概念 端口复用的概念 端口复用的配置 配置示例(串口1) 复用GPIO的配置 STM32中文参考手册 110页 端口重映射概念 端口重映射概念 部分重映射 完全重映射 ...
- for根据ID去重_汽车ECU参数标定之配置Overlay RAM实现Qorivva MPC57xx系列MCU参数在线标定和代码重映射原理和方法详解...
内容提要 引言 1. MPC5744P的Overlay RAM工作原理介绍 2 MPC5744P的Flash Overlay配置详解 2.1 平台Flash标定区域描述字寄存器配置字0--PFLASH ...
- stm32内部Flash读写
文章目录 1.stm32内部flash介绍 2.读写驱动编写 3.源码 上篇文章讲到了STM32来驱动外部flah的操作,flash真是好东西啊,内存大,能存的东西多,这样我们就可以用它来做一些大点的 ...
- 基于STM32的Flash擦除方式
基于STM32的Flash擦除方式 前言 介绍 STM32 FLASH 闪存的编程和擦除 Flash擦除的标准库函数 软件设计 直接使用固件库函数擦除当前地址所在的内容 擦除对应地址和大小的Flash ...
最新文章
- 微软或允许 Android 应用运行于 Windows 和 WP
- 用Unity3D实现简单的牧师与魔鬼游戏(动作分离版)
- 嵌入式工程师开发工作主要做些什么,以后收入怎样
- 机器学习(3):信息论
- inceptor-plsql 系统预定义函数/过程
- 数据库概述之数据库设计实例分析
- 力软框架java_力软敏捷框架 jfGrid 使用例子之一
- 2022最新简历模板
- c语言 愚人节题目,愚人节整人题目大全
- 中国管理信息化杂志中国管理信息化杂志社中国管理信息化编辑部2022年第16期目录
- 小程序服务器获取appid,微信小程序小程序appid如何获取
- 用友U8采购订单查询
- Java做彩虹进度条,Android自定义控件-彩虹条进度条
- hdfs单点故障和内存受限问题
- 虚拟机启动后一直黑屏的解决办法
- 组合图形-第13届蓝桥杯Scratch省赛1真题第4题
- 利用python进行excel格式处理并关联
- 一个登录页面的测试用例
- 获取京东 Cookie/浏览器获取 Cookie
- PUB/SUB Pattern-Oriented Software Architecture v1巨详细读书笔记 11
热门文章
- caffe 网络模型文件中的参数含义(top bottom lr_mult decay_mult)与模型编写以及模型自定义
- 计算机磁盘网络怎么共享,电脑的某个磁盘如何设置成共享
- iOS:决战三国的续命分析
- 客户服务:提供有效客户客服的几种方法
- SSM框架概念(什么是SSM框架)
- SIMULINK电力电子仿真
- Windows 11安装Mybase 8.2.13
- WIN7系统,电脑防火墙怎么设置?
- iOS15.4.1 正式版紧急推送,修复卡顿和耗电异常的问题
- 高速HDI电路板的设计挑战