STM32启动流程
前言
先阐述一个问题,嵌入式应用程序以C语言为主,因此main函数成为程序运行的起点,但是我们忽略了一个问题:MCU(微控制器/单片机)上电之后,是如何寻找并执行main函数的呢?
一、STM32的三种启动方式?
STM32芯片自带的启动方式有3种,通过设置BOOT1、BOOT0的引脚的高低电平即可选择。
- 主闪存启动是将程序下载到内置的Flash进行启动(该flash可运行程序),该程序可以掉电保存,下次开机可自动启动。
- 系统存储器启动是将程序写入到一块特定的区域,一般由厂家直接写入,不能被随意更改或擦除。
- 内置SRAM启动,由于SRAM掉电丢失,不能保存程序,一般只用于程序的调试。
二、启动流程图
总结
最后总结一下STM32的启动流程:
①上电后硬件设置SP、跳转到 Reset_Hander
②设置系统时钟(SystemInit)
③软件设置SP
④加载.data、.bss,并初始化栈区(__main)
⑤跳转到C文件的main函数
值得注意的是:Keil编译完成后:
Code:代表程序代码段
RO_DATA:代表只读数据段
RW_DATA:代表已经初始化全局数据
ZI_DATA:代表未初始化全局数据
由于程序在 FLASH 中直接通过总线进行访问,程序运行在 FLASH 上,而可更改的数据存于 SRAM 中,故:
RO_SIZE = Code + RO_DATA(占用 Flash )
RW_DATA = RW_DATA + ZI_DATA(占用 SRAM)
ROM_SIZE = Code + RO_DATA + RW_DATA ( 烧写到 FLASH 大小空间 )
针对 ZI 数据,是不存 FLASH 中,直接在 SRAM 中初始化为 0