定时器简介
?实际上,就功能上来说通用定时器包含所有基本定时器功能,而高级控制定时器包含通用定时器所有功能。所以高级控制定时器功能繁多,但也是最难理解的,本章我们先选择最简单的基本定时器进行讲解。
基本定时器
此类定时器不仅可用作通用定时器以生成时基,还可以专门用于驱动数模转换器 (DAC)。实际上,此类定时器内部连接到 DAC 并能够通过其触发输出驱动 DAC。 这些定时器彼此完全独立,不共享任何资源。
基本定时器的DAC功能在此处将不予讲解。
基本定时器(TIM6 和 TIM7)的特性
基本定时器(TIM6 和 TIM7)的特性包括:
● 16 位自动重载递增计数器
● 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数 介于 1 和 65536 之间
● 用于触发 DAC 的同步电路
● 发生如下更新事件时会生成中断/DMA 请求:计数器上溢
时钟源
计数器时钟由内部时钟 (CK_INT) 源提供。CEN(TIMx_CR1 寄存器中)和 UG 位(TIMx_EGR 寄存器中)为实际控制位,并且只能通过软件进行更改(保持自动清零的 UG 除外)。当对 CEN 位写入 1 时,预分频器的时钟就由内部时钟 CK_INT 提供。
预分频器
预分频器可对计数器时钟频率进行分频,分频系数介于 1 和 65536 之间。该预分频器基于TIMx_PSC 寄存器中的 16 位寄存器所控制的 16 位计数器。由于 TIMx_PSC 控制寄存器有缓冲,因此可对预分频器进行实时更改。而新的预分频比将在下一更新事件发生时被采用。
计数器
基本定时器计数过程主要涉及到三个寄存器内容,分别是计数器寄存器(TIMx_CNT)、 预分频器寄存器(TIMx_PSC)、自动重载寄存器(TIMx_ARR),这三个寄存器都是 16 位有效数字,即可设置值为 0 至 65535。
影子寄存器
在介绍计数器模式之前,我们必须先了解一个寄存器的功能——影子寄存器。
数据手册介绍预装载寄存器的内容可以随时传送到影子寄存器,即两者是连通的(permanently),或者在每一次更新事件(UEV)时才把预装载寄存器的内容传送到影子寄存器。事件只有更新到影子寄存器后才会发生。
设计预装载寄存器和影子寄存器的好处是,所有真正需要起作用的寄存器(影子寄存器)可以在同一个时间(发生更新事件时)被更新为所对应的预装载寄存器的内容,这样可以保证多个通道的操作能够准确地同步。如果没有影子寄存器,软件更新预装载寄存器时,则同时更新了真正操作的寄存器,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上例如中断等其它因素,多个通道的时序关系有可能会混乱。
计数模式
在定时器使能时,每来一个 CK_CNT 脉冲,TIMx_CNT 值就加 1。当 TIMx_CNT 值与 TIMx_ARR 的设定值相等 时就自动生成事件并 TIMx_CNT 自动清零,然后自动重新开始计数。
我们只要设置 CK_PSC 和 TIMx_ARR 这两个寄存器的值就可以控制事件生成的时间。?TIMx_CNT 递增至 与 TIMx_ARR 值相等,我们叫做为定时器上溢。
自动重载寄存器 TIMx_ARR 用来存放于计数器值比较的数值,如果两个数值相等就生成事件,将相关事件标志位置位,生成 DMA 和中断输出。
?定时器周期计算
HAL库初始化结构体
typedef struct {
uint16_t Prescaler; // 预分频器
uint16_t CounterMode; // 计数模式
uint32_t Period; // 定时器周期
uint16_t ClockDivision; // 时钟分频
uint8_t RepetitionCounter; // 重复计算器
} TIM_Base_InitTypeDef;
|