【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次

news2025/1/17 0:51:36

 前言:定时器TIM的详细知识点见我的博文:11.TIM定时中断-CSDN博客

STM32定时器时间计算公式


公式解释:

ARR(TIM_Period):自动重装载值,是定时器溢出前的计数值

PSC(TIM_Prescaler):预分频值,是用来降低定时器时钟频率的参数

Tclk:定时器的输入时钟频率(单位Mhz),通常为系统时钟频率或者定时器外部时钟频率

Tout:定时器溢出时间(单位us)。一定要注意这个单位是us

公式由来:

1.定时器的时钟频率是Tclk,TIM_Prescaler即为PSC的值。时钟频率被分频了PSC+1,那么此时定时器的最终频率为,故可知定时器计数值加1所需的时间为

注:时间等于频率的倒数

2.自动重装载值即TIM_Period即ARR,定时器从0计数到ARR时清零。由第一步已经计算出了被分频了PSC+1的最终定时器的时钟频率为,这是计数一次的频率,则计数到ARR的时间为 为(ARR + 1) /  (时间等于频率的倒数),故定时器溢出时间(单位us)为Tout=((ARR+1)*(PSC+1)) / Tclk。


理论联系实际,来加深理解,接下来使用STM32CubeMx + Keil来实现TIM中断实现1s计时一次。

TIM中断实现1s计时一次

前言:使用的是STM32f103c8t6,系统主频72Mhz

目标:实现TIM中断实现1s计时一次

主要过程:配置定时器溢出时间为10ms(即定时器计数一次10ms,也就是10ms的定时器中断),当计次100次时是1s(1000ms),进而通过置标志位来实现1s的其它操作。

1.在STM32CubeMx中选择TIM2,设置Period(ARR)为7200,设置Prescaler(PSC)为100,根据公式计算得定时器溢出时间即定时器的中断时间(单位us)为\frac{7200\times100 }{72}, 最后结果为10 000 us,即10ms。

对应的代码以及具体配置如下所示(HAL库版本),这段代码是一个使用TIM2定时器进行初始化配置的函数。

具体配置如下:

设置TIM2的时钟源配置为默认值。

设置TIM2的主配置为默认值。

对htim2即TIM_HandleTypeDef类型的结构体变量进行初始化配置:设置htim2的实例为TIM2。

设置htim2的预分频器为7200-1,这将把输入时钟频率除以7200来得到TIM2的时钟频率。

设置htim2的计数模式为向上计数模式TIM_COUNTERMODE_UP。 

设置htim2的计数器周期为100,这意味着当计数器达到100时,将发生定时器事件(溢出或中断)。

设置htim2的时钟分频因子为TIM_CLOCKDIVISION_DIV1即无时钟分频。

禁用htim2的自动重装载预装载功能TIM_AUTORELOAD_PRELOAD_DISABLE。这意味着在更新事件时,直接将新的周期值加载到计数器。

void MX_TIM2_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 7200-1;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 100;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
}

2.写定时器2中断服务函数,10ms一次中断。这段代码是在定时器2的周期到达时触发的回调函数。在每次定时器2的周期到达时,回调函数`HAL_TIM_PeriodElapsedCallback()`会被调用。代码以及具体流程如下。

具体代码流程如下:

首先判断触发回调函数的定时器实例是否是htim2。如果是htim2实例,即定时器2的周期到达,进入下一步。
`index_10ms`变量自增1,表示经过了10毫秒。
如果`index_10ms`变量的值能够被100整除(即经过了1秒),则将`index_led`变量设置为1。

这段代码的作用是,每隔10毫秒触发一次定时器2的中断服务函数。通过`index_10ms`变量来计数,当计数到100时(经过1秒),将`index_led`变量置为1。

在实际应用中,可以根据`index_led`变量的值来控制相关的LED灯或者执行其他操作,实现定时任务的触发和事件响应。

static uint16_t index_10ms = 0;
uint16_t index_led = 0;

