在初写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的启动重映射相关推荐

  1. 为什么STM32设置Flash地址0x08000000而不是0x00000000?STM32的启动过程

    STM32F103ZE芯片存储空间的地址映射关系图. 在MDK编译程序设置ROM和RAM地址时候发现: IROM1为片上程序存储器,即片上集成的Flash存储器,对该处理器Flash大小为512KB, ...

  2. STM32工作笔记0050---端口复用和重映射

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 端口复用重要,端口重映射作为了解,有些复杂.

  3. STM32学习日记3---定时器TIM3重映射PWM波呼吸灯实验

    文章目录 1. 代码 关于PWM波的输出,我们需要用到定时器的4个通道(通用定时器和高级定时器有,基本定时器没有这4个通道)里面的PWM生成.然后查看数据手册,了解定时器的重映射引脚情况.所以配置时, ...

  4. stm32运行java_STM32之——3种启动方式学习

    参考: https://blog.csdn.net/wwt18811707971/article/details/78678059 所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第 ...

  5. OK6410 tftp下载内核、文件系统以及nand flash地址相关整理、总结

    飞凌官方提供了一键下载烧写linux的方式,相对来说比较方便,但是对于开发来说不够灵活,因此这篇文章把tftp相关的点介绍一下,整理下其中遇到的一些问题. 一键烧写本质上是启动位于SD卡中的Uboot ...

  6. STM32——端口复用与重映射

    目录 端口复用的概念 内置外设的概念 端口复用的概念 端口复用的配置 配置示例(串口1) 复用GPIO的配置 STM32中文参考手册 110页 端口重映射概念 端口重映射概念 部分重映射 完全重映射 ...

  7. for根据ID去重_汽车ECU参数标定之配置Overlay RAM实现Qorivva MPC57xx系列MCU参数在线标定和代码重映射原理和方法详解...

    内容提要 引言 1. MPC5744P的Overlay RAM工作原理介绍 2 MPC5744P的Flash Overlay配置详解 2.1 平台Flash标定区域描述字寄存器配置字0--PFLASH ...

  8. stm32内部Flash读写

    文章目录 1.stm32内部flash介绍 2.读写驱动编写 3.源码 上篇文章讲到了STM32来驱动外部flah的操作,flash真是好东西啊,内存大,能存的东西多,这样我们就可以用它来做一些大点的 ...

  9. 基于STM32的Flash擦除方式

    基于STM32的Flash擦除方式 前言 介绍 STM32 FLASH 闪存的编程和擦除 Flash擦除的标准库函数 软件设计 直接使用固件库函数擦除当前地址所在的内容 擦除对应地址和大小的Flash ...

最新文章

  1. 微软或允许 Android 应用运行于 Windows 和 WP
  2. 用Unity3D实现简单的牧师与魔鬼游戏(动作分离版)
  3. 嵌入式工程师开发工作主要做些什么,以后收入怎样
  4. 机器学习(3):信息论
  5. inceptor-plsql 系统预定义函数/过程
  6. 数据库概述之数据库设计实例分析
  7. 力软框架java_力软敏捷框架 jfGrid 使用例子之一
  8. 2022最新简历模板
  9. c语言 愚人节题目,愚人节整人题目大全
  10. 中国管理信息化杂志中国管理信息化杂志社中国管理信息化编辑部2022年第16期目录
  11. 小程序服务器获取appid,微信小程序小程序appid如何获取
  12. 用友U8采购订单查询
  13. Java做彩虹进度条,Android自定义控件-彩虹条进度条
  14. hdfs单点故障和内存受限问题
  15. 虚拟机启动后一直黑屏的解决办法
  16. 组合图形-第13届蓝桥杯Scratch省赛1真题第4题
  17. 利用python进行excel格式处理并关联
  18. 一个登录页面的测试用例
  19. 获取京东 Cookie/浏览器获取 Cookie
  20. PUB/SUB Pattern-Oriented Software Architecture v1巨详细读书笔记 11

热门文章

  1. caffe 网络模型文件中的参数含义(top bottom lr_mult decay_mult)与模型编写以及模型自定义
  2. 计算机磁盘网络怎么共享,电脑的某个磁盘如何设置成共享
  3. iOS:决战三国的续命分析
  4. 客户服务:提供有效客户客服的几种方法
  5. SSM框架概念(什么是SSM框架)
  6. SIMULINK电力电子仿真
  7. Windows 11安装Mybase 8.2.13
  8. WIN7系统,电脑防火墙怎么设置?
  9. iOS15.4.1 正式版紧急推送,修复卡顿和耗电异常的问题
  10. 高速HDI电路板的设计挑战