MCU上电到启动应用程序前的工作

MCU整体工作流程可总结如下:上电——>主时钟起振——>启动代码——>用户程序(main函数)。对于我们应用开发来说,大部分工作重点是在应用程序编写这块。特别是高级MCU的出现,如ARM系列的STM32、LPC等32位MCU,以及芯片原厂的完善底层代码,启动代码已经固化在芯片内部flash(称为BootLoader),或者已经提供完整的汇编启动源码。因此,启动过程这块,我们比较陌生,但基本的原理还需了解,不排除面试或者使用到实时系统(RTOS)时需要修改启动汇编代码。
MCU上电(复位)时,从固定的地址启动,一般是地址0x00000000,如ARM7;个别特殊的如STM32默认启动地址为0x8000000(flash区启动)。启动过程主要完成两部分工作,一个是硬件执行环境,如中断向量表、寄存器、看门狗等,另一个是软件环境,如C库环境、ZI(未初始化的内存变量)等。

一.硬件环境工作

1.初始时钟
初始化内核时钟,主时钟,各个外设的时钟。

2.关闭看门狗
看门狗是用来监控应用程序的异常跑飞而复位CPU,在初始化阶段,由于没有”喂狗”这一动作,有可能导致CPU不断复位,因此,首先会关闭看门狗,初始化完,再开启。

3.建立中断向量表
中断向量表,中断源的识别标志,可用来形成相应的中断服务程序的入口地址,或者中断服务程序入口地址的偏移量和段基值。CPU利用中断向量表转入中断服务程序处理相关事务。

4.初始化堆栈寄存器
堆栈的作用一个就是保存现场(上下文),如函数调用或者中断发送时,将当前执行地址压栈,调用完成再返回此处执行程序。另一个作用就是保存参数,如临时变量。因此,在启动阶段需初始化堆栈寄存器、堆栈的大小、起始地址等。

5.内存初始化
选择内部或者外部RAM。

二.软件环境工作
1.把RO,RW从它们的加载域复制到它们的运行域中去。

2.初始化(清零)ZI域。

3.初始化堆栈指针

4.初始化C库环境
包括C库所需的内存空间、程序执行所需资源、C库初始化。

三.Cortex M3启动
CortexM3有3种启动方式
1、 BOOT1=1 BOOT0=1 ,中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后PC指针位于0x2000000处。
2、 BOOT1=x BOOT0=0,中断向量表定位于FLASH区,即起始地址为0x8000000,同时复位后PC指针位于0x8000000处。
3、 BOOT1=0 BOOT0=1 ,中断向量表定位于内置Bootloader区,此时可通过串口下载程序的二进制文件到flash区。

而Cortex-M3内核规定,起始地址必须存放堆顶指针,而第二个地址则必须存放复位中断入口向量地址,这样在Cortex-M3内核复位后,会自动从起始地址的下一个32位空间取出复位中断入口向量,跳转执行复位中断服务程序。对比ARM7/ARM9内核,Cortex-M3内核则是固定了中断向量表的位置而起始地址是可变化的。即是对于flash启动来说(正常工作也是flash启动),0x8000000地址存放的是栈顶地址__initial_sp,0x8000004地址存放的是复位中断向量Reset_Handler入口地址(STM32使用32位总线,存储空间为4字节对齐);在编写多段程序时,偏移地址空间需注意,如编写一个BootLoader,从BootLoader到应用程序段的相互跳转。

