STM32F4之系统滴答定时器
一、系统滴答定时器概述
传统定时器:如手机闹钟,闹钟等就是一个简单地计数器。
定时器概念:由时钟源+计数器+计数值组成的计数单元。

系统嘀嗒定时器首先是存在于内核里,系统嘀嗒时钟假如用的是同一个内核那么里面相关的配置,可能不同的就是主频。
定时器概述
平时数数的时候,每次数的时间不一致
定时器:可以帮助我们进行有规律的计数
可以知道每数一次的时间都是固定的
定时器的本质 = 数一次的时间 * 数多少次
系统滴答定时器的概述
SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号: 15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。
例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问,以维持操作系统“心跳”的节律。
后面用到操作系统的时候就可以使用系统嘀嗒作为时基单元(5ms)
SysTick(系统滴答)器原理:SysTick本质就是一个定时器。每来一个时钟脉冲计数一次,从规定数值递减到零时,表示定时时间到。
SysTick作用:
1为搭载操作系统的芯片提供心跳节拍:由于芯片搭载操作系统便于维护程序,很多产品都会搭载操作系统,操作系统需要一个心跳节拍。
2如果是裸机使用系统滴答定时器时,可以将系统滴答定时器当做普通定时器使用。
二、系统滴答定时器框架


因为SysTick是属于内核的一部分,其被捆绑在NVIC中,用于产生SYSTICK异常。
滴答定时器介绍:
SysTick 定时器是一个简单的递减 24 位定时器,可以在处理器时钟频率或参考时钟频率上运行
(1)递减:定时器的计数器是向下递减的。1000-》0
(2) 定时器是24位:计数器的计数范围。
(3) 定时器时钟来源:处理器时钟频率(168MHZ)或参考时钟频率(168/8 =21MHZ)
有上图得知滴答定时器是作为内核中NVIC的一部分的一部分,


定时时间计算问题:
- 24位递减计数器最大值224 = 16777216 = 798,915us
- 选择21M参考时钟AHB经过8分频得到 最大计数时间ms = 16777216/21*000(1毫秒计数个数) = 799ms

三、系统滴答定时器相关寄存器

SysTick的控制与状态寄存器
SysTick重载值寄存器
SysTick当前值寄存器
SysTick校准值寄存器
该寄存器用于校准滴答定时器,所以必须要有一个参考时钟,写入TENMS中。
注意点:如果使用参考时钟,必须写入一校准值(厂家在芯片出场的时候已经写入);

