mcu 启动流程

news2024/11/26 12:24:28

MCU启动流程

MCU启动流程

    • MCU启动流程
      • 1 MCU的启动方式
      • 2 MCU程序启动执行过程
      • 3 启动过程的执行工作
      • 4 keil调式过程验证

1 MCU的启动方式

单片机的启动方式,以stm32为例,如下:
不同的下载方式对应的不同的启动方式,stm32主要有三种启动方式:flash memory、system memory、Embedded SRAM
在这里插入图片描述
flash启动(最常用):stm32的flash能够擦写数十万次,用户通过JTAG或SWD模式,将程序下载至此,重新启动从此处启动
sytem memory (系统存储器启动):系统存储器是芯片内的一块特定的区域,系统存储器中预置了一段bootloader,bootloder将程序下载到flash区,通过flash启动
内嵌SRAM启动:从内存中直接启动代码,避免因小修改反复擦写flash内存,一般用于高速调试

2 MCU程序启动执行过程

MCU上电,根据BOOT的引脚(BOOT0、BOOT1)电平,来确定启动地址。一般地址是0x0000000,个别如stm32的启动地址是0x8000000(flahs区启动)。
stm32内部闪存的起始地址为0x8000000,程序从此处写入,中断向量表位于该位置,首先从0x8000000取出MSP的栈顶指针(设置堆栈),然后从中断向量表中取出复位中断向量,并执行复位中断程序来完成启动。
程序执行过程如图:
1、STM32复位后,会从地址为0x8000004处取出复位中断向量的地址,并跳转执行复位中断服务程序,如图1中标号1️⃣​所示。
2、复位中断服务程序执行的最终结果是跳转至C程序的main函数,如上图中标号2️⃣所示,而main函数应该是一个死循环,是一个永不返回的函数。
3、在main函数执行的过程中,发生了一个中断请求,此时STM32的硬件机制会将PC指针强制指回中断向量表处,如图中标号3️⃣所示。
4、根据中断源进入相应的中断服务程序,如图1中标号5️⃣所示。
5、中断服务程序执行完毕后,程序再度返回至main函数中执行,如图中标号6️⃣所示。
在这里插入图片描述

3 启动过程的执行工作

启动过程主要完成两部分工作:硬件环境、软件环境
硬件环境操作:
初始化时钟:初始化内核时钟,主时钟和各个外设的时钟
关闭看门狗:看门狗用来检测应用程序异常跑飞而复位CPU,在初始化阶段,没有“喂狗“的动作,有可能导致CPU 不断的复位,此处需要关闭看门狗
建立中断向量表:中断向量表作为中断源的识别标志,可以形成相应的中断入口地址,或者中断服务程序的入口地址的偏移量和段基值。CPU利用中断向量表转入中断服务程序处理相关到事务
初始化堆栈:堆栈的作用就是保护现场(上下文),函数调用或中断发生时,将当前执行地址压栈,调用完再返回执行此次的地址。在启动阶段,初始化堆栈的寄存器、堆栈大小、起始地址等
内存初始化:选择内部或外部RAM
软件环境操作:
把RO、RW从它们的加载域复制到运行域
初始化ZI域
初始化堆栈指针:包括C库所需要的内存空间、程序执行的所需资源、C库初始化

4 keil调式过程验证

进入调试模式,首先进入一个启动文件starup_ARMCM4.s的启动文件,运行指示光标,会停在SystemInit上:

starup_ARMCM4.s代码的前面是:栈大小stack size设置、堆大小 heap size的设置、一堆中断向量表 Vect Table
当前运行所在处为Reset_Handle处,在执行main 之前还需要执行 SystemInit,SystemInit在system_ARMCM4.c文件中,如下跳转至system_ARMCM4.c中的SystemInit函数
在这里插入图片描述
执行完SystemInit,将执行__main函数
在这里插入图片描述
参考:单片机启动过程: main之前干了啥

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

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

相关文章

【最新教程】树莓派安装系统及VNC远程桌面连接

大家好,今天就不给大家介绍PYTHONL ,今天我作为一个刚入坑树莓派的小白,整理了一下自己安装树莓派的整个过程,分享给大家。 目录 树莓派 准备工作: 树莓派远程ssh失败access denied 原因: 树莓派系统安装 1、下载…

ImportError: cannot import name ‘imresize‘ from ‘scipy.misc‘

ImportError: cannot import name ‘imresize’ from ‘scipy.misc’ 今天在运行项目时发现了部分代码出现问题,报错图片如下: 通过了解得知,imresize已经被最新版本的Scipy库弃用了,所以在这里,处理这种错误可以选择…

ylb-接口6验证手机号是否注册

总览: 1、service处理 在api模块下service包,创建一个UserService接口:(根据手机号查询数据queryByPhone(String phone)) package com.bjpowernode.api.service;import com.bjpowernode.api.model.User; import co…

前端 | (六)CSS盒子模型 | 尚硅谷前端html+css零基础教程2023最新

