STM32的存储映射是靠基地址和地址偏移实现的。

32位的M3有4GB的寻址空间(程序员编程使用的编程地址),其中用于片上外设的有512MB,基地址为0x40000000

M3各外设基地址,包括片上外设、片上静态RAM和FLASH。特别要注意的是所有外设都是挂载在总线上,有AHP、APB1、APB2总线。从各外设基地址定义就可以很清楚知道该外设是挂在哪个总线上。

左边是实际的外设物理地址(flash也属于外设),右边是虚拟的地址,对应32位的M3的4GB的寻址空间


上图是STM32的存储器地址映射图,地址范围为:0x0000_0000-0xFFFF_FFFF;其中代码区的地址是从0x0800_0000开始的,结束于0x0800_0000+芯片的Flash的大小,RAM的起始地址是0x2000_0000,结束于0x2000_0000+芯片的RAM大小。
支持位带操作的两个内存区的范围是: 0x2000_0000‐0x200F_FFFF( SRAM 区中的最低 1MB) 0x4000_0000‐0x400F_FFFF(片上外设区中的最低 1MB)
其中对于SRAM位带区的某个比特位,假设它的地址为Addr,位序号为n(0<=n<=7),则该比特在别名区的地址为: Bit_Addr=0x22000000+((Addr-0x20000000)*8+n)*4=0x22000000+(Addr-0x20000000)32+n4;
对于片上外设位带区的某个比特位,假设它的地址为Addr,位序号为n(0<=n<=7),则该比特在别名区的地址为: Bit_Addr=0x42000000+((Addr-0x40000000)*8+n)*4=0x42000000+(Addr-0x40000000)32+n4;

原文链接:https://blog.csdn.net/struct_1/article/details/54576120

从库函数解析STM32地址映射

https://blog.csdn.net/acelit/article/details/100945938?ops_request_misc=&request_id=&biz_id=102&utm_term=stm32%E5%9C%B0%E5%9D%80%E6%98%A0%E5%B0%84%E5%9B%BE&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-4-100945938.pc_search_result_control_group&spm=1018.2226.3001.4187

STM32内部Flash读写问题

https://blog.csdn.net/qq_40147893/article/details/107423621?ops_request_misc=&request_id=&biz_id=102&utm_term=%E4%B8%BA%E4%BB%80%E4%B9%88ram%E7%9A%84%E8%B5%B7%E5%A7%8B%E5%9C%B0%E5%9D%80%E4%B8%BA0x08000000&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-107423621.pc_search_result_control_group&spm=1018.2226.3001.4187

1.先熟悉所用MCU的Flash存储大小以及扇区地址

2MB分成 2个块:Bank1和 Bank2,每个块有8个128K的用户扇区和1个128K的系统扇区,所以用户可用的Flash大小为2×8×128=2048KB,也就是2MB。
闪存模块组织表:

从下图看flash的实际物理地址

为什么STM32从Flash地址0x08000000的启动重映射

https://blog.csdn.net/a514371309/article/details/77972199?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164100766816780366519524%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164100766816780366519524&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-2-77972199.pc_search_result_control_group&utm_term=%E4%B8%BA%E4%BB%80%E4%B9%88flash%E7%9A%84%E8%B5%B7%E5%A7%8B%E5%9C%B0%E5%9D%80%E4%B8%BA0x80000000&spm=1018.2226.3001.4187

在初写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函数都还没进,看起来中断向量的重映射位置还是够早的。

