STM32F1定时器(TIM1~TIM8)详解及应用指南
一、stm32f1定时器简介
1.1、定时器分类
STM32共11个定时器,2个高级控制定时器TIM1和TIM8,4个通用定时器TIM2~TIM5,两个基本定时器TIM6和TIM7,两个看门狗定时器和一个系统滴答定时器Systick.
高级定时器TIM1和TIM8的时钟由APB1产生,其它六个通用定时器的时钟由APB2产生。它们的最大频率都可以配置成系统时钟的频率。
定时器种类 | 位数 | 计数模式 | 捕获/比较通道 | 应用场景 |
---|---|---|---|---|
通用定时器 TIM2~TIM5 |
16 | 向上,向下,双向 | 4 | 定时计数,PWM,输入捕获,输出比较 |
高级定时器 TIM1和TIM8 |
16 | 向上,向下,双向 | 4 | 定时计数,PWM,输入捕获,输出比较 |
基本定时器 TIM6和TIM7 |
16 | 向上,向下,双向 | 4 | 定时计数 |
1.2、计数模式
通用定时器可以向上计数、向下计数、向上向下双向计数模式。
假设我们设置的TIMx_ARR初始值为100,那么向上计数就是从0计数到99后,重新从0开始计数;向下计数就是从99开始递减计数到0,然后重新从99开始递减计数;向上/向下计数就是从0递增计数到99,然后再从99递减计数到0,然后反复执行。
二、使用cubemx配置定时器
2.1、首先配置时钟树
这里配置成最高频率,72MHz。高级定时器TIM1和TIM8的时钟由APB1产生,其它六个通用定时器的时钟由APB2产生。因此所有定时器的基础频率都是72MHz.
2.2、配置定时器
这里我们配置的是定时器TIM3.
使用cubemx配置定时器后,定时器并不会自动打开,在代码中需要调用如下函数开启定时器:
HAL_TIM_Base_Start(&htim3);
2.3、实现us延时
void delay_us(uint16_t us)
{
uint16_t differ=__HAL_TIM_GET_COUNTER(&htim3);
uint32_t count = differ+us;
if(differ+us>65535)
{
while(__HAL_TIM_GET_COUNTER(&htim3)>(count-65535));
while(__HAL_TIM_GET_COUNTER(&htim3)<(count-65535));
}
else
{
while(differ+us>__HAL_TIM_GET_COUNTER(&htim3))
{
}
}
}