最详细STM32 启动流程

一、STM32三种启动方式

  1. 常规模式(主闪存存储器)

    • 这是最常见的启动模式。
    • 在此模式下,处理器会执行复位向量表中的复位地址,从而启动芯片。
    • 芯片会执行各种初始化操作,包括时钟初始化、外设初始化等,然后跳转到用户定义的启动代码。
    • 基地址:0x0800000
  2. Bootloader模式(系统存储器)

    • 这是一种特殊的启动模式,通常用于更新固件或通过外部接口(如UART或USB)加载新的程序。
    • 在此模式下,处理器会将启动地址设置为Bootloader的起始地址,而不是复位向量表中的复位地址。
    • Bootloader负责检查外部接口是否有新的程序,如果有,则加载并启动新程序;否则,它会跳转到复位向量表中的复位地址。
    • 基地址:0x1FFFF000
  3. 系统内存模式(内置SRAM)

    • 这种模式通常用于恢复或修复芯片中的固件
    • 在此模式下,处理器会将启动地址设置为系统内存中的特定地址,而不是复位向量表中的复位地址。
    • 系统内存包含一个特殊的Bootloader,它可以用于加载新的固件或执行其他恢复操作。
    • 基地址:0x20000000

这三种启动模式为STM32芯片提供了灵活性和可靠性,使其适用于各种不同的应用场景。开发人员可以根据实际需求选择合适的启动模式来确保系统的正常运行和维护。启动时都会自动把基地址重映射到0x00000000,执行RESET中断。

二、常规启动模式分析

Stack_Size      EQU     0x00000400    ; 定义栈的大小为1024字节(0x400字节)AREA    STACK, NOINIT, READWRITE, ALIGN=3  ; 定义栈区域,不进行初始化,可读可写,字节对齐
Stack_Mem   SPACE   Stack_Size                        ; 分配栈的空间
__initial_sp                                       ; 栈顶指针,初始堆栈指针; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size   EQU     0x00000200    ; 定义堆的大小为512字节(0x200字节)AREA    HEAP, NOINIT, READWRITE, ALIGN=3   ; 定义堆区域,不进行初始化,可读可写,字节对齐
__heap_base                                         ; 堆的起始地址
Heap_Mem    SPACE   Heap_Size                       ; 分配堆的空间
__heap_limit                                        ; 堆的结束地址PRESERVE8THUMB; Vector Table Mapped to Address 0 at ResetAREA    RESET, DATA, READONLY           ; 定义重置区域,数据区域,只读EXPORT  __Vectors                       ; 导出向量表EXPORT  __Vectors_End                   ; 导出向量表的结束地址EXPORT  __Vectors_Size                  ; 导出向量表的大小__Vectors   DCD     __initial_sp               ; Top of Stack    栈顶指针DCD     Reset_Handler              ; Reset Handler   复位处理函数DCD     NMI_Handler                ; NMI Handler     NMI处理函数DCD     HardFault_Handler          ; Hard Fault Handler  硬件故障处理函数DCD     MemManage_Handler          ; MPU Fault Handler   内存管理单元故障处理函数DCD     BusFault_Handler           ; Bus Fault Handler   总线故障处理函数DCD     UsageFault_Handler         ; Usage Fault Handler 使用错误处理函数DCD     0                          ; ReservedDCD     0                          ; ReservedDCD     0                          ; ReservedDCD     0                          ; ReservedDCD     SVC_Handler                ; SVCall Handler       服务调用处理函数DCD     DebugMon_Handler           ; Debug Monitor Handler  调试监视器处理函数DCD     0                          ; ReservedDCD     PendSV_Handler             ; PendSV Handler       挂起请求处理函数DCD     SysTick_Handler            ; SysTick Handler      系统滴答定时器处理函数; External Interrupts   外部中断处理函数DCD     WWDG_IRQHandler            ; Window WatchdogDCD     PVD_IRQHandler             ; PVD through EXTI Line detect...(其他外部中断处理函数)...__Vectors_End                                 ; 向量表结束标志
__Vectors_Size  EQU  __Vectors_End - __Vectors  ; 向量表大小AREA    |.text|, CODE, READONLY      ; 定义代码区域,只读; Reset handler
Reset_Handler    PROCEXPORT  Reset_Handler             [WEAK]  ; 导出复位处理函数,标记为弱符号IMPORT  __mainIMPORT  SystemInitLDR     R0, =SystemInit          ; 调用系统初始化函数BLX     R0LDR     R0, =__main              ; 跳转到主函数BX      R0ENDP; Dummy Exception Handlers (infinite loops which can be modified)NMI_Handler     PROCEXPORT  NMI_Handler                [WEAK]   ; 导出NMI处理函数,标记为弱符号B       .                           ; 无限循环ENDP
HardFault_Handler\PROCEXPORT  HardFault_Handler          [WEAK]   ; 导出硬件故障处理函数,标记为弱符号B       .                           ; 无限循环ENDP
MemManage_Handler\PROCEXPORT  MemManage_Handler          [WEAK]   ; 导出内存管理单元故障处理函数,标记为弱符号B       .                           ; 无限循环ENDP
...
(其他异常处理函数)
...Default_Handler PROCEXPORT  WWDG_IRQHandler            [WEAK]   ; 导出默认的外部中断处理函数,标记为弱符号EXPORT  PVD_IRQHandler             [WEAK]...(其他外部中断处理函数)...B       .                            ; 无限循环ENDPALIGN;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************IF      :DEF:__MICROLIB           EXPORT  __initial_sp               ; 导出栈顶指针EXPORT  __heap_base                ; 导出堆的起始地址EXPORT  __heap_limit               ; 导出堆的结束地址ELSEIMPORT  __use_two_region_memoryEXPORT  __user_initial_stackheap   ; 导出用户栈和堆的初始化函数__user_initial_stackheapLDR     R0, =  Heap_Mem            ; 将堆的起始地址加载到R0寄存器LDR     R1, =(Stack_Mem + Stack_Size)  ; 将栈的起始地址加上栈的大小加载到R1寄存器LDR     R2, = (Heap_Mem +  Heap_Size)  ; 将堆的起始地址加上堆的大小加载到R2寄存器LDR     R3, = Stack_Mem            ; 将栈的起始地址加载到R3寄存器BX      LR                         ; 返回ALIGNENDIFEND