Original: https://www.cnblogs.com/wanghuaijun/p/16340742.html
Author: 专注it
Title: MCU上电到启动应用程序前的工作

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/553814/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • docker学习:docker命令

    帮助命令 自验证*docker version 详情信息*docker info 获取帮助*docker –help 镜像命令 列出本例主机上的镜像 docker im…

    技术杂谈 2023年7月10日
    061
  • 墨菲定律 by 张鹏程

    社会法制 巴纳姆效应:一定戴在谁头上都合适的帽子 彼得原理:找到适合自己的位置 马太效应:多的越多,少的越少 蘑菇定律:先当”小苗”,才能做”大…

    技术杂谈 2023年7月25日
    060
  • asp.net C# 连接MySQL8.0的caching_sha2_password问题

    解决方法可用以下命令: 网上说用: 以上方法未成功,可能还是mysql 8.0密码验证机制问题导致,所以需要修改一下my.ini文件如下: 如果安装目录下找不到my.ini文件 w…

    技术杂谈 2023年6月21日
    091
  • Elasticsearch Analyzer 内置分词器

    Elasticsearch Analyzer 内置分词器 篇主要介绍一下 Elasticsearch中 Analyzer 分词器的构成 和一些Es中内置的分词器 以及如何使用它们 …

    技术杂谈 2023年7月10日
    076
  • 运行程序报告 ModuleNotFoundError: No module named ‘Cython’ 解决方法

    运行代码出现找不到Cython模块报错,如下: 安装升级下Cython可以解决:pip3 install –upgrade cython Original: https…

    技术杂谈 2023年7月11日
    064
  • 带权重的有向图求最短路径

    首先新建一个网图如下: 图的表示法有好多中,最常用的应该是邻接矩阵与邻接表。上面的图,边很少,用邻接表来表示就很不错。 对于以上图,可以对象出3个类。图、节点、边。3个实体类代码如…

    技术杂谈 2023年5月31日
    0134
  • 一文看懂JVM内存区域分布与作用

    那么我们在开始介绍Java内存区域之前,我们先放一张内存区域的图,方便我们后面介绍的时候可以对照着看。 须知,本文是根据JDK8来介绍的。 程序计数器 首先它是线程私有的,它也称为…

    技术杂谈 2023年7月11日
    097
  • 图像通道、RGB与色彩体系

    通道(Channels) 图像的通道指的是什么?是不是灰度图的通道数为1,彩色图的通道为3 ? 图像通&#…

    技术杂谈 2023年6月21日
    0106
  • sqli-labs-master/Less-1解题过程

    2.根据提示输入id的值如下(?id = key),发现id的值变化时,页面显示的内容也会变化 6.根据显示发现2,3可以显示出来,那么可以在2,3处进行database()和ve…

    技术杂谈 2023年6月21日
    097
  • enum class 、enum struct 和 enum

    至从C语言开始enum类型就被作为用户自定义分类有限集合常量的方法被引入到了语言当中,而且一度成为C++中定义编译期常量的唯一方法(后来在类中引入了静态整型常量)。根据上面对enu…

    技术杂谈 2023年5月31日
    076
  • maven项目集成findbugs详解

    文章目录0、概述一、接入方式二、如何使用方式一、在控制台中执行打包命令方式二、使用IntelliJ IDEA的maven工具(其他IDE用户忽略)三、bug详情查看四、忽略指定的包…

    技术杂谈 2023年5月30日
    064
  • fb-watchman 文件查看服务

    fb-watchman https://facebook.github.io/watchman/docs/nodejs.html Original: https://www.cnb…

    技术杂谈 2023年5月31日
    080
  • PHP安装和部署

    一、关闭防火墙 二、安装EPEL源、REMI源、yum源管理工具、PHP 7.3 ①安装epel源 [root@localhost yum.repos.d]# yum instal…

    技术杂谈 2023年7月11日
    041
  • yuv rgb 互转 公式 及算法

    1 前言 自然界的颜色千变万化,为了给颜色一个量化的衡量标准,就需要建立色彩空间模型来描述各种各样的颜色,由于人对色彩的感知是一个复杂的生理和心理联合作用的过程,所以在不同的应用领…

    技术杂谈 2023年5月31日
    084
  • tolua杂记

    1 字符串调用luaFunc :DoString public class CallLuaFunction : MonoBehaviour { private string scr…

    技术杂谈 2023年5月31日
    059
  • Redis和数据库的数据一致性问题

    在数据读多写少的情况下作为缓存来使用,恐怕是Redis使用最普遍的场景了。当使用Redis作为缓存的时候,一般流程是这样的。 如果缓存在Redis中存在,即缓存命中,则直接返回数据…

    技术杂谈 2023年7月24日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球