STM32系统滴答定时器SysTick实现精确ms和us延时

这篇具有很好参考价值的文章主要介绍了STM32系统滴答定时器SysTick实现精确ms和us延时。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

时间记录:2023/12/11
一、时间的计算
STM32F103C8T6单片机为例,系统时钟为72MHz,则一个时钟周期为(1/72M)秒,即1/72us
二、寄存器介绍
(1)CTRL控制及状态寄存器

位段 名称 描述
16 COUNTFLAG 当计数到0时,该位置为1,当读取该位时,自动清零
2 CLKSOURCE 值为0时选择外部时钟源,值为1时选择内核时钟
1 TICKINT 值为1时,计数到0产生SysTick中断,值为0时,计数到0无动作
0 ENABLE SysTick使能位

(2)LOAD重装载数值寄存器

位段 名称 描述
23:0 RELOAD 当计数到零时,自动加载的计数值

(3)VAL当前数值寄存器

位段 名称 描述
23:0 CURRENT 读取时返回当前倒计数的值,向其中写入值时,自动清零并且会清除CTRL寄存器的COUNTFLAG位

三、配置步骤
3.1 配置时钟源
3.2 计算延时1us和1ms的时钟周期
3.3 装入自动重装载值
3.4 向当前值寄存器写入值
3.5 使能SysTick开始计数
3.6 循环判断是否到达计数值
3.7 清除SysTick使能位停止计数
四、代码展示
头文件(.h文件)

#ifndef __DELAY_H__
#define __DELAY_H__
#include "stm32f10x.h"

static int fac_us=0;
static int fac_ms=0;

//滴答定时器初始化
void vDelayInit(void);
//计时微妙
void vDelayUs(u32 nus);
//计时毫秒
void vDelayMs(u16 nms);

#endif

源文件(.c文件)文章来源地址https://www.toymoban.com/news/detail-821351.html

#include "delay.h"

void vDelayInit(void)
{
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//配置时钟源为外部时钟9MHz,一个时钟周期时间为1/9us
    fac_us=SystemCoreClock/8/1000000;//计算1us的计数周期,9个周期,即9*1/9=1us
    fac_ms=fac_us*1000;//计算1ms的计数周期
}

void vDelayUs(u32 nus)
{
    u32 temp;
    SysTick->LOAD = fac_us*nus;     //自动重装载值寄存器,当计数到0时,将被重装载的值
    SysTick->VAL = 0x00;            //当前值寄存器,返回当前倒计数的值,写它则使之清零
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;          //使能,开始计数
    do{
        temp=SysTick->CTRL;
    }while((temp&0x01)&&!(temp&(1<<16)));   //使能位没有清零,并且COUNTFLAG=0(没有数完)
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;          //失能,停止计数
    SysTick->VAL = 0x00;
}

void vDelayMs(u16 nms)
{
    if(nms>1864){//由于是24位寄存器,最大计数为0xFFFFFF=16777215/9000=1864
        return;
    }
    
    u32 temp;
    SysTick->LOAD = (u32)fac_ms*nms;     //自动重装载值寄存器,当计数到0时,将被重装载的值
    SysTick->VAL = 0x00;            //当前值寄存器,返回当前倒计数的值,写它则使之清零
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;          //使能,开始计数
    do{
        temp=SysTick->CTRL;
    }while((temp&0x01)&&!(temp&(1<<16)));   //使能位没有清零,并且COUNTFLAG=0(没有数完)
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;          //失能,停止计数
    SysTick->VAL = 0x00;
}

