STM32之定时器

发布于:2025-05-21 ⋅ 阅读:(15) ⋅ 点赞:(0)

一、内核嘀嗒定时器的原理与应用

  • 基本概念

定时器是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有多种时钟源(用于提供时钟信号),时钟源一般可以分为两类:内部时钟源 + 外部时钟源,每一种时钟源的频率都是各不相同的。

  1. 高速外部时钟

  1. 高速内部时钟

  1. 低速外部时钟

  1. 低速内部时钟

  1. PLL倍频锁相环

通过阅读ST公司提供的函数库的帮助手册,可以知道ST公司默认使用的高速外部时钟的频率是25MHZ,并且PLL_M = 25,PLL_N = 336,PLL_P = 2, 芯片主频 = HSE / M * N / P = 168M

开发板默认使用的HSE时钟源的频率是8MHZ,为了能够计算出168MHZ的芯片主频,所以需要修改PLL_M的值,所以需要修改system_stm32f4xx.c文件,并且还需要修改stm32f4xx.h头文件中HSE_VALUE宏定义的值。

  1. 修改system_stm32f4xx.c源文件的316行,必须把宏定义PLL_M的值从25修改为8 !!

  1. 修改stm32f4xx.h头文件中HSE_VALUE宏定义的值,修改文件的123行,把25修改为8

这两个位置修改完成后,PLL倍频锁相环的参数才是正确的,所以计算出来的频率就是正确的。

  • 时钟选择

通过M3内核文档可以知道Systick定时器有2个时钟源,一个是内部时钟(FCLK,指的是MCU的自由运行时钟,就是168MHZ),一个是外部时钟(STCLK,目前STM32F407ZET6这颗MCU是把AHB总线的时钟频率进行8分频,就是168MHZ /8 = 21MHZ)

  1. 内部时钟

如果选择使用内部时钟(168MHZ)作为系统嘀嗒定时器的时钟源,则嘀嗒定时器的计数周期:1000000us生成168000000个脉冲,意味着 1us可以生成168个脉冲,所以计数周期等于1/168us。

  1. 外部时钟

如果选择使用外部时钟(21MHZ)作为系统嘀嗒定时器的时钟源,则嘀嗒定时器的计数周期:1000000us生成21000000个脉冲,意味着 1us可以生成21个脉冲,所以计数周期等于1/21us。

  • 控制方式

  • 方案选择
  1. 中断的方式(适合RTOS)

  1. 寄存器方式(适合裸机)


网站公告

今日签到

点亮在社区的每一天
去签到