1. Systick定时器:Cortex-M内核的精妙设计
如果你正在学习STM32,肯定会遇到Systick这个定时器。它不像其他外设那样由ST公司设计,而是ARM公司直接内置在Cortex-M内核中的,所有基于Cortex-M3/M4内核的MCU都自带这个定时器。我刚开始接触时也觉得有点绕,但用多了才发现它的精妙之处。
Systick最大的特点就是与NVIC紧密捆绑,这意味着它的中断响应非常高效。在实际项目中,我主要用Systick做两件事:一是裸机开发时的精准延时,替代那些粗糙的for循环延时;二是为RTOS提供心跳时钟,比如FreeRTOS的任务调度就依赖Systick的节拍。记得第一次用Systick实现毫秒级延时时,感觉代码终于摆脱了"盲等"的原始状态。
Systick是一个24位向下递减的计数器,这意味着它的最大计数值是2^24(约1677万)。虽然比不上32位定时器的范围,但对于微秒到秒级的定时需求完全够用。它的时钟源可以选择内核时钟(HCLK)或内核时钟的8分频(HCLK/8),这个选择直接影响定时精度,后面我会详细解释。
2. 深入STM32时钟树:理解Systick的时钟来源
要真正掌握Systick,必须理解STM32的时钟树。我第一次看时钟树时也是一头雾水,但搞明白后才发现STM32的时钟设计真的很巧妙。
STM32有五个主要的时钟源:
- HSI(高速内部时钟):16MHz的RC振荡器,精度一般但功耗低
- HSE(高速外部时钟):接外部晶振,通常8-25MHz,精度高
- LSI(低速内部时钟):32kHz的RC振荡器,用于看门狗和RTC
- LSE(低速外部时钟):32.768kHz晶振,专门为RTC设计
- PLL(锁相环):可以对其他时钟进行倍频,得到更高频率
以STM32F407为例,默认使用8MHz的HSE作为时钟源,通过PLL倍频到168MHz。PLL的配置参数很关键:PLL_M=8,PLL_N=336,PPL_P=2。计算公式是:系统时钟 = (HSE / PLL_M) * PLL_N / PLL


1万+

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



