STM32延时函数

news/2024/7/3 21:06:51/文章来源:https://www.cnblogs.com/qianxiaohan/p/18275930

STM32延时函数(查询定时器实现)

之前在STM32中使用延时函数的时候,都是直接使用,并不了解其中的原理。经过查阅资料,这里记录一下大致原理。

首先直接贴出来延时函数delay.c,通过查询的SysTick Timer的STK_CTRL寄存器的计数标志位COUNTFLAG方式实现,其中SysTick是一个结构体指针,在core_cm3.h中声明了。

#include "stm32f10x.h"/*** @brief  微秒级延时* @param  xus 延时时长,范围:0~233015* @retval 无*/
void Delay_us(uint32_t xus)
{SysTick->LOAD = 72 * xus;				//设置定时器重装值SysTick->VAL = 0x00;					//清空当前计数值SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK并启动定时器while(!(SysTick->CTRL & 0x00010000));	//等待计数到0SysTick->CTRL = 0x00000004;				//关闭定时器
}/*** @brief  毫秒级延时* @param  xms 延时时长,范围:0~4294967295* @retval 无*/
void Delay_ms(uint32_t xms)
{while(xms--){Delay_us(1000);}
}/*** @brief  秒级延时* @param  xs 延时时长,范围:0~4294967295* @retval 无*/
void Delay_s(uint32_t xs)
{while(xs--){Delay_ms(1000);}
} 

可以看到延时函数使用的是系统定时器Systick Timer,有关Systick Timer的介绍,参考手册《Cortex®-M3 programming manual》中写道:

The processor has a 24-bit system timer, SysTick, that counts down from the reload value to zero, reloads (wraps to) the value in the LOAD register on the next clock edge, then counts down on subsequent clocks.

控制及状态寄存器 (STK_CTRL)

Cortex-M3处理器有一个24位的系统定时器,这个定时器从计数值一直减到0,在下一个时钟边缘重新加载(包装到)LOAD寄存器中的值,然后计数
下一个时钟。Systick Timer的CTRL寄存器(控制寄存器)如下:

  • 其中第31~17位、第15~3位为保留位且必须被清除。
  • 第16位COUNTFLAG,计数标志位,上一次该位被读取时,定时器倒计时计数到0,计数标志位为1。
  • 第2位CLKSOURCE,时钟源选择,0:AHB的时钟8分频;1:处理器时钟(AHB时钟,即HCLK)
  • 第1位TICKINT,是否开启SysTick异常请求。0:倒计时到零不断言SysTick异常请求;1:0:倒计时到零断言SysTick异常请求
  • 第0位ENABLE,计数器启用。0:停止,1:启用

因此用Systick->CTRL = 0x00000005;语句,实现HCLK作为SysTick Timer的时钟源并且启用定时器。

装载寄存器(STK_LOAD)

img
  • 第31~24位为保留位

  • 第23~0位共24位作为重载值,数值范围0x0000000~0x00FFFFFF

  • 根据需要重载值要进行调整:

    • 原文:To deliver a single SysTick interrupt after a delay of N processor clock cycles, use a RELOAD of value N. For example, if a SysTick interrupt is required after 400 clock pulses, set RELOAD to 400.

    • 在N个处理器时钟周期要产生一次SysTick中断,重载值RELOAD就设置为N。例如需要在400个时钟周期后产生一次SysTick中断,重载值RELOAD就设置为400。

    • 原文:To generate a multi-shot timer with a period of N processor clock cycles, use a RELOAD value of N-1. For example, if the SysTick interrupt is required every 100 clock pulses, set RELOAD to 99

    • 要生成一个周期为N个处理器时钟周期的多触发定时器,请使用RELOADN-1的值。例如,如果每100个时钟脉冲需要SysTick中断,则设置重新加载到99(这时候用作实时操作系统RTOS)

