找回密码
 注册
关于网站域名变更的通知
查看: 229|回复: 2
打印 上一主题 下一主题

Cortex-Mx芯片是如何启动的?

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-11-8 13:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
Cortex-Mx启动流程步骤详解

- f# g; e6 v7 _# Z- n7 N5 a5 I
单片机在上电的时候会经历一个启动的流程,不管是你从手册描述上看得见的,还是看不见的,亦或者你不知道还有这种操作的,这个启动都是客观事实存在的,今天我们就用白话文来唠一唠Cortex-Mx系列的启动流程(此文章知识广泛适用于CPU为Cortex-Mx系列的mcu)。

4 w5 \9 p' ~, P2 b! `* v" x# ?: U
图1
  f1 A0 F% S; o+ f2 ~% P5 @
: ?- b, G& |1 r0 ^& t' l
如上图为STM32F0系列单片机系统存储器的映射图(其他系列型号,映射图会有区别,但流程还是一样的),通常,当处理器从复位中启动时,它首先会访问位于0x0000 0000地址处的向量表,这个向量表是什么?从哪里来?跟程序员又有什么关系?明确的讲这几个问题跟我们的启动文件是紧密相关的。启动文件就是对启动流程的“展现”,启动文件中包含了向量表(向量表中包含了堆栈指针地址、复位向量程序地址、以及系统中各类中断函数的入口地址,简单点讲就是单片机启动的时候得经过这个向量表,执行复位程序得经过这个向量表,执行中断还得经过向量表,从向量表中找中断函数的入口地址)。当然启动文件也是由程序员写的(只不过大多数由厂家的Coder代劳了)。下面我们一起来弄清楚吧!
3 |+ ?- x* N% M: h, O' w
图2(VectorTable部分截图)# j6 C& R; m( I6 E
4 s( u. e1 s2 x* W/ [' s
上图为厂家参考手册上给出的向量表的部分截图,启动文件中程序员编写的向量表就是根据这个表格来编写的,每一行为向量表的一个组成成员,第一行为表示堆栈指针初始值,第二个字为复位向量地址,后面的行是各种类型的中断向量地址,也就是中断函数的入口地址(在图中第一个字被描述为保留,第二个字描述为复位,这两行内容非常重要!)。
' V2 d8 E7 v" |0 g! b' m/ Q0 h$ X2 c! n3 N% P$ j& [
前面我们说了一个关键点,当处理器从复位中启动时,它首先会访问0x0000 0000地址处的向量表,并读取向量表的前2个字,第一个字为堆栈指针MSP初始值(堆栈是一个临时的空间,用来临时存储一些信息,就像电影里面的“龙门客栈”一样,供过往客人临时歇脚。);第二个字为复位向量,它表示程序执行的起始地址。当读取到该地址之后,会自动跳到复位向量处开始执行程序(图2红框处,最右边的一列地址栏,第一行地址空间从0x0000 0000开始 - 0x0000 0003结束,第二行从0x0000 0004开始-0x0000 0007结束,后面以此类推,每行占4个字节,即1个字)。+ E0 ]/ C! G: D# ?* P( o/ S" D3 ]

7 q) H' J6 N* P) ]* R- J, j但是比较晕的是:图1中大家可以看到,地址0x0000 0000处已经存在内容了,是系统BOOT的配置,这段内容是厂家固化的一段代码,我们写的代码是存储在从0x0800 0000开始往后的地方,即Main Flash Memory存储区(见图1)。
: J: t( R: D5 ]) t. @' R- c& \$ a, K- ^: o+ Z3 ?
那大家想我们写的代码(启动文件也算写的代码的一部分),是放在FLASH存储区的,而单片机上电的时候是从0x0000 0000处开始执行,那么系统是怎么访问到我们自己写的这个向量表呢?
7 H7 G" t) b5 y5 f
1 }7 Q, x/ P0 {+ M# i# q% T& x- I这个设计者考虑了,系统会自动把我们代码启动文件中的向量表映射到0x0000 0000地址处,也就是说在0x0800 0000开始存放代码的地方我们有一张自己写的向量表,系统会找到这张向量表,把这张向量表映射到0x0000 0000处,这样就相当于在0x0000 0000开始的这个地方也有了一张向量表了。
  L) y0 {0 L) N$ Q) Q/ s
" s' x- n) i( o& ?
图33 \! y9 F" j4 i( u0 c

+ P! d8 ?+ f+ [" q; {+ W) `& m" x1 a- Z5 G, O
如图3,系统一旦读取到向量表的第二个字复位向量的地址时,那么就跳到复位向量的地址开始执行程序,我们可以在复位向量地址处写上自己的用户代码,执行完这段代码之后,指挥程序跳到主函数main程序运行,那么这样连贯起来,程序正常跑起来了,这就是一个完整的启动。
: f* m$ x3 w2 M! Z. r6 {2 K# P. j

8 ^+ p" Q9 y, F. `* M
' f: Z, U6 c7 \
3 `' g+ P( B: h! z" j6 i! ]/ k

该用户从未签到

2#
发表于 2021-11-8 14:13 | 只看该作者
启动文件就是对启动流程的
+ [9 E; j" L4 D& n展现

该用户从未签到

3#
发表于 2021-11-8 14:14 | 只看该作者
系统会自动把我们代码启动文件中的向量表映射到0x0000 0000地址处,也就是说在0x0800 0000开始存放代码的地方我们有一张自己写的向量表
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-19 13:30 , Processed in 0.125000 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表