STM32的系统定时器
定时器是STM32中常用的外设,一般定时器的基本功能就是定时,而在Cortex M3/M4内核中也包含一个简单的定时器,就是系统嘀嗒定时器(Systick),它是属于CM4内核的一个外设,内嵌在NVIC中,所有基于Cortex-M3/M4内核的MCU中都包含这个Systick定时器,所以在不同的硬件中移植起来非常方便。
由于Systick定时器属于CM4内核,所以大家在STM32F4中文参考手册中是找不到关于Systick定时器的相关信息,大家可以在CM3权威指南或者Cortex M3/M4权威指南中找到。

基本应用
(1)裸机开发:编写专门的延时函数,实现微秒、毫秒级别的延时,如作为闹钟或者延时。
(2)操作系统:可以为RTOS实时操作系统的任务调度提供时钟节拍,RTOS的架构是并行的。
时钟分析
如果打算利用Systick定时器进行定时,则必须清楚Systick定时器的时钟频率,而定时器是挂载在总线下,而不同的总线的频率是不同的,而总线的频率是由时钟提供,而时钟的提供者又各不相同,所以必须要提前了解时钟源的区别。
一般情况下一款MCU有多种时钟源(用于提供时钟信号),时钟源一般可以分为两类:内部时钟源、外部时钟源,每一种时钟源的频率都是各不相同的。
不清楚时钟源的频率,就无法计算总线的频率,从而无法计算挂载在总线下外设的频率。

可以看到,MCU提供5种时钟源,分别是HSI、HSE、LSI、LSE、PLL,每种时钟源的频率都是不同的。
(1)HSE高速外部时钟

(2)HSI高速内部时钟

(3)LSE低速外部时钟

(4)LSI低速内部时钟

(5)PLL倍频锁相环

由于PLL锁相环是需要HSE高速外部时钟提供时钟信号,并且PLL可以把较低的HSE时钟频率进行放大,则需要用户修改工程中的PLL参数以及修改工程中的HSE_VALUE
(1)修改system_stm32f4xx.c的316行,需要把PLL_M的值从25修改为8,代码如下所示:

(2)修改stm32f4xx.h的123行,需要把宏HSE_VALUE的值从25修改为8,代码如下所示:

MCU主频的计算 = ( HSE_VALUE / PLL_M * PLL_N ) / PLL_P = (8MHz / 8 * 336) / 2 = 168MHz !!!!
时钟选择
通过M3内核文档可以知道Systick定时器有2个时钟源,一个是内部时钟(FCLK),一个是外部时钟(STCLK)

可以知道,Systick定时器的内部时钟的频率是168MHZ,外部时钟的频率是168MHZ/8 = 21MHZ 。
(1)内部时钟
如果选择使用内部时钟(168MHZ)作为系统嘀嗒定时器的时钟源,则嘀嗒定时器的计数周期:1000000us生成168000000个脉冲,意味着 1us可以生成168个脉冲,所以计数周期等于1/168us。
(2)外部时钟
如果选择使用外部时钟(21MHZ)作为系统嘀嗒定时器的时钟源,则嘀嗒定时器的计数周期:1000000us生成21000000个脉冲,意味着 1us可以生成21个脉冲,所以计数周期等于1/21us。
控制方式



作者:bbzhu04@gmail.com ,多有不妥之处,望批评指正
本文原创,欢迎转载;转载请在文章显著位置标明原文链接: href="https://www.cnblogs.com/zhubb/p/23347503"
保留所有权限,未经许可禁止篡改、商用发布。

浙公网安备 33010602011771号