STM32F103ZET6时钟配置避坑指南:从启动文件到72MHz稳定运行的完整流程
对于嵌入式开发者而言,时钟系统就像人体心脏,为整个芯片提供动力。但很多人在STM32F103ZET6项目中会遇到这样的场景:代码逻辑没问题,外设却工作异常;系统运行一段时间后莫名重启;ADC采样值飘忽不定...这些问题的罪魁祸首,往往隐藏在时钟配置的细节中。
1. 启动文件与时钟初始化全流程解析
当按下复位键时,STM32的执行顺序并非直接从main函数开始。实际执行路径是:
- 硬件复位后PC指针指向0x00000000(启动文件定义的复位向量)
- 执行
Reset_Handler中的初始化操作 - 调用
SystemInit()进行时钟系统预配置 - 最后跳转到main函数
关键点在于 SystemInit() 的实现 。标准库中的这个函数会完成以下关键操作:
void SystemInit(void)
{
// 复位时钟相关寄存器
RCC->CR |= (uint32_t)0x00000001; // 使能HSI
RCC->CFGR &= (uint32_t)0xF8FF0000; // 复位时钟配置
RCC->CR &= (uint32_t)0xFEF6FFFF; // 关闭HSE/PLL/CSS
RCC->CR &= (uint32_t)0xFFFBFFFF; // 关闭HSE旁路
RCC->CFGR &= (uint32_t)0xFF80FFFF; // 复位PLL配置
RCC->CIR = 0x009F0000; // 清除所有时钟中断标志
// 调用时钟设置函数
SetSysClock();
}


1004

被折叠的 条评论
为什么被折叠?



