stm32启动过程(以F1为例)

news2024/12/27 11:53:44

文章目录

  • STM32启动模式
  • STM32启动过程(以内部flash启动为例)
    • 启动文件功能
    • 启动文件常用汇编指令及说明

STM32启动模式

M3/M4/M7等内核复位后,做的第一件事:

  1. 从地址 0x0000 0000 处取出 堆栈指针 MSP 的初始值,该值为栈顶地址
  2. 从地址 0x0000 0004 处取出程序计数器指针 PC 的初始值,该值是复位向量(Reset_Hander)

通过BOOT0和BOOT1两个引脚的输入选择启动模式
在系统复位后,sysclk的第4个上升沿,BOOT引脚的值将被锁存(锁存后该引脚的值改变不影响已选择模式)

启动模式选择引脚启动模式0x0000 0000

映射地址

0x0000 0004

映射地址

BOOT1BOOT0
x0主内存存储器0x0800 00000x0800 0004
01系统存储器0x1FFF F0000x1FFF F004
11内置SRAM0x2000 00000x2000 0004

STM32三种启动模式对应的存储介质均是芯片内置的,它们是:

  1. 用户闪存 = 芯片内置的Flash。从用户闪存启动,这是正常的工作模式。
  2. SRAM = 芯片内置的RAM区,就是内存啦。从内置SRAM启动,这种模式可以用于调试
  3. 系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。 从系统存储器启动,这种模式启动的程序功能由厂家设置。

STM32启动过程(以内部flash启动为例)

总体概述:
在这里插入图片描述

启动文件功能

启动文件由汇编编写,是系统上电复位后第一个执行的程序。
启动文件主要做了以下工作:

  1. 初始化堆栈指针 SP = _initial_sp (从 0x8000 0000 获取)
  2. 初始化程序计数器指针 PC = Reset_Handler (从 0x8000 0004 获取)
  3. 设置堆和栈的大小 Heap_Size(堆)、Stack_Size(栈)
  4. 初始化中断向量表
  5. 配置外部 SRAM 作为数据存储器(可选)
  6. 配置系统时钟,通过调用 SystemInit 函数(可选)
  7. 调用 C 库中的 _main 函数初始化用户堆栈,最终调用 main 函数

启动文件常用汇编指令及说明

指令名称作用
EQU给数字常量取一个符号名,相当于 C 语言中的 define
AREA汇编一个新的代码段或者数据段
ALIGN编译器对指令或者数据的存放地址进行对齐,一般需要跟一个立即数,缺省表示 4 字节对齐。要注意的是,这个不是 ARM 的指令,是编译器的,这里放到一起为了方便。
SPACE分配内存空间
PRESERVE8当前文件堆栈需要按照 8 字节对齐
THUMB表示后面指令兼容 THUMB 指令。在 ARM 以前的指令集中有 16 位的THUMBM 指令,现在 Cortex-M 系列使用的都是 THUMB-2 指令集,THUMB-2
EXPORT声明一个标号具有全局属性,可被外部的文件使用
DCD以字节为单位分配内存,要求 4 字节对齐,并要求初始化这些内存
PROC定义子程序,与 ENDP 成对使用,表示子程序结束
WEAK弱定义,如果外部文件声明了一个标号,则优先使用外部文件定义的标号,如果外部文件没有定义也不会出错。要注意的是,这个不是 ARM 的指令,是编译器的,这里放到一起为了方便。
IMPORT声明标号来自外部文件,跟 C 语言中的 extern 关键字类似
LDR从存储器中加载字到一个存储器中
BLX跳转到由寄存器给出的地址,并根据寄存器的 LSE 确定处理器的状态,还要把跳转前的下条指令地址保存到 LR
BX跳转到由寄存器/标号给出的地址,不用返回
B跳转到一个标号
IF,ELSE,ENDIF汇编条件分支语句,跟 C 语言的类似
END到达文件的末尾,文件结束

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

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

相关文章

接踵而至,昆仑万维天工大语言模型发布

目录 天工大语言模型对标GPT3.5对话能力多模态应用同行对比后言 天工大语言模型 国产ChatGPT再次迎来新成员,4月17日下午,昆仑万维正式发布千亿级大语言模型“天工”,同时宣布即日起启动邀请测试,并注册了chatgpt.cn作为域名。天…

认真复习c语言1

最近好好写总结了(不能在偷懒了):这一次绝对认真,写总结写了三个多小时,学了一个小时左右TAT; 今天来复习一下c语言的多文件操作: 经过我这几天的摸索,我算是明白了: …

Typora (windows/MacOs版) 你未曾见过的Markdown编辑器

简介 Typora的设计理念非常人性化,与传统编辑器相比,更注重用户的视觉效果和阅读体验。它的编辑界面非常简洁,用户可以就近编辑,随时查看效果,避免频繁地转换预览模式,提高了工作效率和灵活性。 此外&…

d2l解码编码器与seq2seq

seq2seq难死了,卡了好久,好不容易有些头绪了。。。 目录 1.编码器与解码器 1.1原理 1.2实现 2.seq2seq 2.1构造编码器 2.2构造解码器 repeat与cat探索 总结nn.rnn\GRU\LSTM输入输出 看一下解码器的输出 2.3损失计算 2.4训练 2.5预测 2.6预…

【C++】多态---上( 概念、条件及性质)

