一、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、计数模式
通用定时器可以向上计数、向下计数、向上向下双向计数模式。
- 向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
- 向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
- 中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
假设我们设置的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.
- Prescaler 预分频系数-1,我们配置的时钟为72MHz,这里设置成72-1,得到的定时器时钟频率为1MHz;
- Counter Mode 计数模式,Up表示向上计数,Down表示向下计数,
- Counter Period 计数周期,TIMx_ARR寄存器的值,定时器的位数为16位,因此最大值为65535
使用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))
{
}
}
}