IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> Cortex-M3/M4芯片启动流程概括 -> 正文阅读

[嵌入式]Cortex-M3/M4芯片启动流程概括

启动模式

首先从芯片的启动模式讲起,如下图所示
在这里插入图片描述
这是STM32的三种启动方式

  • BOOT0拉低,BOOT1任意,芯片从Main Flash memory(0x08000000)启动
  • BOOT0拉高,BOOT1拉低,芯片从系统存储System Memory启动
  • BOOT0拉高,BOOT1拉高,芯片从SRAM(0x20000000)启动

STM32的部分存储区域见下图(为方便讲解,仅截取部分)
在这里插入图片描述

烧录方式(ISP ICP IAP的区别)

启动方式的不同,使得STM32的烧录方式也有了更多的选择,这里扩展谈一下ISP,ICP,IAP吧

ISP:boot0=1 boot0=0,系统从System Memory启动,此处是ST公司在芯片出厂时固化好的一块程序,也可以叫做BootLoader或ISP程序,通过此程序,可以将串口下载进板子的固件程序(hex文件)写入到Main memory中,然后再将Boot0拉低,重启即可运行Main memory出的代码。

ICP:Boot0=0,BOOT1=x,系统直接从Main memory启动,通过JTAG或SWD可以直接将代码烧录到Main memory

IAP:将Mian memory分成两部分,第一部分可以再写一个bootloader程序,它的作用是通过有线或者无线的方式获取外部的固件升级包,然后再写入到第二部分的flash中,重定位中断向量表的地址和更改PC指向,这样可以自动实现板子程序的自动升级

中断向量表

启动方式不同,决定了芯片是从Flash(0x08000000),还是SRAM(0x20000000)或者是其它地方启动,然而处理器不会去费力去这些地址,它最开始是去0x00000000这个地方找东西,硬件电路会把flash的东西或者SRAM的东西映射到0x00000000这个地方
所以,知道0x00000000这个地方有什么是理解芯片启动的第一步,如下图
在这里插入图片描述
0x00000000的地方有个MSP(Main stack pointer)的初始值,保存了栈顶地址,系统一上电的第一件事就是去把栈的位置找到,因为在后面复位处理过程中,可能会产生NMI或者HardFault的异常,处理异常肯定需要用到栈哒
后面就是到复位向量了,这里保存的是Reset Handler的地址,PC会直接跳转到这个地方进行复位处理,但这个复位处理需要做些啥呢?这就需要看芯片的启动文件了,stm32的话对应得就是这个:
在这里插入图片描述
这个文件可以去读一读,对应着这里所说的中断向量表
直接上Reset_Handler
在这里插入图片描述
不需要太多汇编知识应该也能看懂,复位处理里面只做了两个操作

  • 调用SystemInit函数
  • 调用__mian这个函数

下面就对这两个函数所做的事情进行介绍

SystemInit

在这里插入图片描述
在这里插入图片描述
上面是从STM32的系统文件里截取SystemInit函数的一部分代码,可以看出大部分是和时钟配置相关的,最后还将中断向量表的位置设置到了0x08000000(存储程序的Flash的起始地址),

__main

注意这个__main不是主程序里的main函数,这是C库里面的,当然,在执行到__main的最后,将会跳转到main()函数,执行主程序。
再来看看__main里做了什么,如下图
在这里插入图片描述
可以知道里面主要调用了__scatterload和__rt_entry,分别介绍下它们的作用

__scatterload:根据分散加载文件把RW数据拷贝到RAM空间,然后在RAM空间分配ZI数据的空间,这样便建立好运行时的存储空间。
在这里插入图片描述

__rt_entry:负责初始化C库,还设置应用程序的堆和栈,初始化库函数等操作

接下来便跳转到main(),执行应用程序

芯片启动流程到此结束

如果还需要理解更深刻的话,可以再去看看keil生成的map文件,具体操作可以参考下方链接https://blog.csdn.net/ybhuangfugui/article/details/75948282

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-01 14:40:08  更:2021-08-01 14:40:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:52:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码