MCU初始化流程——从上电到main()之间

本文详细解析了MCU上电后的启动流程,包括ROM和RAM地址空间分配,堆栈生长方向,以及Cortex-M0内核的初始化过程。介绍了复位中断向量、__main函数的作用,以及__scatterload和__rt_entry函数如何协助完成内存布局和堆栈初始化,最终跳转至C语言的main函数。

说明:

  • 以下介绍示例的MCU地址空间如下:

            ROM空间为:0x0000 0000 – 0x0000 8000   

            RAM空间为:0x2000 0000 – 0x2000 2000   

             

  • 堆栈(SP)生长方向为 递减;
  • 小端模式  
  • Cortex-M0内核

正文:

一、MCU上电后,硬件设计保证,自动从地址0x00开始取数据

        初始化文件中代码设置 如下:

### MCU初始化流程 MCU 的上启动流程是一个复杂的过程,涉及硬件配置、寄存器设置以及软件初始化等多个阶段。以下是基于提供的参考资料和专业知识整理的 MCUs 启动过程详解。 #### 1. 复位路触发 当压达到稳定状态时,复位信号被释放,标志着 MCU 开始执行初始操作[^1]。此过程中,外部晶振或内部 RC 震荡器会被启用作为系统的时钟源。 #### 2. 引导模式选择 大多数现代 MCU 提供多种引导加载方式,具体取决于特定引脚的状态(如 BOOT0 和 BOOT1)。例如,在 GD32W515 中: - **BOOT0=0, BOOT1=x**: 进入主 Flash 存储区运行用户程序 (地址 `0x08000000`)。 - **BOOT0=1, BOOT1=0**: 使用 Bootloader 或 ROM 区域中的固件 (地址 `0x0BF40000`)。 - **BOOT0=1, BOOT1=1**: 执行 SRAM 内部的数据或调试代码 (地址 `0x0A000000`)[^3]。 对于 STM32 而言,类似的机制也存在,并允许开发者通过这些选项决定是从内置闪存还是其他介质加载应用程序[^4]。 #### 3. 初始化向量表定位 一旦选定合适的启动路径后,CPU 将读取重置矢量位置处的内容以获取堆栈指针初值及入口点地址。通常情况下,默认中断向量位于闪存起始部分;然而某些架构支持重新映射该表格至 RAM 来提高性能[^2]。 #### 4. CPU 寄存器与外设配置 紧接着完成必要的低级设定动作,比如定义 SP(Stack Pointer), 设置 MSP(Main Stack Pointer) 或 PSP(Process Stack Pointer),并跳转到 C runtime environment 准备调用 main() 函数之前的一系列准备工作包括但不限于零化 BSS 段变量、复制已初始化全局/静态对象副本等任务均在此期间由 startup.s 文件里的汇编指令实现。 #### 5. 用户自定义初始化 最后一步则是进入标准C/C++环境下的常规处理逻辑——即从 main() 方法开始正式展开业务功能实现。 ```c int main(void){ // 应用层代码... } ``` 以上便是典型的 MCU 自加直至运行首个有效语句之间的主要环节概述。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值