STM32精英版(正点原子STM32F103ZET6开发板)学习篇11——定时器(中断、PWM、输入捕获)

三种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);

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

PWM输出库函数

void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);


在这里插入图片描述

设置比较值函数:

void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Compare2);

使能输出比较预装载:

void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

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

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

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);

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

通道极性设置独立函数:

void TIM_OCxPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity)

获取通道捕获值

uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx)

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

  ① 初始化定时器和通道对应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();

  • 1
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值