基本概念
兆赫兹
1MHZ(兆赫兹)是频率的单位,表示每秒周期性震动1,000,000次。
预分频器
不分频
2分频,两个脉冲输出一次
三分频
自动重装载寄存器
当计时器里的计数器=自动重装载寄存器值,计数器清零
定时器分类
种类 | 位数 | 计数器模式 | 产生DMA请求 | 捕获/比较通道 | 互补输出 | 特殊应用场景 |
---|---|---|---|---|---|---|
高级定时器(TIM1,TIM8) | 16 | 向上,向下,向上/向下 | 可以 | 4 | 有 | 带死区控制盒紧急刹车,可应用于PWM电机控制 |
通用定时器(TIM2~TIM5) | 16 | 向上,向下,向上/向下 | 可以 | 4 | 无 | 通用。定时计数,PWM输出,输入捕获,输出比较 |
基本定时器(TIM6,TIM7) | 16 | 向上,向下,向上/向下 | 可以 | 0 | 无 | 主要应用于驱动DAC |
通用和基本时钟源:APB1
高级定时器时钟源:APB2
定时器配置
时钟源:内部时钟
假如记录1秒
1秒=自动重装载寄存器 / 输入HZ
1秒=自动重装载寄存器 / (时钟源 / 预分频器)
1秒 = 10000 / (72000000 / 7200)
1秒 = 10000 / (84000000 / 8400)
配置
Prescaler (PSC - 16 bits value) 预分频器
Counter Period 自动重装载寄存器
auto-reload preload 自动重新加载预加载
开启中断
LED测试代码
开启GPIO测试灯
测试中断
c
int index = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim2)
{
if(index == 1)
{
index = 0;
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8, GPIO_PIN_SET);
}else{
index = 1;
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8, GPIO_PIN_RESET);
}
}
}
启动定时器
c
HAL_TIM_Base_Start_IT(&htim2);
串口测试代码
开启串口
串口打印
c
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim2)
{
printf("Hello word STM32 \r\n");
}
}
结果
测试案例