作为查询方式的配置步骤:(作为延时函数)
属于内核的没有时钟使能
- 选择时钟源
- 清空递减计数值
- 写入重载值
- 开启递减计数器
- 等待标志位
- 关闭递减计数器
作为中断(搭载操作系统)的配置流程
Void SysTick_IRQ_Init(void)
{
①时钟源选择
②配置自动重装载寄存器
③清除当前计数器的值
④使能中断(模块级中断打开就行,核心机中断不用,SYStickz在内核里面不用使能,NVIC必须响应)
⑤设置中断优先级
⑥打开定时器
}
u32 fac_us = 0; u32 fac_ms = 0; //#ifdef SYSINter /************************************ 函数功能:系统嘀嗒定时器初始化 函数形参:u32 nms 函数返回值:void 函数说明: 选择21M的时钟源 总的计数时间=记一次数的时间*LOAD的值 1/21*21*1000*nms 作者: 日期: ************************************/ void Systick_Interrupt_Init(u32 nms,char nus) {//1. 先选择时钟源(一般选择STCLK -- 21M)-- 选择好了记一次数的时间,1/21M sSysTick->CTRL &= ~(0x1 << 2);//2. 往重装载寄存器写值(记多少次)SysTick->LOAD = 21 * pow(1000,nus) * nms;//3. 对VAL寄存器执行写操作(就可以把重装载值加载到计数器里)SysTick->VAL = 0;//4. 使能对应的中断标志SysTick->CTRL |= 0x1 << 1;//5. 配置中断优先级NVIC_SetPriority(SysTick_IRQn,NVIC_EncodePriority(7-2,2,2));//6. 使能计数器SysTick->CTRL |= 0x1 << 0;} //7. 编写中断服务函数 void SysTick_Handler(void) {//清除标志位if((SysTick->CTRL & 0x1 << 16)){if(fac_us>0)fac_us--;if(fac_ms>0)fac_ms--; // printf("123456\r\n");} } //#else /************************************ 函数功能:延时ms 函数形参:u32 nms 函数返回值:void 函数说明: 选择21M的时钟源 总的计数时间=记一次数的时间*LOAD的值 1/21*21*1000*nms 作者: 日期: ************************************/ void Delay_Ms(u32 nms,u32 nus) {//1. 先选择时钟源(一般选择STCLK -- 21M)-- 选择好了记一次数的时间,1/21M sSysTick->CTRL &= ~(0x1 << 2);//2. 往重装载寄存器写值(记多少次)SysTick->LOAD = 21 * 1000 * nms;//3. 对VAL寄存器执行写操作(就可以把重装载值加载到计数器里)SysTick->VAL = 0;//4. 使能计数器SysTick->CTRL |= 0x1 << 0;//5. 等待计数时间到达while(!(SysTick->CTRL & (0x1 << 16))){}//5. 关闭计数器SysTick->CTRL &= ~(0x1 << 16); } /************************************ 函数功能:延时ms 函数形参:u32 nms 函数返回值:void 函数说明: 选择21M的时钟源 总的计数时间=记一次数的时间*LOAD的值 1/21*21*1000*nms 作者: 日期: ************************************/ void DElay_US(u32 nms, u32 nus) {if(nus<=500){fac_us=1;Systick_Interrupt_Init(nms,nus);}else{fac_us = nus;Systick_Interrupt_Init(1,nus);}SysTick->CTRL &= ~(0x1 << 16); } /************************************ 函数功能:延时ms 函数形参:u32 nms 函数返回值:void 函数说明: 选择21M的时钟源 总的计数时间=记一次数的时间*LOAD的值 1/21*21*1000*nms 作者: 日期: ************************************/ void DElay_MS(u32 nms, u32 nus) {if(nms<=500){u32 fac_ms = 0;Systick_Interrupt_Init(nms,1);}else{fac_ms = nms;Systick_Interrupt_Init(nms,1);}while(fac_ms !=0);SysTick->CTRL &= ~(0x1 << 16);}
相关文章:
STM32F4之系统滴答定时器
一、系统滴答定时器概述 传统定时器:如手机闹钟,闹钟等就是一个简单地计数器。 定时器概念:由时钟源计数器计数值组成的计数单元。 系统嘀嗒定时器首先是存在于内核里,系统嘀嗒时钟假如用的是同一个内核那么里面相关的配置&…...
P4 并发控制
文章目录 Task1 锁管理器LockTableUnLockTableLockRowUnLockRow Task2 死锁检测Task3 并发查询执行器Isolation Levelseq_scan_executorinsert_executordelete_executortransaction_manager Task1 锁管理器 LockManager类包含两个属性类,分别是LockRequest和LockRe…...
友元的介绍
实现外部类和外部函数存取类的私有成员和保护成员的方法。 一、友元函数 可访问类所有成员的外部函数 //求两点间的距离:抽象点——>求距离的函数 #include<iostream> #include<cmath> using namespace std; class Point{private:double x,y;publ…...
新手如何找到Docker容器(redis)中的持久化文件?
具体步骤 要查看Docker容器的dump.rdb和appendonly.aof文件(如果启用了AOF持久化)的位置,我们需要知道容器中Redis配置文件的内容或者容器的数据卷的挂载位置。 这里是一般步骤: 查找容器的数据卷挂载位置 使用docker inspect命令…...
python二次开发Solidworks:读取立方体的高度
在SW中新建一个零件文档,建立一个立方体,长度和宽度自定义,高度100mm,下面通过python实现读取该立方体的高度: import win32com.client as win32 import pythoncomswApp win32.Dispatch(sldworks.application) swApp.…...
NPM安装后报错:ERROR: npm v10.2.1 is known not to run on Node.js v10.24.1.
问题描述 NPM卸载高版本后安装低版本运行报错: C:\Users\Administrator>npm -v ERROR: npm v10.2.1 is known not to run on Node.js v10.24.1. This version of npm supports the following node versions: ^18.17.0 || >20.5.0. You can find the latest…...
【Vue】Element开发笔记
Element开发笔记 前言 官网 https://element.eleme.cn/#/zh-CN/component/upload 其它项目网站 https://www.cnblogs.com/qq2806933146xiaobai/p/17180878.html 表格 序号列添加 <el-table-column type"index" :index"handleIndexCalc" label&qu…...
How to install mongodb 7.0 to Ubuntu 22.04
How to install mongodb 7.0 to Ubuntu 22.04 1、安装1.1、添加gpg1.2、添加apt源1.3、更新1.4、安装 2、管理2.1、服务管理2.1.1、查看服务状态2.1.2、启动服务2.1.3、 设置服务为开机启动2.1.4、取消服务开机启动2.1.5、关闭服务2.1.6、服务重启 2.2、mongosh2.2.1、进入mong…...
AFL安全漏洞挖掘
安全之安全(security)博客目录导读 ATF(TF-A)/OPTEE之FUZZ安全漏洞挖掘汇总 目录 一、AFL简介 二、AFL的安装 三、代码示例及种子语料库 四、AFL插桩编译 五、AFL运行及测试 六、AFL结果分析 一、AFL简介 模糊测试(Fuzzing)技术作为漏洞挖掘最有…...
ES6 let const var和解构赋值
1.let/const和var的区别 1.变量提升:var会发生变量提升,let和const不存在变量提升 2.暂时性死区:变量声明之前变量不可用称为暂时性死区。var不存在,let和const存在暂时性死区 3.typeof 不再是百分百不会报错:let声…...
03、MySQL-------数据库中间件MyCat实现读写分离
目录 八、数据库中间件MyCat实现读写分离1、克隆:2、配置分析:1、schema.xml2、启动mycat:3、关闭防火墙:4、代码测试:测试写入:测试读:强制读Master 八、数据库中间件MyCat实现读写分离 作用&…...
虹科活动 | 探索全新AR应用时代,虹科AR VIP研讨会广州场回顾!
文章来源:虹科数字化AR 阅读原文:https://mp.weixin.qq.com/s/7tmYR42Tw5XLn70fm8Nnew 主题演讲 本次研讨会,虹科特邀 “工业AR鼻祖” 美国Vuzix公司的首席应用工程师郑慎方先生进行主题演讲,并邀请到了各界的专业人士和企业代表参…...
非科班,补基础
大家好,我是大彬~ 今天跟大家分享知识星球小伙伴关于【非科班转码如何补基础】的提问。 往期星球提问整理: 读博?找工作? 性格测试真的很重要 想找一份实习工作,需要准备什么 球友提问: 大彬大佬…...
安全性与合规性:IT运维的双重守护
在当今数字化时代,信息技术(IT)已深入渗透到企业的各个层面。随着数据和技术的不断发展,IT运维安全性和合规性逐渐成为了企业运营的两大核心要素。它们不仅保障了企业数据的安全,更维护了公司的声誉和客户信任。本文将…...
session 反序列化
原理详解 ctfshow web 263 ctfshow 新手杯 剪刀石头布 这里我们可以发现服务器使用的处理器为php_serialize,与当前页面处理器不同,在反序列化的时候会造成一些问题。同时cleanup配置没开,关闭了session自动清理,所以我们不需要…...
PostgreSQL中实现数学中的组合问题
记得在学《数值分析》这门课程时,其中有排列组合的相关计算。最近没有想到,自己居然在编程上需要了这个问题,需要在数据库的一张表中,找出任意n条记录的组合,判断组合后的图形是什么,也就是组合问题。从网上搜索的相关资料,发现很多是在Java或者python代码实现的。因为数…...
编译和连接
前言:哈喽小伙伴们,从我们开始学习C语言到实现如今的成果,可以说我们对C语言的掌握已经算是精通级别了,但是我们只学习了怎么写代码,却没怎么了解过代码的背后是怎么工作的。 那么今天这篇文章我们一起来学习C语言的最…...
常见分布整理
概率论 - 常见分布(及其分布表) 常见分布的期望和方差 离散型分布 两点分布 有2种结果,实验只做1次 X~b(1,p)则有 P(X k) pk (1-p)1-k,k 0, 1 数学期望:E(X) p 方差:D(X)p(1-p) 二项分布 P(A) p࿰…...
ubuntu终端命令行下如何使用NetworkManager(netplan)来配置wifi网络
最近在给家里折腾一个文件共享服务器给家里的小米摄像头保存监控视频用。树莓派太贵了,找来找去发现香橙派orangepi zero3 是最低成本的替代解决方案(网络足够快,CPU的IO能力足够强),香橙派orangepi zero3的操作系统是…...
GO学习之 goroutine的调度原理
GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...




