请选择 进入手机版 | 继续访问电脑版

02、单片机疑难学习

[复制链接]
丁翼 发表于 2021-1-2 19:01:38 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
目次
 
STM32三种启动模式
STM32启动过程
STM32出现硬件错误(HardFault_Handler)大概有以下原因:
分散加载文件(即scatter file 后缀为.sct)
map文件分析
堆栈
arm架构
STM32三种启动模式

STM32上电大概复位后,代码区始终从0x00000000开始,三种启动模式实在就是将各自存储空间的所在映射到0x00000000中。
(1)从Flash启动,将主Flash所在0x08000000映射到0x00000000,这样代码启动之后就相当于从0x08000000开始。
(2)从RAM启动,将RAM所在0x20000000映射到0x00000000,这样代码启动之后就相当于从0x20000000开始。
(3)从系统存储器启动。首先控制BOOT0 BOOT1管脚,复位后,STM32与上述两种方式类似,从系统存储器所在0x1FFF F000开始执行代码。系统存储器存储的实在就是STM32自带的bootloader代码,在bootloader中提供了UART1的接口,通过此接口可以将用户所需的步调代码下载到主Flash中,下载完毕后,此时步调代码已经存储在主Flash当中,这时切换启动模式(从主Flash启动),复位后所执行的就是刚刚下载到Flash中的代码了。
 
STM32启动过程

1、上电复位,CPU从0x00000000处获取栈顶指针MSP(默认使用主堆栈),从0x00000004处获取步调计数器PC(复位向量)。
2、MSP指针一定指向SRAM区的,因为堆栈必须创建在该区。
3、根据PC的值找到复位中断处置惩罚函数Reset_Handler
4、调用SystemInit函数。
5、调用__main函数,初始化用户堆栈
6、调用main函数,进入C语言情况
 
STM32出现硬件错误(HardFault_Handler)大概有以下原因

(1)数组越界使用;
(2)内存溢出,访问越界;
(3)堆栈溢出,步调跑飞;
(4)中断处置惩罚错误;
 
分散加载文件(即scatter file 后缀为.sct)

编译器在生成可执行文件时,先将每个.c文件编译成.o文件(此过程叫编译),然后将许多个.o文件链接成可执行文件(此过程叫链接)。
在链接的过程中,会用到一个形貌文件,用来指定链接时的行为。这个形貌文件叫做链接文件,如linux下的.ld文件,
keil中的分散加载文件(.sct文件)。
先容
https://blog.csdn.net/qq_23274715/article/details/103445958?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param
 
ARM Cortex-M底层技能(六)分散加载的简单先容
https://blog.csdn.net/weixin_39118482/article/details/79849133?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control
https://blog.csdn.net/weixin_39118482/article/details/79895378
 
ARM Cortex-M 底层技能PPT干货汇总
https://blog.csdn.net/weixin_39118482/article/details/87872262
 
map文件分析

map文件是通过编译器编译之后,集步调、数据及IO空间的一种映射文件
https://blog.csdn.net/linux12121/article/details/82939225
 
堆栈

https://blog.csdn.net/weixin_39964178/article/details/82875304
栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其使用方式类似于数据布局中的栈。
堆区(heap) :一般由步调员分配和释放,若步调员不释放,步调竣事时大概由使用系统接纳。分配方式类似于数据布局中的链表。?
全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。步调竣事后由系统自动释放。?
文字常量区:常量字符串就是存放在这里的。?
 
步调代码区:存放函数体的二进制代码。
注意:堆和栈,一般堆是由低所在往上(高所在)增长,栈是由高所在向下(低所在)增长。
Code 代表执行的代码,步调中所有的函数都位于此处。
RO-data 代表只读数据,步调中所界说的全局常量数据和字符串都位于此处。
RW-data 代表已初始化的读写数据,步调中界说而且初始化的全局变量和静态变量位于此处。
ZI-data 代表未初始化的读写数据,步调中界说了但没有初始化的全局变量和静态变量位于此处。
 
Total RO  Size (Code + RO Data)                15644 (  15.28kB)
Total RW  Size (RW Data + ZI Data)              6320 (   6.17kB)
Total ROM Size (Code + RO Data + RW Data)      15732 (  15.36kB)
 
arm架构


Cortex-A7处置惩罚器有9种处置惩罚模式

 
SP为堆栈指针。应用步调会初始化它,使其指向该模式专用的栈所在,也就是常说的初始化sp指针。
LR为毗连寄存器,存放当前子步调的返回所在,完成子函数返回。
PC为步调计数器,ARM处置惩罚器三级流水线 取指、译码、执行,PC指向正在取指的指令,PC=执行位置+8字节。
CPSR,步调状态寄存器,包罗了条件标记位、中断克制位、当前处置惩罚器模式标记等状态。
 

来源:https://blog.csdn.net/qq_20579015/article/details/111566006
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )