STM32中SysTick系统滴答定时器用于延时功能的实现及说明

目录

STM32中SysTick系统滴答定时器用于延时功能的实现及说明

delay.h文件

delay.c文件


STM32中SysTick系统滴答定时器用于延时功能的实现及说明

    在进行stm32开发的过程中,我们可能会使用到系统滴答定时器SysTick进行延时。系统滴答定时器是一个24位的向下倒计时的定时器。它主要有四个寄存器:重装载值寄存器LOAD、当前值寄存器VAL、控制寄存器CTRL和校准寄存器CALIB(校准寄存器一般不使用)。以下是系统滴答定时器用于延时操作的相关代码实现及说明。(这里只是在没有操作系统OS的驱动代码中使用,在有操作系统OS的代码中,SysTick系统滴答定时器可能作为操作系统的时基时钟使用。并且操作系统OS往往已经提供了相关的延时函数,直接调用操作系统提供的函数即可)

delay.h文件

#ifndef __DELAY_H
#define __DELAY_H
​
void delay_init(void);
void delay_ms(u16 ms);
void delay_us(u32 us);
​
#endif

=================================分割线================================

delay.c文件

#include "delay.h" 
​
static u8 fac_us = 0;       //微秒级延时系数              
static u16 fac_ms = 0;      //毫秒级延时系数//初始化延迟函数
void delay_init()
{SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);   //使用外部时钟 fac_us = SystemCoreClock / 8000000;                     //微秒对应的tick数  fac_ms = (u16)fac_us * 1000;                            //毫秒对应的tick数   
}
说明:对于F103系列芯片来说系统时钟为72MHz,而滴答定时器的时钟为HCLK的8分频,即是9MHz。那么可以知道滴答定时器的计数器每减9次,时间为1微秒。每减9000次时间为1毫秒。(1MHz的时钟频率计数器每加1或者减1的时间为1us)因此微秒系数fac_us = 9,fac_ms = 9000。
​
//微秒级延时函数              
void delay_us(u32 us)
{       u32 temp;            SysTick->LOAD = us * fac_us;                        //时间加载           SysTick->VAL = 0x00;                                //清空计数器SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ;          //启动定时器   do{temp = SysTick->CTRL;}while((temp & 0x01) && !(temp & (1<<16)));         //等待时间到达   SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;          //关闭计数器SysTick->VAL = 0X00;                                //清除COUNTFLAG计时完成标志位     
}
说明:对于系统滴答定时器的使用一般为以下步骤:1、将重装载值赋给LOAD寄存器,对于微秒延时重装载值就是延时系数乘以延时时间2、将当前值寄存器VAL清零3、启动定时器进行计时4、等待计时时间到关闭定时器5、清除计时完成的标志位COUNTFLAG关于清除COUNTFLAG标志位,可以等计时完成后直接读取控制寄存器CTRL的第16位进行清除;也可以通过写当前值寄存器VAL来进行清除。do{temp = SysTick->CTRL;}while((temp & 0x01) && !(temp & (1<<16))); 这个语句中(temp & 0x01)首先确保定时器是处于打开状态。(temp & (1<<16)用来判断标志位COUNTFLAG是否为1,当计时时间到后标志位COUNTFLAG会自动置1。由于这里是do--while循环,因此当计时时间未到时,标志位COUNTFLAG一直为0,也即是(temp & (1<<16)为0,取反后为1表示真,以上条件都成立,则继续执行do语句里的内容(继续查询COUNTFLAG标志位的状态)。//毫秒级延时函数   
void delay_ms(u16 ms)
{                 u32 temp;          SysTick->LOAD = (u32)ms * fac_ms;               //时间加载SysTick->VAL = 0x00;                            //清空计数器SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ;      //启动定时器  do{temp = SysTick->CTRL;}while((temp & 0x01) && !(temp & (1 << 16)));   //等待时间到达   SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;      //关闭计数器SysTick->VAL = 0X00;                            //清除COUNTFLAG计时完成标志位        
} 
注意:由于滴答定时器的重装载值寄存器LOAD和当前值寄存器都是24位的,因此延时的时间是有上限的。最大延时时间为2^24 - 1 = 16777215,对于微秒级延时每减9次为1us,因此最大延时时长为:16777215 / 9 ---1864135us = 1864.135ms = 1.864s。在使用滴答定时器进行延时时不能超过以上的最大延时时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/9246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python与C#之间的双向管道连接-发送数据

在Python中创建named pipe&#xff1a; import os import time pipe "\\\\.\\pipe\\my_pipe" try: os.mkfifo(pipe) except OSError: pass fifo open(pipe, wb) 在C#中创建named pipe&#xff1a; using System.IO.Pipes; string pipeName "my_pipe&…

学习torchmd分子动力学模拟

TorchMD打算提供一种简单易用的API&#xff0c;用于使用PyTorch进行分子动力学。这使研究人员能够更快地进行力场开发研究&#xff0c;并以PyTorch的简单性和强大性将神经网络潜力无缝集成到动力学中。 TorchMD使用与经典MD代码&#xff08;如ACEMD&#xff09;一致的化学单位&…

引入OSS

前置条件 AccessKey 引入依赖 都是官网上的&#xff1a;https://help.aliyun.com/zh/oss/developer-reference/java-installation?spma2c4g.11186623.0.i16 <!--若是创建项目的时候这个依赖勾选了就不用了--><!--不加启动会报错No active profile set, falling back…

JavaScript之数据类型(2)——复杂类型(object)

object的介绍&#xff1a; 我对于object的理解是和C/C中的结构体一样&#xff0c;是一个自定义的数据类型&#xff0c;我们可以通过多个简单的数据类型来定义一个便于我们使用的新的数据类型。 在网上某佬对于其解释如下&#xff1a; Object类型&#xff0c;我们也称为一个对象…

Windows命令行一键安装、配置WSL的方法

本文介绍在Windows电脑中&#xff0c;通过命令行的方式&#xff0c;快速、方便安装适用于Linux的Windows子系统&#xff08;Windows Subsystem for Linux&#xff0c;WSL&#xff09;的方法。 WSL是由微软开发的一项功能&#xff0c;允许在Windows操作系统上运行Linux发行版系统…

【Linux的文件篇章 - 磁盘文件】

Linux学习笔记---012 Linux之进程程序替换理解1、磁盘文件1.1、文件如何存取的问题1.2、了解磁盘的存储结构1.3、如何找到指定位置的扇区&#xff1f;1.4、对磁盘的存储进行逻辑抽象(了解OS对磁盘这样的硬件设备的抽象与管理) 2、磁盘级文件系统2.1、Linux文件系统特定2.2、文件…

Ansible--Templates 模块 Tags模块 Roles模块

一 Templates 模块 ①Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件&#xff0c;可看作一个编译过的模 板文件&#xff0c;用来产生目标文本&#xff0c;传递Python的变量给模板去替换模板中的标记。 ②在配置文件中&#xff0c;会有一些数据&#xff08;如…

Java毕设之基于SpringBoot的在线拍卖系统

运行环境 开发语言:java 框架:springboot&#xff0c;vue JDK版本:JDK1.8 数据库:mysql5.7(推荐5.7&#xff0c;8.0也可以) 数据库工具:Navicat11 开发软件:idea/eclipse(推荐idea) 系统详细设计 管理员功能模块 管理员登录&#xff0c;管理员通过输入用户名、密码、角色等信…

UE4_Water插件_Buoyancy组件使用

water插件提供了一个浮力Actor蓝图类。 需要注意的几个问题&#xff1a; 1、StaticMesh需要替换根组件。 2、需要模拟物理设置质量。 3、需要添加浮力组件&#xff0c;设置浮力点&#xff0c;应用水中牵引力。 4、最重要的是需要激活——自动启用。 5、调水波长的地方 双击图片…

FreeRTOS学习 -- 任务相关API函数

一、任务创建和删除API函数 FreeRTOS 最基本的功能就是任务管理&#xff0c;而任务管理最基本的操作就是创建和删除任务。 FreeRTOS的任务创建和删除API函数如下&#xff1a; 1、函数 xTaskCreate() 此函数用来创建一个任务&#xff0c;任务需要 RAM 来保存于任务有关的状…

前端js面试题--从字符串中删除删除注释代码

问题&#xff1a;从字符串中删除删除注释代码 描述&#xff1a; solution(weex,rex # and react\nflutter\nnative ssss !hybrid app, [#, !]) 写一个solution函数清除后面参数数组里面的字符串 打印效果 代码1 思路&#xff1a; 将字符全凡是有去掉标志符号的全部添加\n…

Java_File

介绍&#xff1a; File对象表示路径&#xff0c;可以是文件&#xff0c;也可以是文件夹。这个路径可以是存在的&#xff0c;也可以是不存在的&#xff0c;带盘符的路径是绝对路径&#xff0c;不带盘符的路径是相对路径&#xff0c;相对路径默认到当前项目下去找 构造方法&…

基于SSM的校园短期闲置资源置换平台(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的校园短期闲置资源置换平台&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过…

燃气电力瓶装气行业入户安检小程序开发

我们开发的小区业主入户安检小程序&#xff0c;旨在满足燃气、电力以及其他需要入户安检的行业需求。该程序支持自定义安检项目&#xff0c;实现线下实地安检与线上数据保存的完美结合。在安检过程中&#xff0c;我们可以拍照或录像&#xff0c;以确保安检的透明性和可追溯性&a…

渲染管线中光照的计算

文章目录 渲染管线中光照的计算前言法向量朗伯余弦定律漫反射环境光照镜面光照菲涅尔效应 表面粗糙度光照模型平行光源点光源衰减 聚光灯 渲染管线中光照的计算 前言 首先我们来看一下同一个模型在有光与无光下的区别&#xff1a; 无光&#xff1a; 有光 很明显的感知就是…

加速科技突破2.7G高速数据接口测试技术

随着显示面板分辨率的不断提升&#xff0c;显示驱动芯片&#xff08;DDIC&#xff09;的数据接口传输速率越来越高&#xff0c;MIPI、LVDS/mLVDS、HDMI等高速数据接口在DDIC上广泛应用。为满足高速数据接口的ATE测试需求&#xff0c;作为国内少数拥有完全自研的LCD Driver测试解…

【Web前端】定位_浮动_音视频

1、定位 1.1想对定位 相对定位&#xff0c;使用relative&#xff0c;参考点是标签之前的位置&#xff0c;不是相对于父节点、同级节点或浏览器。相对定位通过left、right进行水平偏移&#xff0c;通过top、bottom进行垂直偏移Ieft:表示相对于原本位置的左外边界右移的距离rig…

WebSocket 来单提醒和客户催单功能

一&#xff1a;WebSocket &#xff1a; WebSocket 是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c; 并进行双向数据传输。 HTTP协议和WebSocket协议对比&#…

算法提高之迷宫问题

算法提高之迷宫问题 核心思想&#xff1a;最短路问题 从(n-1,n-1)开始bfs 往前走一个就存入pre数组 之后再遍历pre数组输出 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 1010,M N*N;#define x first#def…

vue 代码样式问题

部分电脑存在样式错乱问题&#xff0c;部分电脑样式正常。最后发现是样式写在 el-col 里面导致的。 注意&#xff1a;写样式不要放在 el-row 或者 el-row &#xff0c;导致部分电脑会出现莫名其妙的样式问题 <el-row class"detail"><el-col class"it…