这段启动代码实现了STM32的启动流程,

  1. 栈和堆的初始化

    • 定义了栈的大小和堆的大小,并分配了相应的空间。
    • 在向量表中定义了栈顶指针 __initial_sp、堆的起始地址 __heap_base 和结束地址 __heap_limit
  2. 向量表的定义

    • 向量表是在芯片复位时会被加载到内存地址0处,用于存放异常处理函数的入口地址。
    • 向量表中定义了复位、NMI、硬件故障、内存管理单元故障、总线故障、使用错误等异常处理函数的入口地址。
    • 向量表还包含了外部中断处理函数的入口地址。
  3. Reset_Handler复位处理函数

    • Reset_Handler 是复位时的处理函数,在芯片复位时会被调用。
    • 该函数首先调用 SystemInit 完成系统的初始化工作,然后跳转到 __main 函数继续执行用户的主程序。
  4. 异常处理函数的定义

    • 定义了各种异常处理函数的入口地址,如 NMI、硬件故障、内存管理单元故障、总线故障等。
    • 这些异常处理函数是无限循环的,表示当对应的异常发生时,系统会停留在该函数处进行处理。
  5. 用户栈和堆的初始化

    • 如果使用了标准库函数 __MICROLIB,则导出了栈和堆的初始化函数 __user_initial_stackheap
    • 如果未使用标准库函数,则需要手动定义栈和堆的初始化函数,并在其中设置栈的起始地址、堆的起始地址和结束地址。

STM32的启动流程比较简单,从这个流程可以学习到通用的的ARM系统的启动模式。

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

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

相关文章

Kubernetes 核心概念

一、什么是 Kubernetes 1、含义&#xff1a; Kubernetes 是一个自动化的容器编排平台&#xff0c;它负责应用的部署、应用的弹性以及应用的管理。 2、核心功能&#xff1a; (1) 调度&#xff1a; Kubernetes 的调度器可以把用户提交的容器放到 Kubernetes 管理的集群的某一…

BUGKU-WEB 社工-初步收集

题目描述 题目截图如下&#xff1a; 描述:其实是杂项&#xff0c;勉强算社工吧。来自当年实战 进入场景看看&#xff1a; 解题思路 做题先看源码关注可下载的资源(zip压缩包)抓包寻找可能存在的加密信息&#xff08;base64&#xff09;不管三七二十一先扫描目录再说 ps&…

【AI之路】使用RWKV-Runner启动大模型,彻底实现大模型自由

文章目录 前言一、RWKV-Runner是什么&#xff1f;RWKV-Runner是一个大语言模型的启动平台RWKV-Runner官方功能介绍 二、使用步骤1. 下载文件 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; ChatGPT的横空出世&#xff0c;打开了AI的大门&#xff…

Android---Jetpack Compose学习005

动画 1. 简单值动画 示例&#xff1a;背景颜色在紫色和绿色之间&#xff0c;以动画形式切换。使用 animateColorAsState() val backgroundColor by animateColorAsState(if (tabPage TabPage.Home) Purple100 else Green300) 该句代码中&#xff0c;有一个 backgroundColo…

HTTP基本概念-HTTP缓存技术

大家好我是苏麟 , 今天说说HTTP缓存技术 . 资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) HTTP缓存技术 HTTP 缓存有哪些实现方式? 对于一些具有重复性的 HTTP 请求&#xff0c;比如每次请求得到的数据都一样的&#xff0c;我们可以把这对「请求-响…

【C语言】指针练习篇(上),深入理解指针---指针和数组练习题和sizeof,strlen的对比【图文讲解,详细解答】

欢迎来CILMY23的博客喔&#xff0c;本期系列为【C语言】指针练习篇&#xff08;上&#xff09;&#xff0c;深入理解指针---指针数组练习题和sizeof&#xff0c;strlen的对比【图文讲解,详细解答】&#xff0c;图文讲解指针和数组练习题&#xff0c;带大家更深刻理解指针的应用…

