正点原子STM32新手避坑指南:delay.c、sys.c、usart.c深度解析
刚拿到正点原子STM32开发板的新手,在跑通第一个LED闪烁例程后,往往会面临一个共同困惑:SYSTEM文件夹下那三个神秘文件——delay.c、sys.c和usart.c到底该怎么用?这些文件看似简单,却暗藏诸多新手容易踩的坑。本文将带你深入理解这三个核心文件的设计逻辑,避开常见陷阱,掌握正确使用方法。
1. delay.c:精准延时的艺术与陷阱
1.1 延时函数的工作原理
delay.c的核心是通过SysTick定时器实现微秒(us)和毫秒(ms)级别的延时。SysTick是Cortex-M内核自带的一个24位递减计数器,时钟源通常选择HCLK的1/8(默认72MHz系统时钟下为9MHz)。
关键初始化代码解析:
c复制void delay_init() {
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
fac_us = SystemCoreClock / 8000000; // 72MHz/8=9MHz → 9
fac_ms = (u16)fac_us * 1000; // 9000
}
常见错误1:在系统时钟变更后未重新初始化delay.c。例如从72MHz切换到36MHz时,必须重新调用delay_init(),否则所有延时都将不准确。
1.2 延时函数的限制与替代方案
delay_ms()函数存在一个隐蔽限制:最大延时约1864ms(72MHz时)。这是因为SysTick->LOAD是24位寄存器。需要更长延时可使用:
c复制// 分段延时实现秒级延时
void delay_s(u8 s) {
for(u8 i=0; i<10; i++)
delay_ms(s*100);
}
性能对比表:
| 延时方式 | 精度 | 最大延时 | CPU占用 |
|---|---|---|---|
| delay_us | 高 | 无实际限制 | 100% |
| delay_ms | 中 | ~1864ms | 100% |
| HAL_ |