因此用SysTick->LOAD = 72 * xus;语句,设定重载值,STM32F10X系列系统时钟(SYSCLK)最大频率为72MHz,它是供STM32中绝大部分部件工作的时钟源,选择HCLK作为时钟源,HCLK最大频率72MHz,即时钟周期(clock cycle)为\(\frac{1}{72000000}\)秒。当参数xus为1000时,延时了1000us=1ms。有关HCLK为什么是72Mhz的频率参照:

当前值寄存器(STK_VAL)

  • 第31位~24位作为保留位
  • 余下24位作为当前值,写入任何值都会将字段清除为0,同时也会清除中的STK_CTRL寄存器中的计数标志位COUNTFLAG位为0。

语句SysTick->VAL = 0X00,将当前值设为0,并将控制寄存器的COUNTFLAG位设为0。

总结

当计数器倒计时计数为0时,读取到控制寄存器STK_CTRL中的COUNTFLAG为1时,说明设定的时间到了,这时退出循环,将ENABLE位复位为0,于是有语句SysTick->CTRL = 0x00000004;,用来关闭计数器。相对于定时器中断的方式实现延时,查询法上避免了频繁调用中断。

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

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

相关文章

OOP最后两次作业总结

OPP最后两次作业总结 前言 两次题目集其实都是在前面的基础上进行迭代,第一次作业说实话我没花什么时间,毕竟我从写第一次PTA就是给电器使用两个接点,我从拿到题目到达到及格分只用了半天时间,然后最后又花了点时间测试几个样例,拿到了82分。然后最后一次作业嘛,我几乎是…

游戏常用运行库 合集 | Game Runtime Libraries Package(2.1.24.0618)

软件简介: 游戏常用运行库 合集 整合了许多游戏会用到的运行库,支持 Windows XP – Windows 11 系统,并且支持自动检测系统勾选推荐的运行库,方便快捷。 本版特点: By:mefcl整合常见最新游戏所需运行库根据系统自动勾选推荐的版本纯净安装包无病毒和弹窗行为支持静默安装…

背包DP——混合背包

顾名思义,混合背包就是将前面三种的背包问题(01,完全,多重)混合起来,有的只能取一次,有的能取无限次,有的只能取 k 次。 正解特解 部分情况下,如小数据,可以转换成多重背包(把完全情况的数量换成足够大,如1e7,就把完全相对变成了多重) 例题 https://www.luogu.co…

cent os配置docker(解决2024.6月docker镜像拉取问题)

docker拉取镜像目前已经失效,多方查找目前试了试下面这个还可以用 首先执行以下命令安装dockeruname -r yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum …

Field stock doesnt have a default value

当你遇到 "Field stock doesnt have a default value"​ 这个错误时,这意味着你正在尝试插入一条新记录到数据库中,但是涉及的 stock 字段没有提供一个值,同时该字段在数据库表定义中也没有设置默认值(default value),并且数据库配置为严格模式,不允许NULL值或…

南昌航空大学软件学院23201823第三次blog

一、前言 这是最后一次blog了,是一些关于题目集7~8次的总结以及这一个学期对于PTA题目集的总结了。最后这两次的题目难度其实我并不是非常了解,大抵是因为我已经来不及挽救了,但是我还是想说其实这几次题目的难度感觉并没有想象中的触不可及,而是我自己没有花足够的心思去了…

中国城市降雨量历史记录查询 All In One

中国城市降雨量历史记录查询 All In One 降雨量 历史记录中国城市降雨量历史记录查询 All In One降雨量 历史记录https://www.ceicdata.com.cn/zh-hans/china/precipitation 中国 降水量:河南:郑州 1990 - 2022 | 月 | 毫米 | 气象局 降水量:河南:郑州在12-01-2022达1.500毫米,…

oracle安装调用图形化失败

报错现象: [grid@19c01 grid]$ ./gridSetup.sh ERROR: Unable to verify the graphical display setup. This application requires X display. Make sure that xdpyinfo exist under PATH variable.No X11 DISPLAY variable was set, but this program performed an operatio…

Kubernetes-高可用k8s集群部署(多Master节点二进制方式)

