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

这篇具有很好参考价值的文章主要介绍了【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

STM32定时器时间计算公式

【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次,STM32 HAL库开发,嵌入式软件,stm32,嵌入式硬件,单片机


公式解释:

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

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

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

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

公式由来:

1.定时器的时钟频率是Tclk,TIM_Prescaler即为PSC的值。时钟频率被分频了PSC+1,那么此时定时器的最终频率为【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次,STM32 HAL库开发,嵌入式软件,stm32,嵌入式硬件,单片机,故可知定时器计数值加1所需的时间为【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次,STM32 HAL库开发,嵌入式软件,stm32,嵌入式硬件,单片机

注:时间等于频率的倒数

2.自动重装载值即TIM_Period即ARR,定时器从0计数到ARR时清零。由第一步已经计算出了被分频了PSC+1的最终定时器的时钟频率为【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次,STM32 HAL库开发,嵌入式软件,stm32,嵌入式硬件,单片机,这是计数一次的频率,则计数到ARR的时间为 为(ARR + 1) /  【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次,STM32 HAL库开发,嵌入式软件,stm32,嵌入式硬件,单片机(时间等于频率的倒数),故定时器溢出时间(单位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)为, 最后结果为10 000 us,即10ms。

【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次,STM32 HAL库开发,嵌入式软件,stm32,嵌入式硬件,单片机

对应的代码以及具体配置如下所示(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。文章来源地址https://www.toymoban.com/news/detail-771795.html

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;
  }
}

到了这里,关于【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32F407高级定时器-死区时间研究-STM32CubeMX

    距离上次写笔记,已经过去好长时间了 中间也折腾过不少东西,但是都没咋整理,主要是这中间都是在干活儿,不是自己想要研究的,也没想着要写。 从去年10月份开始想要学习FOC,10月份研究了一个月,到11月初,实现了SVPWM驱动BLDC电机,使用串口实现开环下转速和力矩调

    2023年04月23日
    浏览(54)
  • STM32定时器使用计算

    一、使用例程代码: 二、定时时间计算:

    2024年02月12日
    浏览(56)
  • 学习笔记|定时器|STC中断|定时器时间计算|STC32G单片机视频开发教程(冲哥)|第十一集:定时器的作用和意义

    什么是定时器:定时器-与非网 上节课的一段代码: TimeCount++然后一个延时1毫秒,每运行1ms,变量就会加一。 系统已经运行了多少个毫秒。 实际使用时的代码如下, 判断按键有沿有按下的时候,我们等待按键松开,还有一个while循环。 如果没有松开,会一直死在这一行。所以,

    2024年02月09日
    浏览(64)
  • HAL STM32基于系统滴答定时器(SysTick)实现多任务时间片轮询

    📑RTOS(实时操作系统)和定时器时间片轮询是两种不同的任务调度和执行方式的差异简介 🔖 以下部分内容,由AI给出的解答: 🔖RTOS(实时操作系统): 🌿RTOS是一种专门设计用于实时系统的操作系统,它可以有效地管理多个任务,提供任务调度、同步和通信等功能。 🌿

    2024年02月21日
    浏览(47)
  • STM32 定时器及PWM计算占空比计算周期

    文使用Cubemx+MDK5开发方式(纯新手向 记录一下) 定时器时间计算 两步 (特别特别特别注意 单位换算 简单无脑) 1MHZ = 1000KHZ 1KHZ = 1000HZ 1HZ 的周期是1秒 1s = 1000毫秒(ms) 1ms =  1000 微秒(μs) 1μs = 1000纳秒(ns) 第一步: 定时器所在时钟总线频率 / 预分频 / 定时器计数值 = 频率 //频率

    2024年02月14日
    浏览(46)
  • 【STM32】STM32学习笔记-定时器定时中断 定时器外部时钟(14)

    1.1 TIM_InternalClockConfig 1.2 TIM_TimeBaseInit 1.3 TIM_TimeBaseInitTypeDef 1.4 TIM_ClearFlag 1.5 TIM_ITConfig 1.6 TIM_Cmd 1.7 中断服务函数 参考程序 1.8 TIM_ETRClockMode2Config timer.h timer.c main.c timer.h timer.c main.c 09-定时器定时中断.rar 10-定时器外部时钟.rar 参考: 【STM32】江科大STM32学习笔记汇总

    2024年02月03日
    浏览(56)
  • 【STM32笔记】STM32的定时器开发基础(二)(基于STM32CubeMX实现定时器中断)

      传统STM32外部中断 的设计步骤:  (1)将GPIO初始化为输入端口。  (2)配置相关I/O引脚与中断线的映射关系。  (3)设置该I/O引脚对印的中断触发条件。  (4)配置NVIC,并使能中断。  (5)编写中断服务函数。   基于STM32CubeMX的外部中断 设计步骤  (1)在STM3

    2024年02月20日
    浏览(62)
  • STM32定时器-定时器中断功能详解

    STM32的众多定时器中我们使用最多的是高级定时器和通用定时器,而高级定时器一般也是用作通用定时器的功能,下面我们就以通用定时器为例进行讲解,其功能和特点包括: 通用与基本定时器(2~7)位于低速的APB1总线上 高级定时器(1、8)位于高速的APB2总线上 自动装载计

    2024年02月08日
    浏览(56)
  • STM32——定时器——定时中断

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 本节先只讲解定时器的定时中断,内外中断源选择。 TIM(Timer)定时器 定时器可以 对输入的时钟进行计数 ,并在计数值达到设定值时触发中断。 16位计数器、预分频器、自动重装寄存器的时基单元 ,

    2024年04月10日
    浏览(50)
  • STM-32:TIM定时中断—定时器定时中断/定时器外部时钟

    定时器可以对输入的时钟进行计数,并在达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等

    2024年02月09日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包