/**
  * @brief          定时器2中断服务函数,10ms一次中断
  * @param[in]      htim:定时器
  * @retval         none
  */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)	
{
	if (htim->Instance == htim2.Instance)
	{
		index_10ms++;	 
    if(index_10ms%100==0)
    {
      index_led=1;
    }
	}
}

3.利用定时器中断来写你自己定义的功能函数。我写的功能函数是实现1s打印一次hello,word。

这段代码其中的逻辑是通过检测外部定义的`index_led`变量的值来执行特定的操作。代码以及具体流程如下。

具体代码流程如下:

- 当`index_led`变量的值为1时,执行以下操作:
  - 打印输出"hello,world"字符串。
  - 将`index_led`变量的值重新设置为0,表示已经处理过这次触发。

这段程序逻辑的作用是在每次`index_led`变量变为1时,打印输出"hello,world"字符串,并且只执行一次,直到下次`index_led`又变为1。

extern uint16_t index_led;
uint8_t led_status =0;
/**
  * @brief          自定义功能函数
  * @param[in]      none
  * @retval         none
  */
void user(void)
{
  if(index_led==1)
  {
    printf("hello,world\r\n");
    index_led=0;
  }
}

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

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

相关文章

k8s的二进制部署(源码包部署)

实验条件: 主机名 IP地址 组件 作用 master01 20.0.0.17 kube-apiserver、kube-controller-manager、kube-scheduler、etcd k8s部署 master02 20.0.0.27 kube-apiserver、kube-controller-manager、kube-scheduler node01 20.0.0.37 kubelet、kube-pro…

工具系列:TimeGPT_(8)使用不规则时间戳进行时间序列预测

文章目录 介绍不规则时间戳的单变量时间预测不规则时间戳的外生变量时间预测 介绍 在处理时间序列数据时,时间戳的频率是一个关键因素,可以对预测结果产生重大影响。像每日、每周或每月这样的常规频率很容易处理。然而,像工作日这样的不规则…

OpenAPI,已支持表单数据格式校验

OpenAPI 路径 开放平台 功能简介 「OpenAPI」- 支持表单数据格式校验。 通过「OpenAPI-新增表单数据」接口,新增数据时,若数据格式不匹配,会导致无法新增。 例如,数字不能新增到日期格式的表单字段。 请参考数据格式传参&a…

IPv4归属地信息查询方法与应用