keil中设置的flash(irom)的起始地址为0x08000000,这个0x08000000的意义------stm32地址映射图解析相关推荐

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

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

  2. ARM(IMX6U)裸机汇编LED驱动实验——驱动编写、编译链接起始地址、烧写bin文件到SD卡中并运行

    参考:Linux之ARM(IMX6U)裸机汇编LED驱动实验–驱动编写 作者:一只青木呀 发布时间: 2020-08-07 09:13:48 网址:https://blog.csdn.net/weix ...

  3. KEIL设置程序起始地址无效解决方法,STM32 IAP程序起始地址

    关键词: KEIL设置程序起始地址无效解决方法 STM32 IAP设置程序起始地址 KEIL设置程序起始地址 MDK设置程序起始地址 KEIL设置ROM地址无效 碰到的问题:为了实现STM32升级固件 ...

  4. STM32 KEIL软件设置程序烧写起始地址选择

    转自  https://blog.csdn.net/alfredseng/article/details/53021583 STM32系列的mcu,这儿以cortex-M4为例,我们在线调试时,一般会 ...

  5. c语言程序如何在keil中运行,keil c51中C程序的启动过程

    汇编是从org 0000h开始启动,那么keil c51是如何启动main()函数的?keil c51有一个启动程序startup.a51,它总是和c程序一起编译和链接.下面看看它和main()函数是 ...

  6. 在TI DSP开发板中烧写Flash程序

    实现在FLASH存储器烧写程序一般有以下三种方法:一是通过编程器下载烧写:二是通过开发商提供的专门软件工具+在线仿真器烧写:三是自己编程通过DSP烧写.个人使用的是合众达电子SEED-VPM642开发 ...

  7. 如何在 IAR和 KEIL中计算 CRC值

    关注.星标公众号,不错过精彩内容 转自:STM32单片机 前言 市面上越来越多的产品对其使用提出了安全要求,如何避免使用过程中对操作者带来危险,或者降低这种危险发生的概率,这都是产品安全性需要考虑的. ...

  8. 技术分享 | 如何在 IAR和 KEIL中计算 CRC值

    前言 市面上越来越多的产品对其使用提出了安全要求,如何避免使用过程中对操作者带来危险,或者降低这种危险发生的概率,这都是产品安全性需要考虑的.鉴于此,相关产品需要通过相关行业的安全认证才能生产上市.针 ...

  9. 【LVGL】学习笔记--(1)Keil中嵌入式系统移植LVGL

    一 LVGL简介 最近emwin用的比较烦躁,同时被LVGL酷炫的界面吸引到了,所以准备换用LVGL试试水. LVGL(轻量级和通用图形库)是一个免费和开源的图形库,它提供了创建嵌入式GUI所需的一切 ...

  10. Quartz在Spring中设置动态定时任务 .

    什么是动态定时任务: 是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定).这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户修改配置文 ...

最新文章

  1. 2021湖南高考艺考成绩查询,2021届湖南艺考生联考成绩查询时间安排
  2. ajax empty,jQuery empty仅在AJAX调用后的第二次单击时起作用
  3. Acwing 273. 分级
  4. 前端人英语学习的那点事儿
  5. 用xargs处理带空格文件名
  6. PostgreSQL数据库远程连接功能的开启
  7. 软件路由测试,软路由测试
  8. linux系统win,Windows10安装运行linux系统的方法
  9. 视频专家之路【三】:Vs开发环境的搭建
  10. Mybatis入门 基于XML实现增删改查(包含动态SQL标签的使用)
  11. 008九九乘法表(详解)
  12. 趣味密码学入门--cryptohack
  13. 为什么你应聘不上或试用期被开?
  14. Learning without Forgetting 详解(LwF)
  15. Windows改装成Linux,Windows系统改装成Linux系统
  16. 国外开源IoT平台Thingsboard社区版本(V3.3.2)在Win10环境下进行源码编译及运行指南
  17. Android Battery信息
  18. HTML5游戏出现新转机
  19. 2021-2022学年度第二学期21级Java程序设计理论模拟考试
  20. android日历获取周,从android中的周数和年份获取周开始和结束日期

热门文章

  1. android scheme 配置多个,Android Scheme URL 使用方法
  2. [netplus]初见,Netplus快速开始之PingPong Example
  3. mysql年龄最大_使用MySQL子查询选择年龄最大的所有用户?
  4. 计算机 去掉快捷方式箭头,去掉桌面快捷方式小箭头方法(无需修改注册表)
  5. java聊天程序_java基于C/S模式实现聊天程序(客户端)
  6. LaTeX数学公式大全
  7. 计算机应用基础2020答案形考,国开2020秋季答案《计算机应用基础(本)》形考学习过程表现...
  8. [概率练习] n个小球放入m个盒子(8大类)
  9. Java修改图片元数据Exif信息
  10. 麻省理工大学计算机中心,Massachusetts Institute of Technology 麻省理工大学