一、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、首先配置时钟树

stm32cubemx TIM1 不中断 stm32 tim8_自动加载

这里配置成最高频率,72MHz。高级定时器TIM1和TIM8的时钟由APB1产生,其它六个通用定时器的时钟由APB2产生。因此所有定时器的基础频率都是72MHz.

2.2、配置定时器

stm32cubemx TIM1 不中断 stm32 tim8_系统时钟_02

这里我们配置的是定时器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))
		{
			
		}
	}
}