一、定时器分类
定时器主要分为三类定时器:
基本定时器(TIM6,TIM7),通用定时器(TIM2~TIM5),高级定时器(TIM1,TIM8)。
基本定时器(TIM6,TIM7)
可以看到,基本定时器只能起到定时的作用,并不能像另两种定时器一样产生PWM等,计数器模式也只有“向上”一种。
通用定时器(TIM2~TIM5)
位于低速的APB1总线上。
16 位向上、向下、中心对齐计数模式,自动装载计数器(TIMx_CNT)。
16 位可编程预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。
4 个独立通道(TIMx_CH1~4),这些通道可以用来作为:输入捕获、输出比较、PWM、单脉冲模式输出
可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
输入捕获:就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。
输出比较:有一寄存器先存放你要定时的数,例如50,定时器在内部时钟下由0开始慢慢向上加,每加一次都会和那个寄存器比较,当等于那个寄存器值时 如50,此管脚就会跳变(输出一高电平或低电平),在PWM中会经常用到。
高级定时器(TIM1,TIM8)
二、定时器的时钟
TIM2~TIM7是挂在APB1上的,TIM1和TIM8是挂在APB2上的。
在STM32CubeMX中,TIM的Internal Clock来自下方的APBx Timer clock(MHz)。
三、定时器的时钟
时钟源(对应STM32CubeMX中Clock Source)
内部时钟源 CK_INT:在STM32CubeMX中就是Internal Clock。
外部时钟模式 1:外部输入引脚 TIx(x=1,2,3,4),在STM32CubeMX中就是Trig Source。
外部时钟模式 2:外部触发输入 ETR,在STM32CubeMX中就是Trig Source。
内部触发输入(ITRx),在STM32CubeMX中就是Trig Source。
时基单元Time-base unit
预分频器寄存器 (TIMx_PSC):设置分频器对时钟源的分频比或分频系数。
计数器寄存器 (TIMx_CNT):向上计数、向下计数或者中心对齐计数
自动重载寄存器 (TIMx_ARR):自动重装寄存器,为计数器设置计数边界或初始值,决定计数脉冲的多少或计时周期长短。比如计数器向上计数时,记到多少发生溢出;向下计数时从多少开始往下计数。带预装载使能控制位ARPE@TIMx_CR1。
重复计数器寄存器 (TIMx_RCR):重复计数器,重复计数器是个向下计数器,当计数器发生 TIMx_RCR+1次溢出动作后会触发更新操作。
捕捉/比较寄存器(TIMx_CCR):带预装载使能控制位OCxPE@TIMx_CCMR
输入捕获
TIMx_CH1——TIMx_CH4 这四个通道,在芯片中都有对应的引脚,当脉冲从通道口进入时,经过输入滤波器(抗干扰的作用),然后经过边沿检测器检测到上升沿(下降沿),经过分频器,输入到公用部分中的捕获寄存器中,然后捕获寄存器记录此刻CNT计数器的值,当下一次下降沿(上升沿)过来时,也记录下CNT计数器的值,这样就可以计算出输入脉冲的宽度。
4. 输出比较
比如在比较寄存器中预先设定一个值,计数器从初始值到装载值之间计数时,当正好等于比较寄存器中的预设值时,控制TIMx_CH1~TIMx_CH4通道输出低电平或者高电平,这样随着计数器不断的计数,就可以获得一个脉冲,通过调整预设值,就可以调整脉冲宽度,调整初始值和装载值就可以调整周期就如同一个闹钟一样。(注意输入捕获和输出比较不可以同时进行)
链接:STM32基础定时器详解_stm32定时器_strongercjd的博客-CSDN博客
STM32笔记 (十一)高级定时器详解_dts_ck_CYRIL0124的博客-CSDN博客
stm32初学之定时器TIM的基本定时功能以及介绍_stm32 tim_码农_风口的朱的博客-CSDN博客
STM32——基本定时器(TIM6,TIM7)工作过程,解读功能框图,时序分析,周期计算_stm32 tim7_青篱竹枫的博客-CSDN博客
四、使用定时器实现LED等闪烁
CubeMX配置
先选择TIM2的时钟为Internal Clock,同时在时钟树上设置APB1 Timer时钟为1MHz。
设置预分频值为1000(填的999,实际中会+1),经过分频后的频率为1MHz/1000=1KHz。
先设置TIMx_ARR的值为1000(同上),也就是当TIMx_CNT从0开始计算,刚好等于1000时生成事件,总共计数1000次。
此时,一个时钟源周期为1ms,经过1000个周期刚好得到1s的定时周期。
此外,打开该定时器的中断。设置PB5为GPIO Output作为LED灯的输出引脚。
代码
TIMx、GPIO时钟使能
MX_GPIO_Init();
MX_TIM2_Init();
初始化定时器参数,设置自动重装值,分频系数,计数方式等
void MX_TIM2_Init(void)
{
/* 其他代码省略*/
/* USER CODE BEGIN TIM2_Init 1 */
/* USER CODE END TIM2_Init 1 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 1000-1; //预分频
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 1000;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
}
TIMx中断优先级设置
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM2)
{
/* TIM2 clock enable */
__HAL_RCC_TIM2_CLK_ENABLE();
/* TIM2 interrupt Init */
HAL_NVIC_SetPriority(TIM2_IRQn, 1, 0); //设置中断优先级
HAL_NVIC_EnableIRQ(TIM2_IRQn);
}
}
手动打开定时器中断
HAL_TIM_Base_Start_IT(&htim2); //位置在main函数内
编写中断服务函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
}
}