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 小时前
【51单片机用数码管显示流水灯的种类是按钮控制数码管加一和流水灯】2022-6-14
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机
智商偏低8 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen9 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
森焱森11 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白11 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D12 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术15 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt16 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘16 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang16 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c