iTop-4412 裸机程序(二十二)- RTC时钟

目录 0.源码1. RTC2. iTop4412 中的 RTC使用的相关寄存器3. BCD编码4. 关键源码 0.源码 GitHub&#xff1a;https://github.com/Kilento/4412NoOS 1. RTC RTC是实时时钟&#xff08;Real Time Clock&#xff09;的缩写&#xff0c;是一种用于计算机系统的硬件设备&#xff0…

Matplotlib自定义辅助函数 (一):让你的图表大放异彩!

Matplotlib美化秘诀&#xff1a;自定义辅助函数&#xff0c;让你的图表大放异彩&#xff01; 利用Matplotlib进行数据可视化示例 &#x1f335;文章目录&#x1f335; &#x1f333;一、创建自定义样式函数&#x1f333;&#x1f333;二、创建自定义颜色映射&#x1f333;&…

Momentum2

攻击机 192.168.223.128 目标机 192.168.223.147 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -A -p- 192.168.223.147 开启了22 80 端口 看一下web界面 源码&#xff0c;robots.txt ,url都观察了一下好像没什么有用信息 扫一下目录 gobuster dir -u http:…

实现JNDI

实现JNDI 问题陈述 Smart Software Developer Ltd.想要开发一款Web应用程序,它使用servlt基于雇员ID显示雇员信息,雇员ID由用户通过HTML用户界面传递。雇员详细信息存储在Employee_Master表中。另外,Web应用程序应显示网站被访问的次数。 解决方案 要解决上述问题,需要执…

Linux中sigaction函数和SIGCHLD信号的使用

sigaction函数&#xff1a; 函数说明&#xff1a;注册一个信号处理函数 函数原型&#xff1a;int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 函数参数&#xff1a; signum:捕捉的信号act:传入参数&#xff0c;…

Verilog不支持浮点数以及错误事例

Verilog 是一种硬件描述语言&#xff08;HDL&#xff09;&#xff0c;用于描述和设计数字电路和系统。它的主要目的是描述硬件行为和结构&#xff0c;因此不直接支持浮点数。Verilog 主要用于设计数字逻辑电路、处理器和其他数字系统&#xff0c;它的数据类型主要是位向量和整数…

C++ 特殊类的实现

一、请设计一个类&#xff0c;不能被拷贝 拷贝只会放生在两个场景中&#xff1a;拷贝构造函数以及赋值运算符重载&#xff0c;因此想要让一个类禁止拷贝&#xff0c;只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 在C98中&#xff1a;将拷贝构造函数与赋值运算符重载…

【嵌入式移植】6、U-Boot源码分析3—make

U-Boot源码分析3—make all 从【嵌入式移植】4、U-Boot源码分析1—Makefile文章中可知执行make命令的时候&#xff0c;没有指定目标则使用默认目标PHONY&#xff0c;PHONY依赖项为_all all scripts_basic outputmakefile scripts dtbs。 all Makefile中第129行指定默认目标PH…

十大免费 Word 转 PDF 转换器工具榜单

将 Word 转换为 PDF 格式可以帮助您在不同操作系统之间轻松共享文件。无论您是发送重要备忘录、为客户开具发票、以一致的格式维护客户记录等等&#xff0c;PDF 都属于最流行且安全的文件格式。当您将 Word 文档转换为 PDF 格式时&#xff0c;您的项目会自动优化且更加紧凑。可…

腾讯云4核8G服务器够用吗?能支持多少人?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

ELAdmin 部署

后端部署 按需修改 application-prod.yml 例如验证码方式、登录状态到期时间等等。 修改完成后打好 Jar 包 执行完成后会生成最终可执行的 jar。JPA版本是 2.6&#xff0c;MyBatis 版本是 1.1。 启动命令 nohup java -jar eladmin-system-2.6.jar --spring.profiles.active…

JDBC教程+数据库连接池

JDBC 1.JDBC概述 ​ JDBC&#xff0c;全称Java数据库连接&#xff08;Java DataBase Connectivity&#xff09;&#xff0c;它是使用Java语言操作关系型数据库的一套API。 ​ JDBC本质是官方&#xff08;原SUN公司&#xff0c;现ORACLE&#xff09;定义的一套操作所有关系型数…

Flutter 网络请求之Dio库

Flutter 网络请求之Dio库 前言正文一、配置项目二、网络请求三、封装① 单例模式② 网络拦截器③ 返回值封装④ 封装请求 四、结合GetX使用五、源码 前言 最近再写Flutter系列文章&#xff0c;在了解过状态管理之后&#xff0c;我们再来学习一下网络请求。 正文 网络请求对于一…

starknet之 class_hash

文章目录 问题背景什么是Class Hash问题背景 部署合约报错:ReferenceError: Buffer is not defined 什么是Class Hash 官方: https://book.starknet.io/ch04-03-01-deploy-standard-account.html?highlight=class%20hash#finding-the-class-hash 要部署智能合约,您需要在…