stm32的启动过程模式
系统储存器指的是STM32的内置ROM,选择该启动模式后,内置ROM的起始地址0x1FFF0000,将被重映射到0x00000000地址,代码在此处开始运行。3.从嵌入式SRAM中启动,选择该启动模式后,内置SRAM的起始地址0x20000000将被重映射到0x00000000地址,代码在此处开始运行。复位后,在 SYSCLK 的第四个上升沿锁存 BOOT 引脚的值。当系统复位后,处理器从向量表中
1.1 根据boot引脚决定三种启动模式

复位后,在 SYSCLK 的第四个上升沿锁存 BOOT 引脚的值。BOOT0 为专用引脚,而 BOOT1 则与 GPIO 引脚共用。一旦完成对 BOOT1 的采样,相应 GPIO 引脚即进入空闲状态,可用于其它用途。BOOT0与BOOT1引脚的不同值指向了三种启动方式:
1.从主Flash启动。主Flash指的是STM32的内置Flash。选择该启动模式后,内置Flash的起始地址将被重映射到0x00000000地址,代码将在该处开始执行。一般我们使用JTAG或者SWD模式下载调试程序时,就是下载到这里面,重启后也直接从这启动。
2.从系统存储器启动。系统储存器指的是STM32的内置ROM,选择该启动模式后,内置ROM的起始地址0x1FFF0000,将被重映射到0x00000000地址,代码在此处开始运行。ROM中有一段出厂预置的代码,这段代码起到一个桥的作用,允许外部通过UART/CAN或USB等将代码写入STM32的内置Flash中。这段代码也被称为ISP(In System Programing)代码,这种烧录代码的方式也被称为ISP烧录。
3.从嵌入式SRAM中启动,选择该启动模式后,内置SRAM的起始地址0x20000000将被重映射到0x00000000地址,代码在此处开始运行。这种模式由于烧录程序过程中不需要擦写Flash,因此速度较快,适合调试(用来跑 bootloader 或更新固件),但是掉电丢失。
启动模式只决定程序烧录的位置,加载完程序之后会有一个重映射(映射到 0x00000000 地址位置);真正产生复位信号的时候,CPU 还是从开始位置执行。
值得注意的是 STM32 上电复位以后,代码区都是从 0x00000000 开始的,三种启动模式只是将各自存储空间的地址映射到0x00000000 中。
1.2 初始化SP、PC指针
SP指针:堆栈指针(Stack Pointer, SP),是一个特殊的寄存器,它始终指向堆栈的顶部。当系统复位后,处理器从向量表中读取前八个字节,也就是两条指令,前四个字节存入 MSP,后四个字节为复位向量,也就是程序执行的起始地址。
PC指针:程序计数器(Program Counter),指向复位向量表Rest Handler。读取 复位向量 (Reset Vector),即程序入口地址 (通常是 Reset_Handler),并加载到 PC (程序计数器) 寄存器。
将 0x08000000 位置存放的堆栈栈顶地址存放到 SP 中(MSP)。
将 0x08000004 位置存放的向量地址装入 PC 程序计数器
然后从Reset_Handler处开始执行代码
如下图所示:
__initial_sp (0x20004648)
Reset_Handler (0x80000198)
Reset_Handler是0x80000198,而显示是0x80000199。原因如下:ARM 指令集有 ARM 指令集和 Thumb 指令集。ARM 指令集位数长;而 Thumb 指令集位数短,故而占用内存比较小,所以编译器大部分时间采用 Thumb 指令集。
Thumb 指令集末尾是奇数位 1,像这里的 0x80000199
ARM 指令集末尾是偶数位 0,也就是这里的 0x80000198
而我们访问 0x80000199这个地址的时候,它实际上会跳转到 0x80000198这个地址。

初始化 .data 段: 将存储在 Flash 中的初始化值复制到 RAM 中的 .data 段(存放初始化了的全局/静态变量)。
清零 .bss 段: 将 RAM 中的 .bss 段清零(存放未初始化的全局/静态变量)。
1.3 初始化系统时钟
复位中断服务程序Reset_Handler会调用SystemInit函数,进行对系统时钟的初始化
1.4 初始化用户堆栈
程序会执行到指令LDR R0, =__main,然后就跳转到__main程序段运行,__mian是标准库中的函数,其会调用c文件中的main函数
1.5 进入main函数
启动过程的最后也就是进入到C文件中的main函数。

启动文件涉及的几个汇编命令

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)