【单片机01】启动流程

本文详细介绍了STM32的三种启动方式:Flash启动、SRAM启动和系统存储器启动,其中系统存储器启动包含官方Bootloader,可用于通过UART1接口下载代码。此外,还阐述了芯片启动后的初始化过程,包括中断向量表建立、存储器和堆栈初始化、全局变量和库函数的设置,最后进入main()函数执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32有3种启动方式

1. 从Flash启动,将Flash地址0x0800 0000映射到0x00000000,这样启动以后就相当于从0x08000000开始的,这是我们最常用的模式;

2. 从SRAM启动,将SRAM地址0x20000000映射到0x00000000,这样启动以后就相当于从0x20000000开始的,用于调试,笔者基本没用过

3. 从系统存储器启动(System memory),将系统存储器地址0x1FFFF000映射到0x00000000,这样启动以后就相当于从0x1FFFF000开始执行的,值得注意的是这个系统存储器里面存储的其实是STM32自带的Bootloader代码,这其实是一个官方的IAP,它提供了可以通过UART1接口将用户的代码下载到Flash中的功能,然后将boot0置0,复位单片机,便可以Flash启动。

注:系统内存存储器我们没办法烧些,因为他是一个只读的ROM,我们只能读取,但是可以通过从系统存储器启动,通过串口UART1烧录代码。

芯片固件->烧录或跳转到用户程序->       初始化执行环境                    ->初始化c库和用户应用程序

                                                        (1)建立中断向量表;                           (1)加载程序运行地址
                     

<think>好的,用户想了解单片机启动流程,特别是希望有一个图示解析。首先,我需要回忆单片机启动的基本步骤,并结合用户提供的参考资料来组织答案。用户提到的引用[2]提到了STM32F10x.s启动文件的三个主要工作,这应该是关键点。 首先,单片机上电后,硬件会初始化复位向量,让程序计数器指向复位处理函数。接着启动文件负责设置堆栈,分配内存空间,这是系统运行的基础。然后初始化.data段和.bss段,前者存放已初始化的全局变量,后者处理未初始化的静态变量。之后调用SystemInit函数配置时钟,确保系统时钟正确。最后跳转到main函数,开始执行用户代码。 用户可能需要更详细的步骤解释,以及每个阶段的作用。比如,堆栈初始化为什么重要,中断向量表的作用是什么。同时,结合引用[2]中的内容,可以强调启动文件的具体任务,如分配堆栈、定义复位向量和中断向量表处理。 另外,用户提到需要图示解析,虽然无法直接提供图片,但可以用文字描述各个步骤的流程图,并建议参考相关文档或教程中的图示,比如引用[1]中的Proteus和Keil联调例程可能有相关示意图。 还需要检查是否有遗漏的步骤,比如某些单片机可能有的看门狗初始化或硬件自检过程,但根据提供的引用,可能不需要深入这些细节。确保语言简洁明了,符合中文表达,避免使用Markdown格式,用自然的分段和编号来组织内容。 最后,生成相关问题时要围绕启动流程的各个部分,比如启动文件的作用、堆栈初始化、中断向量表等,帮助用户进一步理解可能遇到的疑问点。</think>### 单片机启动流程解析 单片机启动流程是系统从加电复位到执行用户程序的初始化过程,其核心步骤可概括如下: 1. **硬件复位** 上电后,硬件复位电路触发,程序计数器(PC)指向复位向量地址(通常为`0x00000000`或特定地址)。此处存放复位处理函数的入口地址[^2]。 2. **启动文件初始化(以STM32为例)** - **堆栈分配**:分配并初始化栈(Stack)和堆(Heap)空间,栈用于函数调用和局部变量存储,堆用于动态内存分配[^2]。 - **中断向量表**:定义中断向量表,每个中断对应一个异常处理程序的入口地址。例如: ```c __Vectors DCD __initial_sp ; 栈顶地址 DCD Reset_Handler ; 复位处理函数 DCD NMI_Handler ; NMI中断处理 ... ; 其他中断向量 ``` - **初始化.data和.bss段**: - `.data`段(已初始化的全局变量)从Flash复制到RAM。 - `.bss`段(未初始化的静态变量)清零。 3. **系统时钟配置** 调用`SystemInit()`函数初始化时钟源(如HSI、HSE),配置PLL生成系统主频(如72MHz)。 4. **跳转至用户程序** 最终通过`__main`或直接调用`main()`函数进入用户代码。 ### 启动流程图示说明(文字描述) ``` 加电复位 → 复位向量跳转 → 初始化堆栈 → 复制.data段 → 清零.bss段 → 配置系统时钟 → 执行main() ``` ### 相关问题 1. 启动文件中中断向量表的作用是什么?如何自定义中断服务函数? 2. 堆(Heap)和栈(Stack)在单片机运行时有什么区别? 3. 如何验证.data段和.bss段的初始化是否成功? 4. 若系统时钟配置失败会导致哪些问题? [^1]: 参考启动文件与硬件初始化关系的示例代码和仿真流程。 : 基于STM32启动文件的核心功能描述。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值