4 STM32启动过程(以Cortex-M3为例)(保姆级介绍)

news2024/11/17 8:26:17

设计知识点补充在前:

1.关于存储器映射、存储器重映射、内存映射、地址映射、地址转换等计算机专业名词详解

参考见 关于存储器映射、存储器重映射、内存映射、地址映射、地址转换等计算机专业名词详解_Vincent_Song的博客-CSDN博客

2.哈佛结构和冯诺依曼结构的区别

一、存储器结构不同

  • 冯·诺依曼结构:冯·诺依曼结构又称作普林斯顿体系结构,冯·诺依曼结构是一种将程序指令存储器和数据存储器合并在一起的存储器结构。
  • 哈佛结构: 哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,使用两个独立的存储器模块,分别存储指令和数据,每个存储模块都不允许指令和数据并存。

二、总线不同

  • 冯·诺依曼结构:冯·诺依曼结构没有总线,CPU与存储器直接关联。
  • 哈佛结构:哈佛结构使用独立芹燃好的两条总线,分别作为CPU与每个存储器之间的专用通信路径,而这两条总线之间毫无关联。

三、执行效率不同

  • 冯·诺依曼结构:冯·诺依曼结构其程序指令和数据指令执行时不可以预先读取下一条指令,需要依次读取,执行效率较低。
  • 哈佛结构:哈佛结构其程序指令和数据指令执行时可以预先读取下一条指令,具有较高的执行效率。

具体区别可参考冯诺依曼与哈佛结构的区别_哈弗结构与冯诺依曼结构的区别_时光小渣渣的博客-CSDN博客

STM32采用了哈佛结构。

在编译的过程中,编译工具链会将所有用户编写的代码转换成计算机可以识别的指令

1.具体流程

MCU芯片上电以后会触发复位异常,并且会跳转到中断向量表特定的偏移位置,获取里面的内容进行执行。(触发异常->中断向量表->用户程序)

具体:

  • MCU芯片上电以后会触发复位异常,会去一个叫做中断向量表的地方,一般在存储器的0地址位置。找到中断向量表后,处理器会根据触发的异常\中断类型进行一定的位置偏移(0x04),获取里面的内容进行执行。
  • 我们修改复位异常(即复位中断处理函数)里面的内容,就可以让处理器去执行我们指定的操作。

2、启动配置中断向量表

硬件电路(以野火STM32F103ZET6为例),我们可以配置BOOT引脚的不同电平来选择开发板的启动状态

总结如下

  • 系统复位后,STM32内核会从STM32地址空间的0x0地址获取中断向量表。但我们可以通过不同的映射,如将FLASH和系统存储器在STM32地址空间的位置映射到0x0地址位置,这样系统就会从FLASH存储器或者系统存储器自身的起始位置来访问到中断向量表。通过映射机制我们就可以将中断向量表放在FLASH里或者系统存储器里。

3.在STM32启动文件中分析启动步骤

从描述中可知启动过程为:

(1)设置堆栈指针

(2)设置PC指针的值(指向当前运行的指令增加8的位置,具体可查看arm体系架构,参考《arm cortex-M3权威指南》)

(3)配置中断向量表的入口

(4)配置系统时钟

(5)调用C库函数__main,从而初始化堆栈,最终会跳转我们自己编写的main函数中

下面我们就从启动文件的代码中分析启动过程

  • 首先分配堆栈大小和设置堆栈指针

  • 然后将中断向量表位置映射到0x00并分配空间,其中起始位置为堆栈顶的地址

其中DCD会为指定中断\异常分配一个字(4Byte)的空间

在启动之后, CPU从地址0x0000 0000获取堆栈顶的地址,并从启动 存储器的0x0000 0004(Reset_Handler)指示的地址开始执行代码。

  • 接着也是最后来到Reset_Handler函数
    • 先将Reset_Handler函数导出,后面的[WEAK]弱定义代表用户可以自己重新定义Reset_Handler函数,且优先调用
    • 然后导入__main和SystemInit函数
    • 最后就分别进入SystemInit函数里配置系统时钟和进入__main中最终调用我们自己定义的main函数了

我们点击跳转到SystemInit,会发现跳转到了C源文件里的SystemInit函数里

为什么会跳转到SystemInit函数里,这是因为在之前第一步以及初始化好堆栈了,这样C语言的运行环境搭建完成,此时STM32已经装载好了栈指针,可以进行C语言的函数跳转了

关于__main和SystemInit函数的具体内容就不介绍了,SystemInit的介绍可以通过system_stm32fxx.c查看,__main的介绍可以查看帮助文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/689609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue2中左侧菜单和头部tab标签联动

效果图 我这里是使用的vue2 element-ui来实现的,代码可以直接拿来使用 一、首先先安装element-ui element-ui官网 npm i element-ui -S 然后在main.js里面配置,安装官网的步骤来就可以了,这里就不一一介绍了 import Vue from vue; impor…

用wget等命令行工具下载Jenkins上的文件

背景 现在一般公司的内部CI系统都用Jenkins实现,本地部署的时候我会将待测试文件下载到本地,再上传到Linux开发板,但能否从Linux开发板直接下载呢?只要Linux与Jenkins server之间的网络是联通的,那就可以 解决方法 …

【从零开始学习JAVA | 第二十三篇】集合体系结构

目录 前言: 单列集合: set与list的区别: 双列集合: map的特点: 总结: 前言: JAVA中为我们提供了很多集合,这些集合都有自己很独特的特点,因此我们要学习所有的…

