STM32用户闪存启动流程详解

需积分: 11 3 下载量 42 浏览量 更新于2024-09-11 收藏 270KB DOCX 举报
"STM32启动流程涉及到微控制器的初始化设置,包括堆栈大小定义、启动方式选择以及内存分配。本文主要关注从用户闪存启动的情况。STM32基于Cortex-M3内核,启动模式有三种,正常工作模式是从内部Flash启动。程序的起始地址和加载地址在STM32中是固定的,分别为0X08000000。编译后的程序在内存中分为不同的区域,如全局变量、const变量、堆和栈。在RAM中的存储布局包括已初始化和未初始化的全局变量、malloc分配的内存以及局部变量。启动流程包括系统复位中断、系统初始化等步骤,中断向量表会被设置到Flash基地址。" STM32的启动流程详解: 1. **堆栈配置**:在启动代码`startup_stm32f10x_hd.s`中定义了堆和栈的大小,例如,堆大小为0x00000200字节,栈大小为0x00000400字节。 2. **启动方式**:STM32提供了三种启动方式,其中最常见的模式是BOOT1不置位,BOOT0置位,即从用户闪存启动。其他两种模式分别是从系统存储器和内置SRAM启动,通常用于特殊调试目的。 3. **内存分配**:程序的加载地址通常是内部Flash的起始地址0X08000000。在RAM中,已初始化的全局变量位于0x20000000,未初始化的全局变量在其之后,然后是malloc分配的内存,栈从高地址向低地址增长。在编译后,const变量存储在Flash中,其他变量存储在RAM中。 4. **程序结构**:通过分析`main`函数及`.map`文件,可以了解到不同类型的变量在内存中的位置,例如const变量、全局变量、malloc分配的内存和局部变量。 5. **启动流程**:当系统复位后,首先执行位于0x08000000的Flash中的代码,接着进入系统复位中断处理。`SystemInit()`函数负责系统级的初始化,如设置时钟和中断向量表。中断向量表(VECT_TAB_OFFSET)被设置到Flash的基础地址,确保中断服务程序能正确执行。 6. **内存管理**:堆始于0x20000120,大小为0x200字节,而栈位于更高的地址,大小为0x400字节。局部变量存在于栈中,栈顶由`__initial_sp`指针指示。 7. **数据段与BSS段**:已初始化的数据段包含程序中初始化的全局或静态变量,未初始化的BSS段则包含未赋初始值的全局或静态变量。这些都在程序运行前由链接器进行分配。 8. **调试与优化**:在开发过程中,理解启动流程和内存布局对于调试和优化代码至关重要,因为这直接影响到程序的执行效率和内存使用。 总结,STM32的启动流程是一个复杂但有序的过程,涉及硬件初始化、内存分配和程序执行。理解这个过程对于有效利用STM32资源和编写高效代码具有重要意义。