图1 定时器内部架构图
图2 Cubemx 可视化定时器配置
工作流程:
内部或外部驱动时钟CK_PSC驱动预分频器PSC计数分频,产生CK_CNT驱动计数器CNT计数。自动重装载寄存器在发生更新事件时将值传到计数器CNT中作为初始计数值,REP寄存器则控制CNT溢出次数,当重复次数计数器从REP寄存器的数值递减至0是计数器CNT停止计数。
1. 根据上述CubeMx工具自动产生如下代码,定时周期s = (Period + 1) * (Prscaler +1) /(Tclk定时器时钟频率Hz) = (99+1)*(63+1)/64MHz=100*10^(-6)秒=100us
/* USER CODE BEGIN TIM1_Init 1 */
/* USER CODE END TIM1_Init 1 */
htim1.Instance = TIM1; // 选择所使用的的定时器
htim1.Init.Prescaler = 63; // 对定时器输入的时钟源进行分频的分频系数,对应于图1中的1,例如输入时钟源时钟频率为64MHz,此处分频系数为63,则定时器时钟=64MHz/64 = 1MHz
htim1.Init.CounterMode = TIM_COUNTERMODE_UP; // 定时器计数方式选择为从下往上
htim1.Init.Period = 99; // 计时周期=定时器时钟*(period+1) 自动重装载值(默认值)
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0; // 代表计数值满溢出几次才进入中断,对应于图1中的3,RepetitionCounter = 0则代表一个定时周期便产生中断;RepetitionCounter =1 代表需要两个定时周期才产生中断
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; // 关闭自动重载功能
if (HAL_TIM_OC_Init(&htim1) != HAL_OK)
{
Error_Handler();
}
2.常用术语
2.1 计数模式--对应于htim1.Init.CounterMode
向上计数模式:
在向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始计数并且产生一个计数器溢出事件。
向下计数模式:
在向下模式中,计数器从自动装入的值(TIMx_ARR计数器的值)开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。
中央对齐模式:
在中央对齐模式,计数器从0开始计数到自动加载的值(TIMx_ARR寄存器)-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器下溢事件;然后再从0开始重新计数。
2.2 重复计数器功能
如果使用了重复计数器功能,在向上计数达到设置的重复计数次数(TIMx_RCR)时,产生更新事件(UEV);否则每次计数器溢出时才产生更新事件。对应于htim1.Init.RepetitionCounter