【嵌入式学习-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");

在这里插入图片描述
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");
		}
	}
	
}

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

在这里插入图片描述

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,我了解到在STM32中可以使用STM32CubeMX进行配置和设置定时器TIM1。 首先,可以参考《STM32中文参考手册_V10》的章节1.1,该章节介绍了基础定时器TIM6的应用。然而,与TIM1有关的具体配置信息在这个章节中可能不会提到。 其次,根据引用提供的信息,可以使用STM32CubeMX进行图形化配置。打开STM32CubeMX,并创建一个新项目。然后,在图形配置中,调试时钟信号和时钟树,以及调试接口进行配置。 最后,根据引用提供的代码示例,可以自定义函数来调节PWM的占空比。具体来说,可以使用类似的代码来配置TIM1的通道和占空比。请注意,TIM_SetTIM3Compare1函数中的参数范围应在0到Counter Period之间。 综上所述,通过使用STM32CubeMX进行图形化配置,并根据需求调整代码中的通道和占空比,可以完成对STM32定时器TIM1的配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [STM32CubeMX定时器TIM](https://blog.csdn.net/qq_42900996/article/details/110259963)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [cubemx配置stm32(四)__STM32定时器中断TIMER](https://blog.csdn.net/li520_fei/article/details/122298788)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值