网络安全合规-网络安全工程师发展前景(三)

上海网络安全工程师工资按工作经验统计,其中应届毕业生工资5250,0-2年工资8910,3-5年工资11330,8-10年工资13500,6-7年工资16170,该数据仅供参考。 北京网络安全工程师工资按工作经验统计,其中…

python selenium 定位鼠标悬浮后的新弹窗数据

背景 最近需要获取网页上的标签数据,但是标签大于3个以后是隐藏的,需要鼠标hover上去才显示。如下图,图一是刚进来界面展示的,需要知道额外的7个标签则需要将鼠标移动到目标上面去。 但是比较尴尬的一个点是,当游览器打…

数据结构C语言版本(中)

第四章 串 串:限定数据元素类型的线性表。 应用实例: 编辑软件(本质上是字符串处理) 信息检索、病毒查找(字符串比较) 第一节 逻辑结构 一、定义 串是由字符组成的线性表。 STRING(D,S,P) D {ai| ai∈CHARACTER(字符集), i0,1…

Verilog基础之八、多路选择器实现

一、前言 选择器在FPGA中是基础的组成部分,英文全称为Multiplexer,为一个多输入单输出的结构。以器件xc7k480tffv1156为例,在slice中,也可以看到F7AMUX,F8MUX,这两个MUX都是二输入单输出的选择器。 二、工程…

【雕爷学编程】Arduino动手做(128)---2路I2C电平转换模块

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

VR虚拟现实技术为机械专业教学带来新思路

随着虚拟现实技术的发展,VR已经成为机械专业教学的一种新方式。它可以为学生提供更加生动、直观的学习体验,同时也可以帮助教师更好地进行教学和评估。以下是广州华锐互动总结的一些常见的应用场景: 模拟实验和操作:VR可以为学生提…

(UE4/5) PS中生成LUT进行UE4/5的色域颜色校正

整理自官方:使用虚幻引擎查找表(LUT)进行颜色校正 | 虚幻引擎5.2文档 (unrealengine.com) 一、Unreal Engine中截图 在UE4/5中截一张场景图(比较有代表性的) 然后,用这张图片:(不要…

Qt使用事件(event)与定时器实现字幕滚动

目录 1、效果展示2、实现思路3、滚动窗口部件3.1、成员变量3.2、事件重写3.3、成员方法3.3、方法实现 1、效果展示 我们经常能够在外面看到那种滚动字幕,那么就拿qt来做一个吧。 2、实现思路 实现一个窗口部件,这个窗口部件显示了一串文本标语,它会每…

H3C-HCL-SE-“01-路由备份与链路聚合实验“

实验拓扑图: 实验需求: 1、按照图示配置 IP 地址,R3 上连接 192.168.X.X/24 4个业务网段 2、配置 RIPv2 协议使全网互通,R1 和 R3 的直连链路不运行 RIP 3、R1 上配置静态路由直接经过 R3 到达所有业务网段 4、R1 和 R2 上不允…

第八十五天学习记录:C++核心:内存分区模型

内存分区模型 C程序在执行时,将内存大方向划分为4个区域 1、代码区:存放函数体的二进制代码,由操作系统进行管理 2、全局区:存放全局变量和静态变量以及常量 3、栈区:由编译器自动分配释放,存放函数的参数…

【雕爷学编程】Arduino动手做(129)---TTS文字转语音合成模块

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

python爬虫_requests入门指引

文章目录 ⭐前言⭐requests库💖 pip安装requests💖 requests get💖 requests post 结束 ⭐前言 大家好,我是yma16,本文分享关于python的requests库用法。 该系列文章: python爬虫_基本数据类型 python爬虫…

Edge浏览器可以多开吗?

问答链接:Edge浏览器可以多开吗? 可以。 如果你的edge浏览器是默认路径安装的,那么打开命令提示符窗口输入以下两条命令即可启动一个数据完全隔离的edge浏览器。 mkdir C:\logs001 "C:\Program Files (x86)\Microsoft\Edge\Applicati…

shell [[]] 语法错误解决方式

错误如图: /linux/install.sh:行15: if [[ $contrainsha e *$contrainsname* ]] /linux/install.sh:行15: 条件表达式中有语法错误 附近有语法错误/linux/install.sh:行15: ]] [[]]语法 当[[ ]]判断expr成立时,退出状态为0,否则为非0值。…

STM32F103使用USART3/UART4乱码问题

源程序为USART1的配置,更改USART3/4相应寄存器测试,测试一直显示有规律乱码,收发不符。 void uart_init(u32 pclk,u32 bound) { float temp;u16 mantissa;u16 fraction; temp(float)(pclk*1000000)/(bound*16);//得到USARTDIVmantissa…

labview 公式节点转换(U16->S16)

问题:在和测力计通讯时,需要把读出的裸数据转化有符号整数 其它网友的文章可以进行转换 (笔记)labview各种进制转换(通讯得到的负数补码转换成负数原码)_labview数字间的进制转换_是孑然呀的博客-CSDN博客…

chatgpt赋能python:用Python计算AIC:一种常用的信息标准

用Python计算AIC:一种常用的信息标准 介绍 AIC(赤池信息准则)是一种用于模型选择的信息理论标准,旨在平衡模型复杂度和拟合准确度的权衡。在统计学和机器学习中,模型选择是一项关键任务,因为正确选择模型…