IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 嵌入式之地址重映射分析(三) -> 正文阅读

[嵌入式]嵌入式之地址重映射分析(三)

写STM32程序时,遇到一个困惑,STM32的Flash在MDK里被设置为起始地址0x0800 0000,
而CM4手册规定芯片复位时要从0x0000 0000地址开始取出**中断向量表** ,
那STM32怎么样执行代码呢?**地址重映射**?或者在0x0000 0000里有对应有实际存储器?

仔细阅读手册,发现这件事是因为STM32设计的**Flash起始地址**是在0x0800 0000位置开始的。
全部代码都只能从这里开始存储。

这样就还有一个问题,理论上,CM4中规定上电后CPU是从0地址开始执行,
但是这里**中断向量表**却被烧写在0x0800 0000地址里,那启动时不就找不到中断向量表了?
既然CM4定下的规矩是从0地址启动,SMT32当然不能破坏ARM定下的“规矩”,
所以它做了一个启动映射的过程,就是和芯片上总能见到的BOOT0和BOOT1有关了,
当选择从主Flash启动模式后(BOOT1=x  BOOT0=0   芯片内置的Flash。 ),
芯片一上电,Flash的0x0800 0000地址被映射到0地址处,不影响CM3内核的读取,
所以这时的CM3既可以在0地址处访问中断向量表,也可以在0x0800 0000地址处访问中断向量表,
而代码还是在0x0800 0000地址处存储的。这就是最难理解的地方,
其实,这是基本上所有ARM芯片采用的启动映射方法。这里补充下**stm32的启动方式。**


 用户闪存:    BOOT1=x  BOOT0=0   芯片内置的Flash。

 SRAM:        BOOT1=1  BOOT0=1  芯片内置的RAM 区,就是内存啦。 

 系统存储器:BOOT1=0  BOOT0=1  芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,
 就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM 区。

BOOT1=x  BOOT0=0  从用户闪存启动,**这是正常的工作模式**。

BOOT1=0  BOOT0=1  从系统存储器启动,这种模式启动的程序功能由厂家设置。

BOOT1=1  BOOT0=1  从内置SRAM 启动,这种模式可以用于调试。

还要注意,这个中断向量表是可以在程序中再次被映射的。控制它的就是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等一系列操作,这里摘要与中断向量有关的代码:
![](https://img-blog.csdnimg.cn/21048f38c8f74519ba1609e21751e71f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5aWU6LeR55qE5bCP6LWb5YWU,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center
在这里插入图片描述

在这里插入图片描述

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。以后CM4再取中断向量里,就会根据SCB->VTOR的设置,从这里取向量执行了。中断向量自此终于转正。

注意这时连__main函数都还没进,看起来中断向量的重映射位置还是够早的。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 08:09:02  更:2021-09-19 08:09:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:30:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码