定时器是每块板子上都会有的,学会定时器是必然要经历的。而关于这一部分,我认为的重点就是计算定时器时间。一个是分频系数,一个是自动重装。用好定时器对之后学习da,pwm很重要。
理论基础
话不多说,直接上图;
晶振震荡的信号作为输入,存入RCC寄存器;时钟信号进入控制器,经过PSC预分频器对信号进行预分频处理,设定自动重装值,
预分频器说明
预分频器可对计数器时钟频率进行分频,分频系数介于 1 和 65536 之间。该预分频器基于
TIMx_PSC 寄存器中的 16 位寄存器所控制的 16 位计数器。由于 TIMx_PSC 控制寄存器有
缓冲,因此可对预分频器进行实时更改。而新的预分频比将在下一更新事件发生时被采用。
计数模式
计数器从 0 计数到自动重载值(TIMx_ARR 寄存器的内容),然后重新从 0 开始计数并生成
计数器上溢事件。
每次发生计数器上溢时会生成更新事件,或将 TIMx_EGR 寄存器中的 UG 位置 1(通过软件
或使用从模式控制器)也可以生成更新事件。
通过软件将 TIMx_CR1 寄存器中的 UDIS 位置 1 可禁止 UEV 事件。这可避免向预装载寄存
器写入新值时更新影子寄存器。这样,直到 UDIS 位中写入 0 前便不会生成任何更新事件,
但计数器和预分频器计数器都会重新从 0 开始计数(而预分频比保持不变)。此外,如果
TIMx_CR1 寄存器中的 URS 位(更新请求选择)已置 1,则将 UG 位置 1 会生成更新事件
UEV,但不会将 UIF 标志置 1(因此,不会发送任何中断或 DMA 请求)。
发生更新事件时,将更新所有寄存器且将更新标志(TIMx_SR 寄存器中的 UIF 位)置 1(取
决于 URS 位)
学了这些,我们需要掌握的就是选择时钟源,选择定时器,设置预分频系数,设置自动重装值,打开定时器中断,在定时器中断的回调函数中编写逻辑代码。
cube配置
配置说明
1.这里我们选择TIM6定时器;
2.打开Activated,激活定时器;
3.Prescaler(预分频器),因为我们的晶振信号是32MHz,这里对时钟源进行预分频,取得1000Hz的信号,也就是每1/1000 s,计数器加一;
4.Counter Mode(计数模式),这里我们选择向上计数。
5.Counter Period(计数周期),这里我们设置为1000-1,计数器加到1000,也就是1秒到,触发UEV事件。
ps:这里预分频,重装值都-1,是因为分频,计次的寄存器都是从零开始的。
这样我们就得到了一个一秒的定时器,一般我们要不了这么慢的定时器,这里设定一秒也只是举例说明。
6.使能定时器,配置定时器的中断优先级。
这样定时器就配置好了,我们得到了一个一秒的定时器。
应用代码
1.在主函数中开启定时器中断
HAL_TIM_Base_Start_IT(&htim6);
2.在中断回调函数中编写逻辑代码
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM6) //检测是不是定时器6产生的中断
{
HAL_GPIO_TogglePin(LD5_GPIO_Port,LD5_Pin); //翻转LD5
}
}
这样就可以实现LD5每秒翻转一次