一、通用定时器基本原理

1-1 三种定时器区别

1.三种STM32定时器区别

定时器种类 位数 计数器模式 产生DMA请求 捕获/比较通道 互补输出 特殊应用场景
高级定时器(TIM1,TIM8) 16 向上,向下,向上/下 可以 4 带死区控制盒紧急刹车,可应用于PWM电机控制
通用定时器(TIM2~TIM5) 16 向上,向下,向上/下 可以 4 通用。定时计数,PWM输出,输入捕获,输出比较
基本定时器(TIM6,TIM7) 16 向上,向下,向上/下 可以 0 主要应用于驱动DAC

2.通用定时器功能特点描述

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

3.计数器模式

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

4.通用定时器工作过程

计数器时钟可以由下列时钟源提供:
①内部时钟(CK_INT)

默认调用Systemlnit函数情况下:
SYSCLK=72M
AHB时钟=72M
APB1时钟=36M
所以APB1的分频系数=AHB/APB1时钟=2。所以,通用定时器时钟CK_INT=2*36M=72M
②外部时钟模式1:外部输入脚(TIx)
③外部时钟模式2:外部触发输入(ETR)
④内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。
5.定时器中断实验相关寄存器

  • 计数器当前值寄存器TIMx_CNT

  • 预分频寄存器TIMx_PSC

  • 自动重装载寄存器TIMx_ARR

  • 控制寄存器TIMx_CR1


  • DMA中断使能寄存器

6.常用库函数

  • 定时器参数初始化
void TIMx_TimeBaseInit(TIM_TypeDef*TIMx,TIMx_TimeBaseInitTypeDef*TIMx_TimeBaseInitStruct);
typedef struct
{//预分频系数uint16_t TIM_Prescaler;         /*!< Specifies the prescaler value used to divide the TIM clock.This parameter can be a number between 0x0000 and 0xFFFF *///计数模式uint16_t TIM_CounterMode;       /*!< Specifies the counter mode.This parameter can be a value of @ref TIM_Counter_Mode *///自动装载值uint16_t TIM_Period;            /*!< Specifies the period value to be loaded into the activeAuto-Reload Register at the next update event.This parameter must be a number between 0x0000 and 0xFFFF.  */ uint16_t TIM_ClockDivision;     /*!< Specifies the clock division.This parameter can be a value of @ref TIM_Clock_Division_CKD */uint8_t TIM_RepetitionCounter;  /*!< Specifies the repetition counter value. Each time the RCR downcounterreaches zero, an update event is generated and counting restartsfrom the RCR value (N).This means in PWM mode that (N+1) corresponds to:- the number of PWM periods in edge-aligned mode- the number of half PWM period in center-aligned modeThis parameter must be a number between 0x00 and 0xFF. @note This parameter is valid only for TIM1 and TIM8. */
} TIM_TimeBaseInitTypeDef;
  • 定时器使能函数
void TIM_Cmd(TIM_TypeDef*TIMx,FunctionalState NewState);
  • 定时器中断使能函数
void TIM_ITConfig(TIM_TypeDef*TIMx,unit_16 TIM_IT,FunctionalState NewState);
  • 状态标志位获取或清除
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);

7.定时器中断实现步骤

  • 使能定时器时钟
RCC_APB1PeiphClockCmd();
  • 初始化定时器,配置ARR,PSC
TIM_TimeBaseInit();
  • 开启定时器中断
void TIM_ITConfig();
NVIC_Init();
  • 使能定时器
TIM_Cmd();
  • 编写中断服务函数
TIMx_IRQHandler();

二、通用定时器PWM概述

1.STM32 PWM工作过程

在输出模式下,TIMx_CCRx寄存器的值与CNT的值比较,若CCRx的值大于CNT的值,则产生高电平,反之则为低电平,故通过修改这个寄存器的值,就可以控制 PWM 的输出脉宽。
以通道1为例:

CCR1:捕获比较(值)寄存器(x=1,2,3,4):设置比较值。CCMR1:OC1M[2:0]位:
对于PWM方式下,用于设置PWM模式1【110】或者PWM模式2【111】

CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效。
CCER:CC1E位:输入/捕获1输出使能。0:关闭,1:打开。

2.相关寄存器

PWM模式:脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。

在TIMx_CCRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。
void TIM_OC2PreloadConfig(TIM_TypeDefTIMx,uint16_t TIM_OCPreload);
void TIM_ARRPreloadConfig(TIM_TypeDef
TIMx,FunctionalState NewState);
TIMx_CR1寄存器的ARPE位1时,ARR立即生效,APRE=0时,ARR下个比较周期生效。
3.STM32定时器3输出通道引脚

复用功能 TIM3_REMAP[1:0]=00(没有重映像) TIM3_REMAP[1:0]=10(部分重映像) TIM3_REMAP[1:0]=11(完全重映像)
TIM3_CH1 PA6 PB4 PC6
TIM3_CH2 PA7 PB5 PC7
TIM3_CH3 PB0 PB0 PC8
TIM3_CH4 PB1 PB1 PC9

(其他定时器的引脚通过查找Datasheet表格可知)
4.PWM输出库函数

//初始化
void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
typedef struct
{uint16_t TIM_OCMode; //PWM模式1或者模式2      uint16_t TIM_OutputState; //输出使能uint16_t TIM_OutputNState; uint16_t TIM_Pulse;//比较值,写CCRx        uint16_t TIM_OCPolarity;//比较输出极   uint16_t TIM_OCNPolarity;    uint16_t TIM_OCIdleState;   uint16_t TIM_OCNIdleState;
} TIM_OCInitTypeDef;
//设置比较值函数
void TIM_SetCompareX(TIM_TypeDef*TIMx,uint16_t Compare2);

5.PWM输出配置步骤

  • 使能定时器3和相关IO口时钟。
    使能定时器3时钟:RCC_APB1PeriphClockCmd();
    使能IO口时钟: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_PartiaRemap_TIM3,ENABLE);
  • 初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
  • 初始化输出比较参数:TIM_OC2Init();
  • 使能预装载寄存器:TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
  • 使能定时器。TIM_Cmd();
  • 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();

三、输入捕获实验

3-1 输入捕获工作过程


一句话总结工作过程:通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升浴下降沿)的时候,将当前太时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器 (TIMxCCRx)里面,完成一次捕获
1.设置输入捕获滤波器

输入捕获 1 滤波器 IC1F[3:0],这个用来设置输入采样频率和数字滤波器长度。其中,fCLK_INTf_{CLK\_INT}fCLK_INT​是定时器的输入频率(TIMxCLK),一般为 72Mhz,而 fDTSf_{DTS}fDTS​则是根据 TIMx_CR1 的 CKD[1:0]的设置来定的,如果 CKD[1:0]设置为 00,那么fDTS=fCLK_INTf_{DTS}=f_{CLK\_INT}fDTS​=fCLK_INT​。N 值就是滤波长度,举个简单的例子:假设 IC1F[3:0]=0011,并设置 IC1 映射到通道 1 上,且为上升沿触发,那么在捕获到上升沿的时候,再以 fCLK_INTf_{CLK\_INT}fCLK_INT​的频率,连续采样到 8 次通道 1 的电平,如果都是高电平,则说明却是一个有效的触发,就会触发输入捕获中断(如果开启了的话)。这样可以滤除那些高电平脉宽低于 8 个采样周期的脉冲信号,从而达到滤波的效果。
2.设置输入捕获极性(通道1为例)

CCER寄存器的位1

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

CCMR1寄存器的位[1:0]

一般情况下通道1就映射到IC1,通道2映射到IC2。
4.设置输入捕获分频器(通道1为例)



5.捕获到有效信号可以开启中断

3-2 输入捕获关键库函数

1.输入捕获通道初始化函数

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);
typedef struct
{uint16_t TIM_Channel;      //捕获通道1-4      uint16_t TIM_ICPolarity;   //捕获极性uint16_t TIM_ICSelection;  //映射关系uint16_t TIM_ICPrescaler;  //分频系数uint16_t TIM_ICFilter;     //滤波器
} TIM_ICInitTypeDef;

2.通道极性设置独立函数

void TIM_OCxPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

跟上面初始化函数中设置通道极性有什么区别呢?
3.获取通道捕获值

uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);

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

考虑溢出

