ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

MCU 上电启动流程

MCU 上电启动流程 简化版MCU上电流程1. 外部电源接入芯片 VDD内部 LDO、模拟电路开始上电2. POR上电复位电压低于阈值时 持续复位3. 内核、外设、寄存器复位和 flash、RAM 就绪4. 等待HIS稳定5. 锁定boot值6. 上述操作完成后复位信号NRST拉高CPU内核退出复位硬件自动开始取指。MCU软件启动流程1. 上电硬件自动加载 主栈指针MSP2. 跳转到复位中断函数3. 初始化数据段.data、清.bss段4. 进入 main5. 用户初始化时钟、外设6. 进入主循环程序常见问题1. 数据段和 BSS 段是什么- .data 段有初始值的全局 / 静态变量需要从flash复制初始值- .bss 段没初始化的全局 / 静态变量启动时必须清 02. 启动文件 startup.s 作用startup.s汇编文件内部包含Reset_Handler 复位函数负责最早期硬件与 C 语言环境初始化没有它main函数跑不起来。3. 程序从哪里开始执行不是从 main 开始是从 Reset_Handler 复位函数开始再跳 main4. 什么是MSPMSP 本质是一个32位寄存器存放 栈内存的顶端地址。MSP 指向的栈 作用是 保存临时数据、函数局部变量。上电必须先初始化 MSP否则没有MSP指向的栈CPU无法调用函数、响应中断程序根本跑不起来关键特点栈是向下生长因此MSP 初始值是栈最高地址使用时地址不断减小普通版一、硬件上电时序1. 外部电源接入芯片 VDD/VSS内部 LDO、模拟电路开始上电2. 电源监控模块POR工作- POR上电复位电压低于阈值时持续输出复位信号3. 内核、外设、寄存器复位4. flash、RAM 就绪上电后可以稳定读写5. 等待HIS稳定6. 复位结束上述操作完成后需要额外的delay时间复位信号NRST拉高CPU内核退出复位硬件自动开始取指。delay时间解释一般上电时间很快所以POR复位信号很快就会释放但是芯片还需要复位内核、外设等模块等待模拟IP的稳定LDO、HIS、以及等待加载FLASH的OTP数据等。因此需要先把CPU内核复位拉低等待准备好后再释放NRST。二、硬件自动取指1. 硬件读取 BOOT0/BOOT1引脚电平选择向量表起始基地址- BOOT00向量表基址 0x08000000主 Flash 启动- BOOT01向量表基址 0x20000000SRAM启动或系统存储器BOOTloader2. 硬件从选中的基址读 0 偏移 MSP0x4 偏移 Reset_Handler 地址例如从flash启动Flash起始地址0x0800_0000也是中断向量表的基地址。地址0x08000000存放的是栈顶地址MSP即主栈指针地址0x08000004存放的是复位函数Reset_Handler的入口地址CPU内核复位结束后固定操作1. 从中断向量表的基地址0x08000000读取4字节作为主栈指针MSP2. 从地址0x08000004读取4字节作为复位函数Reset_Handler的入口地址写入程序计数器 PC3. CPU跳转到复位函数Reset_Handler入口地址正式进入软件启动阶段。三、软件启动全过程分为复位函数Reset_Handler → C库初始化 → main 函数阶段1执行startup.s里的复位函数Reset_Handler注复位中断服务函数是CPU上电执行的第一条代码执行复位函数Reset_Handler包含以下步骤1. .bss段 清零没初始化的全局 / 静态变量启动时必须清 02. .data段 数据初始化有初始值的全局 / 静态变量需要从flash复制初始值给全局变量赋初始值3. 跳转到标准库入口 __mainC 库初始化入口阶段2C标准库初始化__main编译器自带完成 C 标准库相关初始化随后调用用户 main 函数。阶段3用户main函数初始化应用层软件1. 初始化外设配置 RCC开启HSE/PLL、配置AHB/APB分频确定系统主频以及其他外设。2. 中断配置EXTI、NVIC 优先级、中断屏蔽3. 低功耗、定时器、串口、ADC 等外设初始化4. 主循环 while (1)阶段4程序运行中断抢占程序正常跑主循环外设产生中断请求送 NVIC打断主流程跳转到对应中断服务函数若进入 WFI/WFE 休眠由 EXTI、定时器等外设唤醒 CPU恢复运行。
返回列表