【总结】单片机重点知识总结记录之STM32滴答定时器(二)

简介: 滴答定时器

二.滴答定时器

最近在移植某LCD屏的驱动时,对源码产生了一些疑问,索性一次性查找齐全资料写一篇笔记备忘。

代码大致如下:

#include "stm32f4xx_hal.h"

#include "delay.h"  

static u8  fac_us=0;//us延时倍乘数

static u16 fac_ms=0;//ms延时倍乘数

//初始化延迟函数

//SYSTICK的时钟固定为HCLK时钟的1/8

//SYSCLK:系统时钟

void delay_init(u8 SYSCLK)

{

SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟  HCLK/8

fac_us=SYSCLK/8;  

fac_ms=(u16)fac_us*1000;

/*

对上面的内容进行解释:

 0xfffffffb换算为二进制得11111111111111111111111111111011

 即把SysTick->CTRL的第2位置0

 查看Cortex-M手册为以下内容:

 ----------------------------------------------------------------------------------------

  Bits  Name   Type Reset/Value  Description

  2   CLKSOURCE  R/W  0      0=External reference clock (STCLK)

             1=Use core clock

 ----------------------------------------------------------------------------------------

 即此位置0,使用外部参考时钟,即使用外部晶振作为时钟参考

*/

 

}            

//延时nms

//注意nms的范围

//SysTick->LOAD为24位寄存器,所以,最大延时为:

//nms<=0xffffff*8*1000/SYSCLK

//SYSCLK单位为Hz,nms单位为ms

//对72M条件下,nms<=1864  

void delay_ms(u16 nms)

{          

u32 temp;      

SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)

SysTick->VAL =0x00;           //清空计数器

SysTick->CTRL=0x01 ;          //开始倒数  

do

{

 temp=SysTick->CTRL;

}

while(temp&0x01&&!(temp&(1<<16)));//等待时间到达    

SysTick->CTRL=0x00;       //关闭计数器

SysTick->VAL =0X00;       //清空计数器        

}    

//延时nus

//nus为要延时的us数.                  

void delay_us(u32 nus)

{  

u32 temp;        

SysTick->LOAD=nus*fac_us; //时间加载      

SysTick->VAL=0x00;        //清空计数器

SysTick->CTRL=0x01 ;      //开始倒数    

do

{

 temp=SysTick->CTRL;

}

while(temp&0x01&&!(temp&(1<<16)));//等待时间到达    

SysTick->CTRL=0x00;       //关闭计数器

SysTick->VAL =0X00;       //清空计数器  

}

  这里我对delay_init()中的fac_us=SYSCLK/8;这一句产生了疑问。例程主函数中调用初始化传入的是delay_init(72);明显为72MHz,这里的除8是为什么呢?

       带着这个疑问,我查了Cortex-M内核手册以及参考了网上的一些帖子,算是大致弄明白了。

       首先,SysTick是内核中的一个系统定时器,又名系统嘀嗒定时器,是一个24位的倒数计数器。

最值得注意的是,Systick 的信号来源于系统时钟,可选不分频与八分频。以STM32F103举例,不分频时为72MHz,八分频为9MHz。

       这里以其他帖子看到的其他芯片为例:

       在《STM32F10xxx参考手册(中文)》中有以下这一句话:

       看到这里我们大概就明白了 ,fac_us=SYSCLK/8;这一句将72传入得72/8=9,9*(1/9 000 000) = 1us。总之,SysTick的实际频率应该就为72MHz的八分之一,即9MHz,我们对其进行处理之后得到一个fac_us可以精确进行1us计时的SysTick->LOAD寄存器的系数,当想延时n us时可以SysTick->LOAD=nus*fac_us;进行精确延时。


        补充:这里可以将fac_ms理解为手册里提到的校准值,乘上这个系数之后得到我们想要的规定的时间,具体到这个例子里就是1ms和1us的定时。



相关文章
|
8天前
|
传感器 监控 JavaScript
千套单片机\stm32毕设课设题目及资料案列-干货分享
为帮助电子工程领域的学习者顺利毕业或掌握更多专业知识,我们精心整理了一系列单片机和STM32相关的题目及资料案例。这些资源覆盖了从毕业设计到课程设计的各个方面,包括但不限于智能小车、温度控制系统、无线通信、智能家居等多个领域。每项设计都配有详细的原理图、仿真图以及完整的文档资料,旨在帮助学生深入理解理论知识的同时,提高实际动手操作能力。无论是初学者还是有一定基础的学生,都能从中找到适合自己的项目进行实践探索。
28 8
|
4月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
326 2
|
3月前
|
传感器
stm32f407探索者开发板(二十二)——通用定时器基本原理讲解
stm32f407探索者开发板(二十二)——通用定时器基本原理讲解
172 0
|
3月前
|
芯片
stm32f407探索者开发板(十二)——Systick滴答定时器-延时函数讲解
stm32f407探索者开发板(十二)——Systick滴答定时器-延时函数讲解
154 0
|
2月前
【51单片机】通过定时器中断 在8位数码管显示时间
【51单片机】通过定时器中断 在8位数码管显示时间
|
2月前
|
算法
51单片机不用定时器的数码管倒计时
51单片机不用定时器的数码管倒计时
|
4月前
|
芯片
【STM32】STM32简述定时器
【STM32】STM32简述定时器
|
3月前
STM32CubeMX 定时器
STM32CubeMX 定时器
105 0
|
3月前
stm32f407探索者开发板(二十三)——定时器中断实验
stm32f407探索者开发板(二十三)——定时器中断实验
172 0
|
3月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
536 0