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、计数模式

通用定时器可以向上计数、向下计数、向上向下双向计数模式。

  • 向上计数模式:计数器从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、首先配置时钟树

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NNVJcub5-1684309146749)(https://note.youdao.com/yws/res/30730/WEBRESOURCE757e276116b98f9806d4df930e62ba9d)]

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

    2.2、配置定时器

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Guup2aeN-1684309146750)(https://note.youdao.com/yws/res/30734/WEBRESOURCEf6a0f221526b86eac13416f28546d89f)]

    这里我们配置的是定时器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))
    		{
    			
    		}
    	}
    }
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32F1定时器(TIM1~TIM8)详解及应用指南

    发表评论