STM32-定时器中断实验相关推荐

  1. STM32——定时器中断实验

    一.内部时钟选择 (计数器时钟可以有多个时钟源提供:内部时钟.外部时钟模式1.外部时钟模式2.内部触发模式.本次以内部时钟为时钟源,进行学习) 1.选择内部时钟  2.设置预分频系数.自动重装载值  ...

  2. STM32定时器中断实验-学习笔记

    目录 目录 目录 通用定时器简介 寄存器 控制寄存器 (TIMx_CR1) DMA/中断使能寄存器(TIMx_DIER) 预分频寄存器(TIMx_PSC) TIMx_CNT 寄存器 自动重装载寄存器( ...

  3. STM32定时器中断实验

    情况如下:通过定时器中断配置,每500ms中断一次,然后中断服务函数中控制LED实现LED1状态取反(闪烁)[其中,我们可以在里面创新一下,我创新的是蜂鸣器200ms响一次,然后500ms,LED1取 ...

  4. STM32定时器中断

    目录 一.关于STM32定时器中断 1.定时器分类 2.通用定时器的功能特点 3.定时器中断的触发 4.定时时钟计算方法 二.CubeMX初始化配置 1.芯片选型(我们这里运用的STM32F103C8 ...

  5. 基于STM32F103ZET6库函数定时器中断实验

    基于STM32F103ZET6库函数定时器中断实验 STM32F1 通用定时器简介 定时器相关的库函数主要集中在固件库文件 stm32f10x_tim.h 和 stm32f10x_tim.c 文件中 ...

  6. STM32 定时器中断

    通用定时器工作过程: 时钟选择: 计数器时钟可以由下列时钟源提供: 内部时钟(CK_INT) 外部时钟模式1:外部输入脚(TIx) 外部时钟模式2:外部触发输入(ETR) 内部触发输入(ITRx):使 ...

  7. STM32CubeMX 实战教程:定时器中断实验(LL 库)

    1.资源的获取:关注博主并点赞对应博客,并在文章下留言邮箱索取: 2.资源的类型:获取资源仅限于免费公开文章或粉丝免费专享文章,不包括付费文章:   博主分享不易,请给三连哦(关注 + 点赞 + 收藏 ...

  8. 7. STM32——定时器中断(1秒闪烁灯)

    STM32--定时器中断(1秒闪烁灯) 基本框架 1. 配置定时器时钟 在 stm32f10x_rcc.h 头文件中查找相关函数函数 2. 配置定时器结构体 在 stm32f10x_tim.h 头文件 ...

  9. stm32定时器中断的配置步骤

    stm32定时器中断的配置步骤 1>TIM3 时钟使能 位于低速的APB1总线上(注意:高级定时器是在高速的APB2总线上): RCC_APB1PeriphClockCmd(RCC_APB1Pe ...

  10. 【CubeMX配置stm32定时器中断】

    CubeMX配置stm32定时器中断 一.使用CubeMX对STM32进行基础的配置 1.选择需要使用的定时器 选择TIM2和TIM3示例, 注意: TIM2和其它定时器选择时钟的方法不同,TIM3等 ...

最新文章

  1. String创建方式及其区别(快速了解)
  2. Android JNI开发摘录(四)之JNI异常处理
  3. Java虚拟机:JVM 主要组成部分与内存区域
  4. boost::hana::empty用法的测试程序
  5. 那些年职场老鸟都踩过哪些坑?送给后来人的一些职场建议
  6. “约见”面试官系列之常见面试题之第八十九篇之vue生命周期作用(建议收藏)
  7. 强化学习《基于策略价值 - Pathwise Derivative Policy Grident》
  8. [心跳] 互联网推送服务原理:长连接+心跳机制
  9. 如何硬盘安装windows server 2008和windows7
  10. 高铁:繁忙时限制上车补票
  11. 今日直播预告 | 漏洞审计介绍
  12. 巧解快速排序时间复杂度
  13. crt连接中兴服务器,利用SecureCRT实现中兴C220自动登录
  14. PhotoKit在线图片编辑器
  15. R语言 循环 步长 写法
  16. oracle 新增字段
  17. 图片上传File对象不兼容IE
  18. C++ 侯捷视频学习(草稿)
  19. 百度地图获取规划路径信息
  20. 大一训练赛-20180929-整套代码

热门文章

  1. 用余弦定理求三角形内角
  2. 化学中的机器学习方法1
  3. 解决 pycharm 插件下载慢的问题
  4. 阿里P6员工月薪2万4, 被女友嫌弃, 晒出女友月薪, 以为看错了
  5. CCF CSP认证菜鸟刷题日志
  6. C语言中的随机数生成器
  7. 2020年河南省对口升学计算机专业分数线,2020年河南省对口升学考试和录取
  8. faded计算机教程数字顺序,superpads faded数字教程谱子
  9. 计算机基础之网络层的功能和服务
  10. 校园网自动登陆(河南科技学院)