目录
STM32F407中有基本定时器,通用寄存器,高级寄存器。其中TIM6与TIM7是基本定时器。
基本定时器框图
在基本定时器中,内部时钟(CK_INT)经过控制器到达预分频器(PSC),经过分频后进入计数器(CNT COUNTER)。当计数值与自动重装寄存器的值一样,触发自重重装重新计数,同时可以触发中断 、DMA输出与事件。
设置定时时间
基本定时器是16位的定时器。预分频的值是16位,自动重装寄存器也是16位,也就是说这两个寄存器的最大值位65535。在STM32F407中,TIM6与TIM7都挂在APB1的Timer Clocks上面,它们的频率最高可以达到84MHz。当我们设置预分频值时,要注意预分频值不能超过65535。
预分频寄存器
分频后的频率 = CK_PSC/ (PSC+1) ,该值为计数的步进值。分频后的频率的倒数,也就是每计一次数需要的时间。time = 1/ 分频后的频率
自动重载寄存器
定时间 = (1/ 分频后的频率 )* (自动重载寄存器-1)
也就是说
定时时间 = (预分频寄存器+1)* (自动重载寄存器+1)/ 时钟频率
如果需要定时 1s
84MHz = 84000000Hz
1s = 1/ 1Hz = (41999+1)* (1999+1)/ 84000000 Hz
STM32CubeMx配置基本定时器
基本设置
开启中断服务函数
配置中断服务函数优先级
HAL库中基本定时器初始化
配置完程STM32CudeMX,自动生成tim.c,里面有对基本定时器初始化的函数。
HAL库中实现基本定时器中断服务过程
基本定时器完成后,会触发中断服务函数(在STM32CudeMX中中有配置中断函数),并且调用HAL_TIM_IRQHandler(&htim6)函数
为了使用定时器的功能,HAL_TIM_IRQHandler函数里除了有基本定时器功能,还有通用定时器与高级定时器其他功能的回调。而基本定时器功能使用HAL_TIM_PeriodElapsedCallback,该函数也是一个弱函数,我们需要对该函数进行重写。
下面对该函数进行重写,当基本定时器达到计数值时,对LED1进行翻转,也就是每1s,LED1翻转一次。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM6)
{
LED1_Toggle();
}
}
当我们编译下载程序进STM32F407时,发现LED1没有翻转,原因是MX_TIM6_Init函数只是对基本定时器初始化,但是没有开启定时器。
注:我们需要在需要调用HAL_TIM_Base_Start_IT(&htim6),开启基本定时器TIM6 。