当前位置: 首页 > news >正文

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

 前言:定时器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;}
}

相关文章:

  • svg学习
  • SciPy 库中maximum_filter配合generate_binary_structure获取局部极大值
  • 【Python】基于socket函数的TCP通信
  • SpringBoot多线程与任务调度总结
  • android 手机主界面侧滑退出app问题
  • 测试bug分析
  • Anylogic Pro 8.8.x for Mac / for Linux Crack
  • 西北大学844计算机类考研-25级初试高分总攻略
  • 探究element-ui 2.15.8中<el-input>的keydown事件无效问题
  • 009:vue结合el-table实现表格行拖拽排序(基于sortablejs)
  • 微软发布安卓版Copilot,可免费使用GPT-4、DALL-E 3
  • 如何将语音版大模型AI接入自己的项目里(语音ChatGPT)
  • 计算机视觉与自然语言处理(Open AI)
  • 12月27日,每日信息差
  • 第四章 Consul服务注册与发现
  • $translatePartialLoader加载失败及解决方式
  • 「译」Node.js Streams 基础
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 230. Kth Smallest Element in a BST
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Github访问慢解决办法
  • GraphQL学习过程应该是这样的
  • PHP面试之三:MySQL数据库
  • STAR法则
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Vue ES6 Jade Scss Webpack Gulp
  • 规范化安全开发 KOA 手脚架
  • 开源地图数据可视化库——mapnik
  • 实战|智能家居行业移动应用性能分析
  • 小程序开发中的那些坑
  • 一道闭包题引发的思考
  •  一套莫尔斯电报听写、翻译系统
  • 异常机制详解
  • 7行Python代码的人脸识别
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • .NET Core中Emit的使用
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 分布式技术比较
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET大文件上传知识整理
  • .net下的富文本编辑器FCKeditor的配置方法
  • [BZOJ 1040] 骑士
  • [c语言]小课堂 day2
  • [EFI]MSI GF63 Thin 9SCXR电脑 Hackintosh 黑苹果efi引导文件
  • [Golang]K-V存储引擎的学习 从零实现 (RoseDB mini版本)
  • [HDU5685]Problem A
  • [JavaScript] JavaScript事件注册,事件委托,冒泡,捕获,事件流
  • [leetcode top100] 0924 找到数组中消失的数,合并二叉树,比特位计数,汉明距离
  • [Machine Learning][Part 8]神经网络的学习训练过程