学习来源:尚硅谷前端htmlcss零基础教程,2023最新前端开发html5css3视频 文章目录 📚元素的显示模式🐇CSS长度单位🐇元素的显示模式⭐️块元素(block)⭐️行内元素(inline&#xff09…

网工内推 | 美图秀秀招网工,大专以上,15薪,NP认证优先

01 美图公司 招聘岗位:网络工程师 职责描述: 1、美图大厦网络、分公司网络、IT相关项目的网络、办公内网服务器; 2、负责网络的设计、运行、管理和维护等工作; 3、负责远程办公环境的优化、运行、管理和维护工作; 4、…

UnxUtils工具包,Windows下使用Linux命令

1. 前言 最近写批处理多了,发现Windows下的bat批处理命令,相比Linux的命令,无论是功能还是多样性,真的差太多了。但有时候又不得不使用bat批处理,好在今天发现了一个不错的工具包:UnxUtils,这个…

Generative Adversarial Network

Goodfellow,2014年 文献阅读笔记--GAN--Generative Adversarial NetworkGAN的原始论文-组会讲解_gan英文论文_Flying Warrior的博客-CSDN博客 启发:如何看两个数据是否来自同一个分布? 在统计中,two sample test。训练一个二分类的分类器,如果能分开这两个数据,说明来自…

基于MSP432P401R跟随小车【2022年电赛C题】

文章目录 一、赛前准备1. 硬件清单2. 工程环境 二、赛题思考三、软件设计1. 路程、时间、速度计算2. 距离测量3. 双机通信4. 红外循迹 四、技术交流 一、赛前准备 1. 硬件清单 主控板: MSP432P401R测距模块: GY56数据显示: OLED电机&#x…

实现本地缓存-caffeine

目录 实现caffeine cache CacheManager Caffeine配置说明 创建自定义配置类 配置缓存管理器 编写自动提示配置文件 测试使用 创建测试配置实体类 创建测试配置类 创建注解扫描的测试实体 创建单元测试类进行测试 实现caffeine cache CacheManager SimpleCacheManag…

HttpClient使用MultipartEntityBuilder上传文件时乱码问题解决

HttpClient使用MultipartEntityBuilder是常用的上传文件的组件,但是上传的文件名称是乱码,一直输出一堆的问号: 如何解决呢?废话少说,先直接上代码: public static String doPostWithFiles(HttpClient http…

git使用问题记录-权限

注意点: 1、在远程仓库中直接创建项目时,默认分支为main 2、git push报错 原因:即使是项目文件的创建者,但上层目录的权限为developer,无法push项目,找上层管理员修改权限为maintainer或owner可push代码…

File格式转换MultipartFile格式的例子

首先&#xff1a;需要先引入依赖包 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.3.9</version> </dependency> 1.Multipartfile转File类型 //创建一…

函数(function)py

具有名称的&#xff0c;是为了解决某一问题&#xff0c;功能代码的集合 目录 一.定义函数 二.函数的分类 三.局部变量和全局变量 1.局部变量(local variable) 2.全局变量(global variable) 四.函数调用的内存分析 五.函数的参数 1.默认值参数 2.可变参数(不定长参数)…

基于timegan扩增技术,进行多维度数据扩增(Python编程,数据集为瓦斯浓度气体数据集)

1.数据集介绍 瓦斯是被预测气体&#xff0c;其它列为特征列,原始数据一共有472行数据&#xff0c;因为原始数据比较少&#xff0c;所以要对原始数据&#xff08;总共8列数据&#xff09;进行扩增。 开始数据截图 截止数据截图 2. 文件夹介绍 lstm.py是对未扩增的数据进行训练…

1186. 删除一次得到子数组最大和;1711. 大餐计数;1834. 单线程 CPU

1186. 删除一次得到子数组最大和 解题思路&#xff1a;如果没做过还不是很好想&#xff0c;当时自己第一反应是双指针&#xff0c;结果是个动态规划的题。 核心就是dp的定义&#xff0c;dp[i][k]表示以arr[i]结尾删除k次的最大和。看到这里其实就有一点思路了 dp[i][0]表示以…

KGAT: Knowledge Graph Attention Network for Recommendation

[1905.07854] KGAT: Knowledge Graph Attention Network for Recommendation (arxiv.org) LunaBlack/KGAT-pytorch (github.com) 目录 1、背景 2、任务定义 3、模型 3.1 Embedding layer 3.2 Attentive Embedding Propagation Layers 3.3 Model Prediction 3.4 Optimi…

docker容器引擎(一)

docker 一、docker的理论部分docker的概述容器受欢迎的原因容器与虚拟机的区别docker核心概念 二、安装docker三、docker镜像操作四、docker容器操作 一、docker的理论部分 docker的概述 一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源再Linux容…

ThreeJS打造自己的人物

hello&#xff0c;大家好&#xff0c;我是better&#xff0c;今天为大家分享如何使用Three打造属于自己的3D人物模型。 人物建模 当下有很多人物建模的网站&#xff0c;这里给大家分享的 Ready Player Me - Create a Full-Body 3D Avatar From a Photo 前往这个网址&#xff…

AI销售工具:驱动销售团队效率和个性化服务的未来

在数字化时代&#xff0c;AI销售工具成为推动销售行业发展的重要力量。这些创新工具融合了人工智能技术和销售流程&#xff0c;以提高销售团队的效率和提供个性化服务为目标。随着科技的不断进步&#xff0c;AI销售工具正引领着销售行业走向一个更加智能和高效的未来。 AI驱动的…

专题-【哈希函数】

14年三-3&#xff09; 20年三-2&#xff09; 哈希表&#xff1a; 查找成功&#xff1a; ASL(12113144)/817/8&#xff1b; 查找失败&#xff08;模为7&#xff0c;0-6不成功次数进行计算&#xff09;&#xff1a; ASL(3217654)/74。