STM32 开机流程分析

一、启动模式,决定向量表的位置

当CPU上电后,首先代码区(Flash)应该从地址为0x00000000开始,而数据区(SRAM)应该从0x20000000开始,Cortex - M3 CPU总是通过代码区获得复位向量。STM32F10XXX微处理器中运用了特殊的机制使得STM32不仅可以通过Flash(主闪存和系统闪存)启动,同时还可以从SRAM中启动。

STM32 有下面3种启动方式:

关于Main Flash/System Memory/SRAM 可以参见下面内存映射:

从上图可以看出 0x00000000 - 0x08000000 之间这128M空间是预留的,该区称为Boot Memory Space(Aliased to Flash or systen memory depending on BOOT pins)。

(1)从Main Flash 启动:Boot Space 是Main Flash 的别名。以0x08000000 对应的内存为例,则该块内存既可以通过0x00000000 操作也可以通过0x08000000 操作,且都是操作的同一块内存

(2)从System Memory启动:Boot Space 是System Memory的别名。以0x1FFFFFF0对应的内存为例,则该块内存既可以通过0x00000000 操作也可以通过0x1FFFFFF0操作,且都是操作的同一块内存

(3)从SRAM 启动:SRAM 只能通过0x20000000进行操作,与上述两者不同 。从SRAM 启动时,需要在应用程序初始化代码中重新设置向量表的位置。

eg: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

}

二、向量表解析

分析STM32的启动文件startup_stm32f10x_hd.s(大容量)主要做了以下事情:

(1)设置初始堆栈指针(SP)

(2)设置初始程序计数器(PC)为复位向量,并在执行main函数前初始化系统时钟

(3)设置向量表入口为异常事件的入口地址

(4)复位之后处理器为线程模式,优先级为特权级,堆栈设置为MSP主堆栈

三、开机实际运行过程

通过仿真器仿真,发现开机后程序就直接跳转到Reset_Handler,从.map文件看Reset_Handler的地址是0x080003a5并不是0x08000000(因为此时是从Flash中启动的,故应该是0x08000000)。那么STM32是如何从0x08000000过渡到0x080003a5?

查看Cortex - M3权威指南中文版本中复位序列中相应的说明:

也就是说上电复位的时候,刚开始CPU的主动权还是掌握在CM3中。CM3执行了寄存器的初始化及取复位向量表并执行!

这个绝大多数单片机不同,传统的ARM架构总是从0地址开始执行,并且0地址是有一条跳转指令的。在CM3中0地址处存的是MSP的位置,这并不是执行指令只是一个数据表。

另外还有一个问题,如何进入到复位序列?

触发STM32进入复位序列的有以下条件:

(1)System reset

(2)Power reset

(3)Backup domain reset

刚上电时就是通过Power reset 进入到复位序列!

时间: 2024-10-05 14:37:58

STM32 开机流程分析的相关文章

Linux系统启动流程分析与关机流程

Linux 系统启动流程分析 Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 运行 init. 系统初始化. 建立终端. 用户登录系统. init程序的类型: SysV: init, CentOS 5之前, 配置文件: /etc/inittab. Upstart: init,CentOS 6, 配置文件: /etc/inittab, /etc/init/*.conf. Systemd: systemd, CentOS 7,配置文件: /usr/lib/

开机流程与主引导分区(MBR)——鸟哥私房菜

在前篇随笔中,已经谈到了CMOS与BIOS,CMOS是记录各项硬件参数(包括系统时间.设备的I/O地址.CPU的电压和频率等)且嵌入到主板上面的存储器,BIOS是一个写入到主板上的韧体(韧体是写入到硬件上的一个软件程序). 这个BIOS是在开机的时候计算机系统会主动执行的第一个程序. 接下来,BIOS会去分析计算机里面有哪些存储设备,以硬盘为例,BIOS会依据用户的设置去取得能够开机的硬盘,并且到该硬盘里面去读取第一个扇区中的主引导分区(Master Boot Record,MBR)位置.MBR

【转】android SystemUI 流程分析

android4 SystemUI 流程分析 什么是SystemUI? 对于Phone来说SystemUI指的是:StatusBar(状态栏).NavigationBar(导航栏).而对于Tablet或者是TV来说SystemUI指的是:CombinedBar(包括了StatusBar和NavigationBar). 启动后Phone界面上的信号,蓝牙标志,Wifi标志等等这些状态显示标志都会在StatusBar上显示.当我们的设备开机后,首先需要给用户呈现的就是各种界面同时也包括了我们的Sys

liunx 开机流程与模块管理

系统开机的经过可以汇整成底下的流程的: 加载 BIOS 的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置: 读取并执行第一个开机装置内 MBR 的 boot Loader (亦即是 grub, spfdisk 等程序): 依据 boot loader 的设定加载 Kernel ,Kernel 会开始侦测硬件与加载驱动程序: 在硬件驱动成功后,Kernel 会主动呼叫 init 程序,而 init 会取得 run-level 信息: init 执行 /etc/rc.d/rc.sysini

Android4.4 Telephony流程分析——GsmServiceStateTracker管理网络服务状态

本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. 本文主要介绍GsmServiceStateTracker是怎么管理网络的?手机开机后,怎么去注册网络?网络状态是怎么变换传递的. Android在ServiceState.java中定义了四种ServiceState状态和16中无线通信网络类型: public class ServiceState implements Parcelable { /** * Normal operation

Linux 开机流程详解

对于任何系统, 开机不仅仅是接通电源这么简单的事情, 在这短短的几秒或几十秒内将会发生许多事情, 了解这个完整的流程将是解决任何开机问题或提高开机速度的前提. 接下来, 我们就详细了解一下Linux的开机流程: 1. 加载 BIOS 的硬件信息并进行自我测试,并依据取得第一个可开机的装置; 2. 读取并执行第一个开机装置内 MBR 的 Boot Loader (如 grub, spfdisk 等程序); 3. 依据 Boot Loader 的设定加载 kernel, kernel 会开始侦测硬件

流程分析—活动图、状态机图、顺序图

结构型建模可以帮助我们认清系统内各种各样的业务概念以及各业务概念间的关系:行为型建模则更进一步,让整个系统生机盎然.在UML中,行为型建模相关的图有:活动图(Activity Diagram).状态机图(State Machine Diagram).顺序图(Sequence Diagram),还有用得比较少的通信图(Communication Diagram).个人能力有限,再加上大大说了通信图在实际工作中较少使用,也就不打算在这里乱占地方了 活动图 跟现在的学生不同,我是初三第一次看到电脑,在

从0移植uboot (二) _启动流程分析

来源:Linux社区  作者:xiaojiang1025  : http://www.linuxidc.com/Linux/2017-02/141019.htm 经过了上一篇的配置,我们已经执行make就可以编译出一个uboot.bin,但这还不够,首先,此时的uboot并不符合三星芯片对bootloader的格式要求,其次,此时的uboot.bin也没有结合我们的开发板进行配置,还无法使用.而要进行这样的个性化配置,前提条件就是对uboot开机流程和编译系统有所了解,本文主要讨论前者.uboo

thttpd和cgilua安装与运行流程分析

安装 参考如下博文安装thttpd软件 http://blog.csdn.net/21aspnet/article/details/7045845 http://blog.csdn.net/dragoncheng/article/details/5614559 thttpd配置文件: [email protected]:/usr/local/bin# cat /usr/local/thttpd/conf/ etc/  logs/ man/  sbin/ www/  [email protecte