一、安装Docker 配置docker的yum源地址 yum -y install wget wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo yum provides docker-ce 安装指定的docker版本 yum install -y docker-ce-20.10.7 docker-ce-cli-20…

23201813-第三次blog作业

前言: 这学期已经接近了尾声,java和面向对象的学习也已经接近结束,在这门课程的最后时间里,剩余的两次pta我都没有完成,一部分原因是后面的题目集感觉好难,然后要经过好多迭代,还有期末的考试学科很多,有大部分的时间用来复习,所以对pta就基本上放弃了,所以最后两个题…

一个HTML页面demo

代码:<!--* @Description: 一个博客页面布局,加上一些CSS和JS样式* @Author: zhangyh* @Date: 2024-06-29 15:25:16* @LastEditTime: 2024-06-29 23:06:12* @LastEditors: zhangyh* Copyright (c) 2024 by zhangyinghui181217@163.com, All Rights Reserved. --><!…

WPF网格类型像素着色器

由于WPF只能写像素着色器,没法写顶点着色器,所以只能在这上面做文章了 刚好有个纹理坐标TEXCOORD输入可用,而且值的范围是已知的0-1,左上角是原点,这就好办了 例子 索引 二分网格使用ceil 0-1移动定义域到-0.5 - 0.5,然后向上取整变成 0 / 1float4 main(float2 uv : TEXC…

LLM大模型: RAG两大核心利器: M3E-embedding和bge-rerank

RAG的效果好不好,最核心依赖两点:文本embedding语义提取的好不好,rerank的排序效果好不好(包含正确答案的文本是不是排在前面)!各自使用的环节如下:1、文本embedding的提取:理论上讲,任何transformer架构的encoder部分都可用于生成token的embedding,然后采用合适的po…

oop-PTA题目集7~8总结

一、前言 第七次和第八次的题目集中的题目均是在前两次的电路模拟程序中增加新的内容,难度相较前面两次的题目有明显增大,主要是电路结构更加复杂,比如多并联、并联包含并联等较为特殊的情况,另外,新增了一些需要特殊处理的电器设备,比如有三个引脚的互斥开关、与其他设备…

lamp lump

为网站备案老王:记得一定要完成ICP备案,才可以通过网站对外提供互联网信息服务! 老王:根据 《互联网信息服务管理办法》以及 《非经营性互联网信息服务备案管理办法》,国家对非经营性互联网信息服务实行备案制度,对经营性互联网信息服务实行许可制度。未取得许可或者未履…

UI Explorer 的下载

离线版下载地址参考 UI Path 论坛的一篇文章:Standalone UiExplorer client download?该链接现在依然有效。 另外,替换链接中的版本号可获取其他版本的下载路径。 理论上,遍历此链接可以获取最新版本的独立程序包。有了计划记得推动,不要原地踏步。

监狱视频智能分析系统

监狱视频智能分析系统解决方案包括视频AI行为智能分析预警是一套可以独立运行的监狱视频智能分析系统。仅需在原有监控终端设备上的基础上,增加一台智能预警分析盒子,基于智能视频分析盒子实现监控系统智能预警功能。当视频监控划分的视野范围内发生事先预设的事件,如人员倒…

SpringMVC初体验

新建Maven项目 pom.xml文件导包<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://ma…

.NET|--WPF|--笔记合集|--依赖项属性|--概览

前言 本文介绍一下WPF的依赖项属性, 可以让大家对该依赖项属性知识点有个简单认识. "依赖项属性"其实也是"属性"的一种, 而"只读依赖项属性"又是"依赖项属性"的一种. 层级关系 : 属性 > 依赖项属性 > 附加属性 / 只读依赖项属性…

2024年自学python必看的书籍《Python编程:从入门到实践 第三版》PDF免费下载

本书是一本针对所有层次的Python 读者而作的Python 入门书。第一部分介绍了编程环境的搭建和Python编程所必须了解的基本概念。第二部分将理论付诸实践,讲解如何开发三个项目:分别是射击游戏、数据可视化、小型Web应用程序适读人群 :本书适合对Python感兴趣的所有读者阅读。…