【理论】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;
  }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初始SpringBoot:详解特性和结构

🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、SpringBoot…

骑砍MOD天芒传奇-前言

基于少年包青天3-天芒传奇开发的MOD,故事发生在北宋仁宗年间,玩家需要代替包拯寻找天芒,最终完成统一大业.开局可尝试使用暴雨梨花针神器. MOD下载地址:霸王•吕布 / pellets of legend GitCodehttps://gitcode.net/qq_35829452/1-mod 效果演示:骑砍1战团mod天芒传奇-重出江湖…

车载电子电器架构 —— 电子电气系统功能开发

车载电子电器架构 —— 电子电气系统功能开发 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何…

js遍历后端返回的集合将条件相同的放入同一个数组内

项目场景: echarts折线图需要根据条件动态展示多条不同曲线 解决方案: 后端直接将使用sql将数据查询出来返回即可,因为我这里不是Java使用的C#不是很熟练后台不好写逻辑,所以在前端js完成的 代码如下: function createline(villagename, buildingname…

微服务篇之Nacos快速入门

Nacos 简介 Nacos 起源 Nacos 起源于阿里巴巴 2008 年的五彩石项目(完成微服务拆分和业务中台建设),经历了阿里十年双十⼀的洪峰流量的考验,沉淀了简单易用、稳定可靠、性能卓越等核心特性。随着云计算的兴起和受到开源软件行业…

ThinkPad产品如何升级BIOS程序

操作步骤: 重要提示: 更新BIOS存在风险!如果您的电脑在此过程中出现死机,系统崩溃或断电,则BIOS或UEFI固件程序可能会损坏,这将使您的电脑无法启动。 由于BIOS的版本或者在升级过程中出错,可能会造成不可…

009、引用

1. 引用与借用 下面的示例重新定义了一个新的 calculate_length 函数。与之前不同的是,新的函数签名使用了 String 的引用作为参数而没有直接转移值的所有权: fn main() { let s1 String::from("hello"); let len calculate_length(&s1…

气象预报与计算机技术:深度融合与未来展望

气象预报与计算机技术:深度融合与未来展望 一、引言 气象预报,作为人类对自然界气象变化的探索与预测,随着时间的推移和技术的进步,已经逐渐从单纯的经验模式转变为依赖于精密的仪器与强大的计算机技术的科学预测。在本文中,我们将深入探讨气象预报与计算机技术之间的密…

[2024区块链开发入门指引] - 比特币与区块链诞生

一份为小白用户准备的免费区块链基础教程 工欲善其事,必先利其器 Web3开发中,各种工具、教程、社区、语言框架.。。。 种类繁多,是否有一个包罗万象的工具专注与Web3开发和相关资讯能毕其功于一役? 参见另一篇博文👉 2024最全面…

数据结构:堆的三部曲 (一)堆的实现

堆的实现 1.堆的结构1.1堆的定义理解 2.堆的实现(以小根堆为例)2.1 堆结构体的定义2.2 堆的插入交换函数向上调整算法插入函数的代码 2.3 堆的删除向下调整算法:删除函数的代码: 2.4其他操作 3.测试以及完整源代码实现3.1测试代码…

山西电力市场日前价格预测【2024-01-02】

日前价格预测 预测说明: 如上图所示,预测明日(2024-01-02)山西电力市场全天平均日前电价为92.93元/MWh。其中,最高日前电价为275.90元/MWh,预计出现在18:00。最低日前电价为0.00元/MWh,预计出现…

【数据结构与算法】第1章绪论(头歌习题)【合集】

文章目录 第1关:求和任务描述编程要求代码 第2关:求倒数和的倒数任务描述编程要求完整代码 第3关:回文数任务描述编程要求完整代码 第4关:求素数个数任务描述编程要求完整代码 第5关:最大因子任务描述编程要求完整代码…

第6课 用window API捕获麦克风数据并加入队列备用

今天是2024年1月1日,新年的第一缕阳光已经普照大地,祝愿看到这篇文章的所有程序员或程序爱好者都能在新的一年里持之以恒,事业有成。 今天也是我加入CSDN的第4100天,但回过头看一看,这么长的时间也没有在CSDN写下几篇…

2023-刻苦自励,2024-奋起直追!

点击上方“嵌入式应用研究院”,选择“置顶/星标公众号” 干货福利,第一时间送达! 来源 | 嵌入式应用研究院 整理&排版 | 嵌入式应用研究院 一、引言 时光如影,岁月如梭。转眼之间,2023年已经过去,在这一…

拒绝采样(算法)总结

先说说什么是拒绝采样算法:就类似于数学上的求阴影面积的方法,直接求求不出来,就用大面积 - 小面积 阴影面积的办法。 所谓拒绝 和 采样 :就像是撒豆子计个数,计算概率问题一样,大桶里面套小桶&#xff0c…

[C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计

源码地址: github地址:https://github.com/Ahmednull/L2CS-Net L2CS-Net介绍: 眼睛注视(eye gaze) 是在各种应用中使用的基本线索之一。 它表示用户在人机交互和开放对话系统中的参与程度。此外,它还被用…

Docker 从入门到实践:Docker介绍

前言 在当今的软件开发和部署领域,Docker已经成为了一个不可或缺的工具。Docker以其轻量级、可移植性和标准化等特点,使得应用程序的部署和管理变得前所未有的简单。无论您是一名开发者、系统管理员,还是IT架构师,理解并掌握Dock…

【数据结构】栈和队列(队列的基本操作和基础知识)

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​ 目录 前言 队列 队列的概念和结构 队列的…

域名转移:将腾讯云转移至阿里云

当时注册域名时,腾讯域云相对便宜,但目前阿里云在业界更加成熟,因此将自己申请的域名由阿里云转移至阿里云,并记录转移过程。 一、域名转出 进入腾讯云,登陆后选择控制台,选择我的资源–域名注册–全部域名…

【华为机试】2023年真题B卷(python)-滑动窗口最大值

一、题目 题目描述: 有一个N个整数的数组,和一个长度为M的窗口,窗口从数组内的第一个数开始滑动直到窗口不能滑动为止, 每次窗口滑动产生一个窗口和(窗口内所有数的和),求窗口滑动产生的所有窗口…