赞
踩
选择 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"选项勾选,具有以下作用:
使能中断:勾选"Enabled"选项表示启用TIM1的更新中断功能。更新中断是TIM1定时器溢出时触发的中断事件,它允许您在每个定时周期结束时执行相应的中断服务程序(ISR)。
定时器中断处理:通过使能TIM1的更新中断,您可以编写和配置TIM1的中断服务程序(ISR)。在ISR中,您可以执行与定时器相关的操作,例如更新计数器、处理定时器事件、触发其他操作等。中断处理程序允许您在定时器每次溢出时进行特定的操作,实现定时功能或进行周期性任务。
提高定时器精度和可靠性:使用定时器中断可以提供更精确和可靠的定时功能。通过定时器的硬件定时功能和中断机制,可以避免在软件中轮询定时器状态,从而降低了处理器的负载并提高了系统的响应性。
需要注意的是,在勾选"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库提供的,在特定的事件发生时自动调用。下面是每个回调函数的功能说明:
这些方法都是HAL库中的回调函数,需要用户自行实现。这些方法在HAL库中被定义为虚函数(virtual function),以便用户可以在自己的应用程序中根据需要进行重写。
当相应的事件发生时,HAL库会调用这些回调函数。用户需要在应用程序中实现这些回调函数,并根据实际需求编写适当的代码来处理相应的事件。
假设我希望每过一秒钟打印一次
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一下即可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。