当前位置:   article > 正文

【嵌入式学习-STM32CubeMX篇】定时器的配置和使用_stm32cubemx 配置定时器

stm32cubemx 配置定时器

配置

选择 TIM1,并将里面的clock source 改成 Internal clock

在这里插入图片描述

之后选择NVIC Settings 将TIM1 update interrupt 的enabled勾选。

一些介绍和解释
在STM32微控制器中,NVIC(Nested Vectored Interrupt Controller)是用于管理和配置中断的重要组件。TIM1(Timer 1)是一个定时器,它可以产生定时中断。选择NVIC设置中的TIM1 Update Interrupt的"Enabled"选项勾选,具有以下作用:

  1. 使能中断:勾选"Enabled"选项表示启用TIM1的更新中断功能。更新中断是TIM1定时器溢出时触发的中断事件,它允许您在每个定时周期结束时执行相应的中断服务程序(ISR)。

  2. 定时器中断处理:通过使能TIM1的更新中断,您可以编写和配置TIM1的中断服务程序(ISR)。在ISR中,您可以执行与定时器相关的操作,例如更新计数器、处理定时器事件、触发其他操作等。中断处理程序允许您在定时器每次溢出时进行特定的操作,实现定时功能或进行周期性任务。

  3. 提高定时器精度和可靠性:使用定时器中断可以提供更精确和可靠的定时功能。通过定时器的硬件定时功能和中断机制,可以避免在软件中轮询定时器状态,从而降低了处理器的负载并提高了系统的响应性。

需要注意的是,在勾选"Enabled"选项后,还需要正确配置中断优先级和编写相应的中断服务程序来处理TIM1的更新中断。这涉及到使用HAL库或直接编程来配置中断优先级和编写中断处理程序,以便在中断发生时执行特定的操作。

总结而言,勾选NVIC设置中的TIM1 Update Interrupt的"Enabled"选项可以启用TIM1的更新中断功能,允许您编写中断服务程序以处理定时器的定时中断事件。这有助于实现精确的定时功能和周期性任务

在这里插入图片描述

如何设置定时器的定时时间

这就和这两个参数有关了

在这里插入图片描述

在STM32微控制器上,定时器的定时时间可以通过以下公式计算得出:

定时周期 = (预分频系数 +1) × (计数周期+1 ) / APB时钟频率

为什么加一?

这是因为预分频系数和计数周期都是从0开始计数的,所以在计算定时周期时需要将它们加1。

我们可以把公式简化一下,因为我们知道频率是时间的倒数,我们将公式两边取到数,所以我们可以把公式写成这样子:

频率 = APB时钟频率/(预分频系数 +1)/ (计数周期+1 )

例如,假设希望使用定时器实现1毫秒的定时,且APB时钟频率为72 MHz,可以按照以下步骤进行设置:
1000 = 72000000 / (预分频系数 +1) / (计数周期+1 )
这里1000也就是1毫秒的倒数啦
而 (预分频系数 +1) 和 (计数周期+1 ) 可以分别取 72 和 1000
所以我们得到 预分频系数 = 71, 计数周期 = 999

其中:

  • 预分频系数(Prescaler):用于将定时器的时钟频率分频,以降低计数速度。可以通过设置TIMx_PSC寄存器来配置预分频系数。预分频系数的范围根据具体的定时器型号而定,一般为16位或32位。

  • 计数周期(Counter Period):定时器的计数器从0开始计数,通过设置TIMx_ARR寄存器来配置计数周期的值。计数周期的范围由定时器的位数决定,例如16位定时器的计数周期范围为0到65535。

  • APB时钟频率:STM32微控制器的主总线时钟频率。它由系统时钟(SYSCLK)通过预分频器分频得到。可以通过RCC寄存器配置APB时钟频率。不同型号的STM32微控制器可能有不同的APB时钟频率。

通过调整预分频系数和计数周期的值,您可以设置定时器的定时时间。预分频系数决定每个计数周期的持续时间,计数周期决定计数器溢出所需的时间。将两者结合,可以得到所需的定时时间。

在CubeMX中不需要再手动在寄存器中设置,直接在Paramer Settings中设置即可。

在这里插入图片描述

我们发现项目中多了一个tim.c文件

在这里插入图片描述

这些方法是HAL库(Hardware Abstraction Layer)中用于处理定时器(TIM)相关事件的回调函数。它们是由HAL库提供的,在特定的事件发生时自动调用。下面是每个回调函数的功能说明:

  1. HAL_TIM_PeriodElapsedCallback():在定时器溢出时触发,即当定时器的计数器从最大值溢出到0时调用。这个回调函数通常用于实现定时器的定时中断功能。
  2. HAL_TIM_PeriodElapsedHalfCpltCallback():在定时器计数器的下一半(一般为计数周期的一半)溢出时触发。这个回调函数通常用于实现周期性任务的中断功能。
  3. HAL_TIM_OC_DelayElapsedCallback():在定时器输出比较(Output Compare)延迟时间到达时触发。这个回调函数通常用于实现输出比较中断功能。
  4. HAL_TIM_IC_CaptureCallback():在定时器输入捕获(Input Capture)事件发生时触发。这个回调函数通常用于捕获外部事件的时间戳或测量输入信号的频率等。
  5. HAL_TIM_IC_CaptureHalfCpltCallback():在定时器输入捕获计数器的下一半(一般为计数周期的一半)溢出时触发。这个回调函数通常用于捕获外部事件的时间戳或测量输入信号的频率等。
  6. HAL_TIM_PWM_PulseFinishedCallback():在定时器PWM输出完成一个周期后触发。这个回调函数通常用于实现PWM输出完成后的处理操作。
  7. HAL_TIM_PWM_PulseFinishedHalfCpltCallback():在定时器PWM输出完成一个周期的下一半(一般为计数周期的一半)时触发。这个回调函数通常用于实现PWM输出周期性操作的中断功能。
  8. HAL_TIM_TriggerCallback():在定时器触发(Trigger)事件发生时触发。这个回调函数通常用于处理外部触发事件。
  9. HAL_TIM_TriggerHalfCpltCallback():在定时器触发计数器的下一半(一般为计数周期的一半)溢出时触发。这个回调函数通常用于处理外部触发事件。
  10. HAL_TIM_ErrorCallback():在定时器发生错误时触发。这个回调函数通常用于处理定时器相关的错误情况。

这些方法都是HAL库中的回调函数,需要用户自行实现。这些方法在HAL库中被定义为虚函数(virtual function),以便用户可以在自己的应用程序中根据需要进行重写。

当相应的事件发生时,HAL库会调用这些回调函数。用户需要在应用程序中实现这些回调函数,并根据实际需求编写适当的代码来处理相应的事件。

在这里插入图片描述

假设我希望每过一秒钟打印一次

  1. 首先先打开定时器,在main.c文件中开启定时器
	HAL_TIM_Base_Start_IT(&htim1);
	printf("TIM START");
  • 1
  • 2

在这里插入图片描述
2. 将void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);复制到time.c中,编写方法体。

int timeCount = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
	if(htim->Instance == TIM1){
		timeCount++;
		if(timeCount==1000){
			timeCount = 0;
			printf("time + 1s\n");
		}
	}
	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述
之后build在download一下即可。

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/739135
推荐阅读
相关标签
  

闽ICP备14008679号