来前言: 我们之前提到过,C是一门面向对象的语言,它有三大特性——封装、继承、多态。 封装和继承我们已经详细学习过了,本章将进入多态的学习。 目录 (一)多态的概念 (二)多态的定…

Vector - CAPL - Panel面板_02

Button 功能:触发指定的操作 说明:Button 是一个控件,使用它可以触发指定的操作。 适用场景: 1、按下启动按钮会使电机启动。 2、启动锁定开关时,所有车门都会自动锁定。 3、启动TestModule测试模块、回放模块等 设…

单机部署MongoDB

文章目录 一、Windows 环境1.1 安装1.2 启动和连接1.3 Compass 图形化客户端 二、Linux 环境2.1 安装2.2 启动和连接 提示:以下是本篇文章正文内容,MongoDB 系列学习将会持续更新 一、Windows 环境 1.1 安装 ①下载安装包,官方下载地址&am…

OldWang带你了解MySQL(七)

文章目录🔥多表查询🔥SQL92标准中的查询🔥非等值连接🔥自连接🔥SQL99标准中的查询🔥SQL99中的自然连接(NATURAL JOIN)🔥SQL99中的内连接(INNER JOIN)🔥外连接查询(OUTER JOIN)&#…

行业那么多,为什么计算机领域这么火?

行业那么多,为什么计算机领域这么火?计算机领域火已经不是一天两天了,从开始的进入互联网时代、到“互联网”、再到大数据、人工智能时代、数字化经济……计算机技术从行业内部的自我发展逐渐渗透到各行各业,甚至成为社会整体经济…

NLP深度网络中self.embedding(x)词嵌入后降维方法

在自然语言处理中的循环神经网络中,经常使用torch定义类,self.embedding(x)中,x是输入,介绍self.embedding(x)返回结果,以及结果的形状,并解释这个形状 在自然语言处理中的循环神经网…

P4158 [SCOI2009]粉刷匠(分组背包问题+前缀和优化)

[TOC](P4158 [SCOI2009]粉刷匠(分组背包问题)) 一、问题 [SCOI2009]粉刷匠 题目描述 windy有 N 条木板需要被粉刷。 每条木板被分为 M 个格子。 每个格子要被刷成红色或蓝色。 windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色。 …

Spring Cloud Gateway: 网关

文章目录 网关Hello world路由: Route谓词: Predicate过滤器: FilterGateway实现限流: RequestRateLimiter过滤器使用Gateway实现服务降级 自定义全局过滤器GateWay中执行流程 网关 API网关就是实现了前端项目和服务端项目之间的统一入口 Nginx实现的是用户和前端项目之间调用…

【Linux】环境变量相关笔记

文章目录 echo $PATHexport和环境变量相关的命令main(int argc,char* argv[],char *env[])三个参数介绍getenv()通过系统调用获取su与su - 的区别:exportsource 和 .优先级 echo $PATH 是用来查环境变量的 export 从下面的图片当中可以看到,的确是将文…

ubuntu 20.04设置开机自启动脚本

1 建立开机启动服务 在 路径下 /lib/systemd/system/rc-local.service 的 rc-local.service 的脚本,内容规定了 rc.local 的启动顺序和行为 这行代码规定了这个service在开机启动时所执行的命令是:/etc/rc.local start。即运行 /etc/rc.local 脚本。不过…

《面试1v1》HashMap

没有人比中国人更懂 HashMap 我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。 面试官:HashMap 是Java程序员用得最频繁的集合之一,可以给我简单介绍一下它的内部实现机制吗? 候选人: Hash…

C++ -3- 类和对象 (中) | 拷贝构造函数 赋值运算符重载

文章目录 4.拷贝构造函数什么是拷贝构造函数?应用——示例:日期计算器什么情况下需要自己实现拷贝构造函数? 5.赋值运算符重载运算符重载(重要)赋值运算符重载 拷贝构造函数和赋值重载函数 4.拷贝构造函数 什么是拷贝…

Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCV实现Mono12和Mono16格式位深度的图像保存(C++)

Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCV实现Mono12和Mono16位深度的图像保存(C) Baumer工业相机Baumer工业相机保存位深度12/16位图像的技术背景代码案例分享1:引用合适的类文件2:BGAPI SDK在图像回调中联合OpenCV保…

Effective C++条款条款42:了解typename的双重意义(Understand the two meanings of typename)

Effective C条款条款42:了解typename的双重意义(Understand the two meanings of typename) 条款42:了解typename的双重意义1、从属名称和非从属名称2、typename在traits机制中的运用3、牢记 总结 《Effective C》是一本轻薄短小的…

1.17 从0开始学习Unity游戏开发--场景切换

前面的所有文章我们都在一个固定的游戏场景内进行开发,在最开始介绍场景这个概念的时候就已经提及,这个场景可以是一张地图,或者是一个对战房间等等,所以显然这个场景可以有多个,并且可以从一个场景切换到另外一个场景…

Collection接口

文章目录 1. Java集合框架概述2. Collection接口中15个方法的使用3. Iterator(迭代器)接口4. Connection子接口一:List4.1 List的实现类4.2 源码分析4.2.1 ArrayList源码分析4.2.2 LinkedList源码分析4.2.3 Vector源码分析 4.3 List接口中的常用方法 5. Collection子…