STM32 芯片启动过程

STM32芯片的启动过程是微控制器从复位到执行用户程序main函数之间的一系列初始化操作。这个过程对于确保系统的可靠性和性能至关重要。本文将详细解析STM32的启动过程,包括上电复位阶段、Bootloader阶段,以及从复位向量到应用程序启动的整个过程。

一、上电复位阶段

STM32启动过程的第一阶段是上电复位阶段,它在设备上电或复位后立即开始。此阶段的主要目的是初始化硬件和准备系统以运行应用程序。

1.1 复位向量和复位入口点

当STM32上电或复位时,处理器会从复位向量开始执行。复位向量是一个存储在固定地址(通常为0x00000000)的32位值,它指向复位入口点。复位入口点是程序执行开始的地方。

对于STM32F4系列微控制器,复位向量默认指向地址0x00000004,其中包含一条跳转指令,将执行跳转到实际复位入口点地址0x00000008。

1.2 系统时钟初始化

系统时钟是STM32操作所必需的,因为它为处理器和外设提供时序参考。在复位后,系统时钟配置为默认值,通常是内部高速时钟(HSI),频率为16 MHz。为了提高性能和功耗效率,通常需要初始化系统时钟以使用外部时钟源,例如晶体振荡器或外部时钟输入。

系统时钟初始化涉及以下步骤:

  • 使能时钟安全系统(CSS),以允许修改时钟配置。
  • 配置时钟源,例如外部晶体振荡器或外部时钟输入。
  • 配置时钟预分频器和倍频器,以获得所需的系统时钟频率。
  • 更新系统时钟寄存器,以使新的时钟配置生效。
c 复制代码
// 使能时钟安全系统
RCC->CR |= RCC_CR_CSSON;

// 配置时钟源为外部晶体振荡器
RCC->CFGR |= RCC_CFGR_SW_HSE;

// 等待时钟源切换完成
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSE);

// 配置时钟预分频器和倍频器
RCC->CFGR |= RCC_CFGR_PPRE1_DIV2 | RCC_CFGR_PPRE2_DIV4 | RCC_CFGR_PLLMUL12;

// 更新系统时钟寄存器
RCC->CR |= RCC_CR_PLLON;

1.3 外设初始化

在初始化系统时钟之后,需要初始化必要的外部设备,例如GPIO、定时器和UART。外设初始化涉及以下步骤:

  • 使能外设时钟。
  • 配置外设寄存器以设置所需的模式和功能。
  • 初始化中断,如果外设支持中断。
c 复制代码
// 使能GPIOA时钟
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;

// 配置GPIOA引脚0为输出模式
GPIOA->MODER |= GPIO_MODER_MODE0_0;

// 配置GPIOA引脚0为推挽输出
GPIOA->OTYPER &= ~GPIO_OTYPER_OT0;

// 配置GPIOA引脚0为高电平
GPIOA->BSRR |= GPIO_BSRR_BS0;

二、Bootloader阶段

2.1 Bootloader的启动和加载

当STM32从上电复位阶段进入Bootloader阶段时,会首先跳转到Bootloader的复位向量地址。Bootloader的复位向量通常位于STM32内部Flash存储器的特定区域,由芯片制造商预先定义。Bootloader的加载过程通常涉及以下步骤:

  1. 从指定地址读取Bootloader代码。
  2. 将Bootloader代码加载到RAM中。
  3. 跳转到Bootloader入口点。

2.2 Bootloader的功能和流程

Bootloader的主要功能是为应用程序提供一个加载和执行的环境。Bootloader的典型流程如下:

  1. 初始化硬件:Bootloader首先初始化必要的硬件外设,例如串口、时钟和存储器。
  2. 检测加载请求:Bootloader通过监控特定输入(例如串口或USB)来检测来自外部设备的加载请求。
  3. 接收和验证应用程序代码:如果检测到加载请求,Bootloader会接收来自外部设备的应用程序代码并对其进行验证。
  4. 将应用程序代码写入存储器:验证通过后,Bootloader将应用程序代码写入Flash存储器或其他永久存储器中。
  5. 启动应用程序:一旦应用程序代码写入存储器,Bootloader会跳转到应用程序的入口点,开始执行应用程序。

三、总结

STM32的启动过程包括上电复位、系统时钟初始化、外设初始化、Bootloader加载和应用程序启动等多个阶段。这个过程确保了微控制器从一个已知的状态开始执行,为应用程序提供了一个稳定的运行环境。理解启动过程对于嵌入式系统开发和调试至关重要。通过分析启动文件和启动模式,开发者可以更好地控制微控制器的行为,优化系统性能,并确保系统的可靠性。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

相关推荐
美式小田2 小时前
单片机学习笔记 9. 8×8LED点阵屏
笔记·单片机·嵌入式硬件·学习
兰_博2 小时前
51单片机-独立按键与数码管联动
单片机·嵌入式硬件·51单片机
时光の尘3 小时前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
嵌入式大圣4 小时前
单片机结合OpenCV
单片机·嵌入式硬件·opencv
日晨难再6 小时前
嵌入式:STM32的启动(Startup)文件解析
stm32·单片机·嵌入式硬件
yufengxinpian6 小时前
集成了高性能ARM Cortex-M0+处理器的一款SimpleLink 2.4 GHz无线模块-RF-BM-2340B1
单片机·嵌入式硬件·音视频·智能硬件
__基本操作__7 小时前
历遍单片机下的IIC设备[ESP--0]
单片机·嵌入式硬件
网易独家音乐人Mike Zhou13 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
zy张起灵13 小时前
48v72v-100v转12v 10A大功率转换电源方案CSM3100SK
经验分享·嵌入式硬件·硬件工程
PegasusYu16 小时前
STM32CUBEIDE FreeRTOS操作教程(九):eventgroup事件标志组
stm32·教程·rtos·stm32cubeide·free-rtos·eventgroup·时间标志组