到了这里,关于STM32系统滴答定时器SysTick实现精确ms和us延时的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【致敬未来的攻城狮计划】— 连续打卡第十六天:FSP固件库系统定时器(滴答定时器SysTick)每2秒LED闪烁一次

    1.连续打卡第一天:提前对CPK_RA2E1是瑞萨RA系列开发板的初体验,了解一下 2.开发环境的选择和调试(从零开始,加油) 3.欲速则不达,今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.Keil配置使用(使用 RASC 生成 Keil 工程) 6.Keil配置使用(使用 RASC 生成 Keil 工程)

    2024年02月01日
    浏览(79)
  • 2.STM32 SysTick定时器

    一、SysTick定时器概念 SysTick定时器是一种在嵌入式系统中常用的定时器,它是由ARM Cortex-M处理器核内置的定时器。SysTick定时器具有精简、低功耗和易用的特点,可以用来实现各种定时、延时和时间基准等功能。 二、SysTick定时器的主要特性   1. 单调递增计数器:SysTick定时器

    2024年02月22日
    浏览(48)
  • STM32F407 滴答定时器

    介绍STM32F407滴答定时器配置方法、使用方式,封装延时函数得到精确的时间。 STM32F407参考手册中第10章介绍了滴答定时器的校准值。 M4权威指南介绍滴答定时器的章节,M3权威指南中与M4权威指南中的介绍一样。 在sys.c文件中增加滴答定时器的代码 在delay.c文件增加以下代码

    2024年02月11日
    浏览(53)
  • stm32的学习——SysTick定时器的使用

    SysTick定时器也称为滴答定时器,SysTick定时器是内核中的一个外设,内嵌在NVIC(嵌套向量中断控制器)里面,在cortex M3、M4中都存在,很方便用户移植。 虽然我用的是cortex M4的内核,但是他的内核文档在这方面和Cortex M3的相似。 所以我这里参考了M3的内核中文文档。M3和M4内核

    2024年02月04日
    浏览(40)
  • 【STM32笔记】低功耗模式、WFI命令等进入不了休眠的可能原因(系统定时器SysTick一直产生中断)

    【STM32】低功耗模式、WFI命令等进入不了休眠的可能原因(系统定时器SysTick一直产生中断) 【STM32笔记】低功耗模式配置及避坑汇总 前文: blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录解决方案) __WFI

    2024年02月10日
    浏览(51)
  • STM32 F103C8T6学习笔记4:时钟树、滴答计时器、定时器定时中断

    今日理解一下STM32F103 C8T6的时钟与时钟系统、滴答计时器、定时器计时中断的配置,文章提供原理,代码,测试工程下载。 目录 时钟树与时钟系统: 滴答计时器: 定时器计时中断: 测试结果: 测试工程下载: 该系统介绍在 STM32F10x-中文参考手册 P56页开始 微控制器的时钟系

    2024年02月13日
    浏览(47)
  • 关于STM32的hal库中滴答定时器uwTick溢出的思考和分析

    思考:如果中断函数HAL_IncTick中的uwTick一直增加导致溢出会不会导致延时不准? 下面展示一些 STM32的官方库文件stm32f1xx_hal.c部分摘录 。 系统Tick频率设置为1毫秒中断一次,每1ms产生一次Tick中断, 在Tick中断中uwTick++; 那么当自增到0xFFFFFFFF后就会溢出,再从0开始自增 。 0xFFFF

    2024年03月21日
    浏览(45)
  • STM32—系统定时器

    SysTick是一种系统定时器,可以用于实现操作系统、任务调度、时钟管理等功能。它通常集成在微控制器中,并且是硬件实现的,具有高精度和可靠性。 在ARM Cortex-M处理器中,SysTick定时器可以配置为计数器模式或外部时钟模式。在计数器模式下,SysTick定时器使用内部时钟作为

    2024年02月21日
    浏览(32)
  • 【STM32笔记】STM32的定时器开发基础(二)(基于STM32CubeMX实现定时器中断)

      传统STM32外部中断 的设计步骤:  (1)将GPIO初始化为输入端口。  (2)配置相关I/O引脚与中断线的映射关系。  (3)设置该I/O引脚对印的中断触发条件。  (4)配置NVIC,并使能中断。  (5)编写中断服务函数。   基于STM32CubeMX的外部中断 设计步骤  (1)在STM3

    2024年02月20日
    浏览(62)
  • 超详细!必看!!STM32--系统滴答SysTick

    Systick定时器是一个24bit的倒计时(向下计数)定时器,功能就是实现简单的延时。 SysTick 是一种系统定时器,通常在嵌入式系统中使用。它是 ARM Cortex-M 处理器的一个特殊定时器,用于提供系统级的定时服务。SysTick 可以用于生成定时中断,以便执行特定的任务或进行系统级的

    2024年01月20日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包