一次性搞定stm32启动模式与启动过程
一、stm32启动模式
这三种模式请看下列图示
三个不同作用的空间在单片机里面占了三个空间,单片机引导哪个空间资源启动,由BOOT1和BOOT0决定!
正常来说一般是从flash启动!!!
二、从flash启动过程
2.1 数据在堆栈中存储方式
启动的程序是在sram上运行!!有一个很关键数据结构的知识点,运行时sram会分成以下四个部分:常量区,堆,栈,静态存储区!
例如:
#include <stdio.h>
int a=0; //全局初始化区
char *p1; //全局未初始化区
void main()
{
int b; //栈
char s[]="abc"; //栈
char *p3= "1234567"; //在文字常量区Flash
static int c =0 ; //静态初始化区
p1= (char *)malloc(10); //堆区,运行完需要free释放
strcpy(p1,"123456"); //"123456"放在常量区
strcpy(p3,"abcde"); //错误示范!常量区的数据不能被修改,只读
free(p1);
}
2.2 stm32的正常启动过程
stm32未上电时,数据是存flash里面的,上电后,sram开始接收到数据工作,那么单片机做了什么工作呢?实际上stm32的启动过程就是给单片机的资源设置初始化的过程!
等同于:stm32的启动过程等于给单片机的寄存器赋值过程
关键的寄存器就是可以在sram里面设置堆、栈的寄存器
PC寄存器(程序计数)和SP寄存器(堆栈指针)
在启动代码里面可以看到
单片机启动会先设置栈的空间600字节和堆的空间200字节,也就是设置堆栈指针到响应的地址
其响应的地址是在链表文件配置
即是:堆和栈设置地址为0x20000000,堆是向上找空间,栈是向下找空间!
实际上,依据map的地址分配
它应该还会先设置静态储存器,再设置堆和栈!
所以栈的地址为0x20000658
而我理解的R/O就是read only,即是为文字常量区!
接着就是设置中断向量表,分为:异常向量表和外部中断向量表
(若程序异常则会先继续执行异常状态)
接着就执行_mian
正式进入main循环,执行时钟分配,外设初始化等工作!
三、总结
stm32启动过程:
汇编文件:
- 设置sp寄存器,即使设置指向堆栈的地址的指针;
- 设置pc寄存器,即使设置程序计数器;
- 设置中断向量表;
- 时钟初始化,也会在汇编文件里面启动sysinit
c文件正常执行:
- main中的时钟初始化
- 外设初始化
- loop()工作