很多“一上电就跑飞 / 外设波特率不对”的问题,根因在启动文件与 SystemInit,而不是业务代码。

典型流程(以 Cortex-M 为例)
1. 复位向量:SP 初值、Reset_Handler。
2. 拷贝 .data、清零 .bss,再调 SystemInit(配置 FLASH 等待、时钟树)。
3. 进入 __libc_init_array / main。

时钟相关
- HSE 起振失败时若未做超时回退,会卡在死循环。
- USART 波特率依赖 APB 时钟;改完 PLL 后务必同步改外设时钟使能与重算波特率。
- SysTick 若按 SystemCoreClock 配置,改频后要更新 SystemCoreClock 变量。

建议:用 CubeMX/厂商工具生成时钟树后,在调试器里核对 RCC 寄存器与实际 SYSCLK;对外部晶振留起振超时与 HSI 回退。