【总结】单片机重点知识总结记录之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的定时。



相关文章
|
4月前
|
算法 物联网 芯片
基于STM32和51单片机的8位全彩流水灯程序模板
基于STM32和51单片机的8位全彩流水灯程序模板
|
6月前
|
传感器 数据采集 人工智能
基于STM32单片机的智能晾衣架设计与实现【开源免费】
随着智能家居的发展,传统晾衣架已经难以满足现代家庭对便捷、智能化的需求。基于STM32单片机的智能晾衣架能够实现自动升降、光照检测、风干控制、远程控制等功能,为家庭用户提供更智能、更舒适的晾晒体验。本项目以STM32F103C8T6为核心控制器,通过电机驱动模块、光照传感器、温湿度传感器、蓝牙/Wi-Fi通信模块,实现晾衣架的自动化与远程控制。
基于STM32单片机的智能晾衣架设计与实现【开源免费】
|
4月前
|
算法
基于STM32定时器外部计数模式实现方波频率测量
基于STM32定时器外部计数模式实现方波频率测量
|
传感器
stm32f407探索者开发板(二十二)——通用定时器基本原理讲解
stm32f407探索者开发板(二十二)——通用定时器基本原理讲解
1677 0
|
芯片
stm32f407探索者开发板(十二)——Systick滴答定时器-延时函数讲解
stm32f407探索者开发板(十二)——Systick滴答定时器-延时函数讲解
1683 0
|
传感器 监控 JavaScript
千套单片机\stm32毕设课设题目及资料案列-干货分享
为帮助电子工程领域的学习者顺利毕业或掌握更多专业知识,我们精心整理了一系列单片机和STM32相关的题目及资料案例。这些资源覆盖了从毕业设计到课程设计的各个方面,包括但不限于智能小车、温度控制系统、无线通信、智能家居等多个领域。每项设计都配有详细的原理图、仿真图以及完整的文档资料,旨在帮助学生深入理解理论知识的同时,提高实际动手操作能力。无论是初学者还是有一定基础的学生,都能从中找到适合自己的项目进行实践探索。
4261 8
【51单片机】通过定时器中断 在8位数码管显示时间
【51单片机】通过定时器中断 在8位数码管显示时间
440 2
|
算法
51单片机不用定时器的数码管倒计时
51单片机不用定时器的数码管倒计时
252 0
STM32CubeMX 定时器
STM32CubeMX 定时器
736 0
stm32f407探索者开发板(二十三)——定时器中断实验
stm32f407探索者开发板(二十三)——定时器中断实验
2136 0