三种STM32定时器区别


在这里插入图片描述


通用定时器功能特点描述


  1、STM3 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能特点包括:
  2、位于低速的APB1总线上(APB1)
  3、16 位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)。
  4、16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数 为 1~65535 之间的任意数值。
   5、4 个独立通道(TIMx_CH1~4),这些通道可以用来作为:
    ①输入捕获
     ②输出比较
     ③PWM 生成(边缘或中间对齐模式)
     ④单脉冲模式输出
  6、可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
  7、如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器):
    ①更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
    ②触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
    ③输入捕获
    ④输出比较
    ⑤支持针对定位的增量(正交)编码器和霍尔传感器电路
    ⑥触发输入作为外部时钟或者按周期的电流管理
  8、STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。
  9、使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。


计数器模式


  通用定时器可以向上计数、向下计数、向上向下双向计数模式。
  ①向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
  ②向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
  ③中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。


向下计数模式(时钟分频因子=1)


在这里插入图片描述


向上计数模式(时钟分频因子=1)


在这里插入图片描述


中央对齐计数模式(时钟分频因子=1 ARR=6)


在这里插入图片描述


通用定时器工作过程:


在这里插入图片描述
分成四个部分:时钟选择、实际电路、输入捕获、输出比较。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


定时器中断实验


时钟选择(默认①,可在寄存器SMCR中配置)


  计数器时钟可以由下列时钟源提供:
    ①内部时钟(CK_INT)
    ②外部时钟模式1:外部输入脚(TIx)
    ③外部时钟模式2:外部触发输入(ETR)
    ④内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。


内部时钟选择


在这里插入图片描述
在这里插入图片描述
  默认调用SystemInit函数情况下:
    SYSCLK=72M
    AHB时钟=72M
    APB1时钟=36M
  所以APB1的分频系数=AHB/APB1时钟=2
  所以,通用定时器时钟CK_INT=2_36M=72M


定时器中断实验相关寄存器


计数器当前值寄存器CNT


在这里插入图片描述


预分频寄存器TIMx_PSC


在这里插入图片描述


自动重装载寄存器(TIMx_ARR)


在这里插入图片描述


控制寄存器1(TIMx_CR1)


在这里插入图片描述


DMA中断使能寄存器(TIMx_DIER)


在这里插入图片描述


常用库函数


相关函数是在FWLIB文件夹下的stm32f10x_tim.c中可以找到。


定时器参数初始化:


void TIM_TimeBaseInit(TIM_TypeDef_ TIMx, TIM_TimeBaseInitTypeDef_ TIM_TimeBaseInitStruct);


在这里插入图片描述
在这里插入图片描述


定时器使能函数:


void TIM_Cmd(TIM_TypeDef_ TIMx, FunctionalState NewState)


定时器中断使能函数:


void TIM_ITConfig(TIM_TypeDef_ TIMx, uint16_t TIM_IT, FunctionalState NewState);


状态标志位获取和清除


FlagStatus TIM_GetFlagStatus(TIM_TypeDef_ TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef_ TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef_ TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef_ TIMx, uint16_t TIM_IT);


定时器中断实验实现步骤


使能定时器时钟
    RCC_APB1PeriphClockCmd();
初始化定时器,配置ARR(自动装载值),PSC(预分频系数)
    TIM_TimeBaseInit();
开启定时器中断,配置NVIC
    void TIM_ITConfig();
    NVIC_Init();(中断优先级设置【之前还要main.c设置中断优先级分组】)
使能定时器
    TIM_Cmd();
编写中断服务函数
    TIMx_IRQHandler();


通用定时器PWM概述


STM32 PWM工作过程



在这里插入图片描述
ARR:决定周期,CRRx:决定占空比
在这里插入图片描述
在这里插入图片描述


PWM模式1 & PWM模式2


寄存器TIMx_CCMR1的OC1M[2:0]位来分析:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


自动重载的预装载寄存器


在这里插入图片描述
在这里插入图片描述


void TIM_ARRPreloadConfig(TIM_TypeDef_ TIMx, FunctionalState NewState);
  • 1

简单的说,ARPE=1,ARR立即生效。。。APRE=0,ARR下个比较周期生效。


PWM输出库函数


void TIM_OCxInit(TIM_TypeDef_ TIMx, TIM_OCInitTypeDef_ TIM_OCInitStruct);
  • 1


在这里插入图片描述


设置比较值函数:


void TIM_SetCompareX(TIM_TypeDef_ TIMx, uint16_t Compare2);
  • 1

使能输出比较预装载:


void TIM_OC2PreloadConfig(TIM_TypeDef_ TIMx, uint16_t TIM_OCPreload);
  • 1

使能自动重装载的预装载寄存器允许位:


void TIM_ARRPreloadConfig(TIM_TypeDef_ TIMx, FunctionalState NewState);
  • 1

PWM输出配置步骤:


  ① 使能定时器3和相关IO口时钟
    使能定时器3时钟:RCC_APB1PeriphClockCmd();
    使能GPIOB时钟:RCC_APB2PeriphClockCmd();
  ② 初始化IO口为复用功能输出。函数:GPIO_Init();
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  ③这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,所以需要开启AFIO时钟。同时设置重映射
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
  ④ 初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
  ⑤ 初始化输出比较参数:TIM_OC2Init();
  ⑥ 使能预装载寄存器
    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
  ⑦ 使能定时器。TIM_Cmd();
  ⑧ 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();


STM32 输入捕获工作过程(通道1为例)


在这里插入图片描述
  一句话总结工作过程:通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。


步骤1:设置输入捕获滤波器(通道1为例)


在这里插入图片描述在这里插入图片描述


步骤2:设置输入捕获极性(通道1为例)


在这里插入图片描述
在这里插入图片描述


步骤3:设置输入捕获映射通道(通道1为例)


在这里插入图片描述
在这里插入图片描述


步骤4:设置输入捕获分频器(通道1为例)


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


步骤5:捕获到有效信号可以开启中断


在这里插入图片描述


最后:看看定时器通道对应引脚TIM5为例


在这里插入图片描述


输入捕获关键库函数


输入捕获通道初始化函数:


void TIM_ICInit(TIM_TypeDef_ TIMx, TIM_ICInitTypeDef_ TIM_ICInitStruct);
  • 1

在这里插入图片描述
在这里插入图片描述


通道极性设置独立函数:


void TIM_OCxPolarityConfig(TIM_TypeDef_ TIMx, uint16_t TIM_OCPolarity)
  • 1

获取通道捕获值


uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx)
  • 1

输入捕获的一般配置步骤:


  ① 初始化定时器和通道对应IO的时钟
  ② 初始化IO口,模式为输入:GPIO_Init();
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入
  ③初始化定时器ARR,PSC
    TIM_TimeBaseInit();
  ④初始化输入捕获通道
    TIM_ICInit();
  ⑤如果要开启捕获中断
    TIM_ITConfig();
    NVIC_Init();
  ⑥使能定时器:TIM_Cmd();
  ⑦编写中断服务函数:TIMx_IRQHandler();