IPv4地址归属地信息查询是网络管理和安全领域的关键工具。本文将介绍IPv4地址的概念,探讨IPv4归属地信息的重要性,并详细介绍几种查询IPv4归属地信息的方法以及其应用场景。 第一部分:IPv4地址简介 1.1 什么是IPv4地址 IPv4(In…

HTML 网页设计 简约风格 注册界面

成品如下 html <!DOCTYPE html> <html><head><meta charset"utf-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Science科幻注册界面</title><link href"…

游戏服务器列表-增量处理

前言 服务器列表比较简单 固定表/开服表&#xff08;一般只会增加及合并),操作频率很低 一般由 服务器ID IP NAME 开服时间 为什么要自己写个&#xff0c; MySQL的增量备份日志&#xff0c;相对太复杂了 看下 一条UPDATE 语句 随便找了表 修改了 10002 level 1 ->2 得用专门…

uniapp原生插件 - android原生插件打包流程 ( 避坑指南一)

【彩带- 避坑知识点】: 当时开发中安卓插件打包成功后&#xff0c;uniapp引用插件aar&#xff0c;用云打包 &#xff0c;总是提示不包含插件。原因是因为module的androidManifest.xml文件没有注册activity。 这一步 很重要&#xff0c;一定要注册。 --------------------------…

Mybatis枚举类型处理和类型处理器

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 文章目录 专栏精选摘要引言正文枚举类型映射简单枚举映射枚举顺序映射复杂枚举映射 类型处理器 总结 摘要 在这篇…

【C++】开源:cpp-httplib HTTP协议库配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍cpp-httplib HTTP协议库配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&a…

vmware虚拟机中Nat、桥接模式和仅主机的差别

NAT 在NAT模式下&#xff0c;主机3是Kali和Win两个操作系统的宿主机&#xff0c;那么Kali和Win可以连接到外网&#xff0c;也可以和主机3进行互联&#xff0c;但是主机1和主机2不能连接到Kali和Win。 桥接 在桥接模式下&#xff0c;主机3是Kali和Win两个操作系统的宿主机&…

PyTorch实战:基于Seq2seq模型处理机器翻译任务(模型预测)

文章目录 引言数据预处理加载字典对象en2id和zh2id文本分词 加载训练好的Seq2Seq模型模型预测完整代码结束语 引言 随着全球化的深入&#xff0c;翻译需求日益增长。传统的人工翻译方式虽然质量高&#xff0c;但效率低&#xff0c;成本高。机器翻译的出现&#xff0c;为解决这…

Windows搭建FTP服务器教学以及计算机端口介绍

目录 一. FTP服务器介绍 FTP服务器是什么意思&#xff1f; 二.Windows Service 2012 搭建FTP服务器 1.开启防火墙 2.创建组 ​编辑3.创建用户 4.用户绑定组 5.安装ftp服务器 ​编辑6.配置ftp服务器 7.配置ftp文件夹的权限 8.连接测试 三.计算机端口介绍 什么是网络…

最新AI系统ChatGPT网站H5系统源码,支持Midjourney绘画,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

12.27_黑马数据结构与算法笔记Java(补1)

目录 266 活动选择问题 分析 267 活动选择问题 贪心 268 分数背包问题 贪心 269 0-1 背包问题 贪心 270 斐波那契 动态规划 271 斐波那契 动态规划 降维 272 Bellman Ford 动态规划 分析 273 Bellman Ford 动态规划 实现1 274 Bellman Ford 动态规划 实现2 275 Leetco…

文献速递:人工智能医学影像分割---一个用于 COVID-19 CT 图像的粗细分割网络

文献速递&#xff1a;人工智能医学影像分割—一个用于 COVID-19 CT 图像的粗细分割网络 01 文献速递介绍 2019 年新型冠状病毒疾病&#xff08;COVID-19&#xff09;正在全球迅速传播。自 2019 年以来&#xff0c;已有超过一千万人感染&#xff0c;其中数十万人死亡。COVID-…

apisix 插件配置 未生效 未起作用

插件配置完成&#xff0c;却没生效&#xff0c;请检查插件的启用状态是否是启用状态&#xff0c; 以某个route配置的限速插件&#xff08;limit-req&#xff09;为例 1.打开dashboad-->路由-->某个路由-->更多-->查看&#xff0c; 查看配置&#xff0c;实际未启用…

leaflet学习笔记-初始化vue项目(一)

leaflet简介 Leaflet是一款开源的轻量级交互式地图可视化JavaScript库&#xff0c;能够满足大多数开发者的地图可视化需求&#xff0c;其最早的版本大小仅仅38 KB。Leaflet能够在主流的计算机或移动设备上高效运行&#xff0c;其功能可通过插件进行扩展&#xff0c;拥有易于使用…

Day20 222完全二叉树的节点个数 110平衡二叉树 257二叉树的所有路径

222 完全二叉树的结点个数 本题先不把它当成完全二叉树来看&#xff0c;用广度优先和深度优先搜索分别遍历&#xff0c;也能达到目的&#xff0c;只要将之前的代码稍加修改即可。注意后序遍历时的result要加上自身本身的那个结点。 //后序递归遍历 class Solution { public:in…

CGAL的D维包围盒相交计算

包围盒相交测试是一种用于快速判断两个三维对象是否相交的方法&#xff0c;而AABB树则是一种数据结构&#xff0c;常用于加速场景中的射线检测和碰撞检测。 首先&#xff0c;让我们了解一下包围盒相交测试。这种测试的目的是为了快速判断两个三维对象是否相交&#xff0c;而不需…

数据仓库 基本信息

数据仓库基本理论 数据仓库&#xff08;英语&#xff1a;Data Warehouse&#xff0c;简称数仓、DW&#xff09;,是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面向分析的集成化数据环境&#xff0c;为企业提供决策支持&#xff08;Decision Support&#xff09…