STM32 通用定时器

发布者:epsilon15最新更新时间:2024-10-15 来源: cnblogs关键字:STM32  通用定时器 手机看文章 扫描二维码
随时随地手机看文章

STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器。

STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)构成。STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。   使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。

STM3 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能包括:

1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。

2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。

3)4 个独立通道(TIMx_CH1~4),这些通道可以用来作为: 

A.输入捕获 

B.输出比较 

C.PWM 生成(边缘或中间对齐模式) 

D.单脉冲模式输出 

4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。

5)如下事件发生时产生中断/DMA: 

A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) 

B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) 

C.输入捕获 

D.输出比较 

E.支持针对定位的增量(正交)编码器霍尔传感器电路 

F.触发输入作为外部时钟或者按周期的电流管理

定时器相关的库函数主要集中在固件库文件 stm32f10x_tim.h 和 stm32f10x_tim.c 文件中。

1)TIM3 时钟使能。

TIM3 是挂载在 APB1 之下,所以我们通过 APB1 总线下的使能使能函数来使能 TIM3。调用的函数是:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

2)初始化定时器参数,设置自动重装值,分频系数,计数方式等。

在库函数中,定时器的初始化参数是通过初始化函数 TIM_TimeBaseInit 实现的:

voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

第一个参数是确定是哪个定时器,这个比较容易理解。第二个参数是定时器初始化参数结构体指针,结构体类型为 TIM_TimeBaseInitTypeDef。针对 TIM3 初始化范例代码格式:

TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;

TIM_TimeBaseStructure.TIM_Period = 5000; //设置自动重载计数周期值

TIM_TimeBaseStructure.TIM_Prescaler =7199;  //设置分频系数

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分频因子

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数方式

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 

3)设置 TIM3_DIER 允许更新中断。

在库函数里面定时器中断使能是通过 TIM_ITConfig 函数来实现的:

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

第一个参数是选择定时器号,这个容易理解,取值为 TIM1~TIM17。

第二个参数非常关键,是用来指明我们使能的定时器中断的类型,定时器中断的类型有很多种,包括更新中断 TIM_IT_Update,触发中断 TIM_IT_Trigger,以及输入捕获中断等等。

第三个参数就很简单了,就是失能还是使能。

例如我们要使能 TIM3 的更新中断,格式为:

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); 

4)TIM3 中断优先级设置。

在定时器中断使能之后,因为要产生中断,必不可少的要设置 NVIC 相关寄存器,设置中断优先级。

5)允许 TIM3 工作,也就是使能 TIM3。

在配置完后要开启定时器,通过 TIM3_CR1 的 CEN 位来设置。 在固件库里面使能定时器的函数是通过 TIM_Cmd 函数来实现的:

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

这个函数非常简单,比如我们要使能定时器 3,方法为:

TIM_Cmd(TIM3, ENABLE);   //使能 TIMx 外设

6)编写中断服务函数。

在最后,还是要编写定时器中断服务函数,通过该函数来处理定时器产生的相关中断。在中断产生后,通过状态寄存器的值来判断此次产生的中断属于什么类型。然后执行相关的操作,我们这里使用的是更新(溢出)中断,所以在状态寄存器 SR 的最低位。在处理完中断之后应该向 TIM3_SR 的最低位写 0,来清除该中断标志。

在固件库函数里面,用来读取中断状态寄存器的值判断中断类型的函数是:

ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t)

该函数的作用是,判断定时器 TIMx 的中断类型 TIM_IT 是否发生中断。比如,我们要判断定时器 3 是否发生更新(溢出)中断,方法为:

if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){}

固件库中清除中断标志位的函数是:

void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT) 

该函数的作用是,清除定时器 TIMx 的中断 TIM_IT 标志位。使用起来非常简单,比如我们在TIM3 的溢出中断发生后,我们要清除中断标志位,方法是:

TIM_ClearITPendingBit(TIM3, TIM_IT_Update   );


  1. /**

  2.  * 通用定时器3中断初始化

  3.  * 这里时钟选择为APB1的2倍,而APB1为36M

  4.  * arr:自动重装值。

  5.  * psc:时钟预分频数

  6.  * 计算公式如下:

  7.  * Tout= ((arr+1)*(psc+1))/Tclk;

  8.  * 其中:

  9.  * Tclk:TIM3 的输入时钟频率(单位为 Mhz)。

  10.  * Tout:TIM3 溢出时间(单位为 us)。

  11.  */

  12. void TIM3_Int_Init(u16 arr,u16 psc)

  13. {

  14.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

  15.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* 时钟使能 */


  16.     /*定时器TIM3初始化*/

  17.     TIM_TimeBaseStructure.TIM_Period = arr; /*周期的值*/

  18.     TIM_TimeBaseStructure.TIM_Prescaler = psc; /* 预分频值 */

  19.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; /*设置时钟分割:TDTS = Tck_tim*/

  20.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /* TIM向上计数模式*/

  21.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /*根据指定的参数初始化TIMx的时间基数单位*/


  22.     TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); /*使能指定的TIM3中断,允许更新中断*/

  23.     TIM3_NVIC_Init();


  24.     TIM_Cmd(TIM3,ENABLE);/*使能TIMx*/

  25. }


  26. /**

  27.  * 中断3优先级NVIC设置

  28.  */

  29. void TIM3_NVIC_Init(void)

  30. {

  31.     NVIC_InitTypeDef NVIC_InitStructure;

  32.     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; /*TIM3中断*/

  33.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /*先占优先级0级*/

  34.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; /*从优先级3级*/

  35.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /*IRQ通道被使能*/

  36.     NVIC_Init(&NVIC_InitStructure);

  37. }


  38. /**

  39.  * 定时器3中断服务程序

  40.  */

  41. void TIM3_IRQHandler(void)

  42. {

  43.     if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET ) /*检查TIM3更新中断发生与否*/

  44.     {

  45.         TIM_ClearITPendingBit(TIM3, TIM_IT_Update); /*清除TIMx更新中断标志 */

  46.         LED0 = !LED0;

  47.     }

  48. }


关键字:STM32  通用定时器 引用地址:STM32 通用定时器

上一篇:STM32固件库SYSTEM 文件夹介绍
下一篇:STM32启动解析,启动代码,__main main

推荐阅读最新更新时间:2026-03-22 11:23

基于stm32单片机的通用定时器配置
stm32单片机的定时器资源相当丰富,它的定时器分为高级控制定时器、通用定时器和基本定时器,具体这些定时器资源在哪个系列的片子有就得看不同的片子的手册了。他们具体有什么区别,我也是刚接触这个,看他的数据手册介绍也是茫然,主要是刚开始摸,那些功能都没用到,反正用做定时作用的话哪种定时器都行。在这我就把我自己配置通用定时器的方法及心得简短做个总结,以防以后忘记了。我配置的是定时器2(TIM2)。 通用定时器的时钟可来自于外部或内部,选用默认即是采用内部的。通用定时器的时钟来源为APB1总线,所以首先,得将APB1外设时钟打开。 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE)
[单片机]
STM32单片机通用定时器的编程设计
一、STM32通用定时器原理 STM32系列的CPU,有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。其它6个为普通定时器,时钟由APB1的输出产生。 下图是STM32参考手册上时钟分配图中,有关定时器时钟部分的截图: 从图中可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的蓝色部分。 下面以通用定时器2的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或
[单片机]
<font color='red'>STM32</font>单片机<font color='red'>通用</font><font color='red'>定时器</font>的编程设计
STM32基础8--通用定时器(PWM控制LED)
从STM32基础7--通用定时器,STM32通用定时器可以产生PWM波形,从而控制LED亮度。下面我们更加详细的了解一下,PWM对LED的控制。 PWM控制LED硬件电路 在下面的原理图中,可以看到LED0与LED1连接到STMF407的PF9与PF10引脚上。在电路中,当PF9,PF10分别为低电平的时候,LED0与LED分别导通,也就是这个电路中,PWM周期的低电平周期,LED会被导通。 PWM周期与LED闪烁 在STM32F407中,当我们使用PWM1模式时,进行如下的设置。 当我们使用逻辑分析仪(LA)抓取,可以得到如波形,也就是说Pulse设置的为低电平的时间长度。当我们下载程序进开发板时,发现LED
[单片机]
<font color='red'>STM32</font>基础8--<font color='red'>通用</font><font color='red'>定时器</font>(PWM控制LED)
如何利用STM32通用定时器实现输出两路占空比和频率可调的互补PWM
MCU:STM32F334C8T6 PWM即脉宽调制,可以用来驱动电机,驱动全桥电路等,用过STM32的知道,用它的定时器可以很容易实现PWM输出,使用高级定时器的TIMx_CHy和TIMx_CHyN可以轻易实现互补PWM(complementary PWM)波形的输出。 高级定时器资源有限,本文利用通用定时器(General-purpose timers)实现互补PWM输出,在高级定时器资源不够时不失为一个好方法。 STM32的定时器PWM有两种模式:PWM mode 1和PWM mode 2 工作原理: PWM mode 1 - In upcounting, channel 1 is active as lon
[单片机]
如何利用<font color='red'>STM32</font><font color='red'>通用</font><font color='red'>定时器</font>实现输出两路占空比和频率可调的互补PWM
STM32学习笔记(4):通用定时器基本定时功能
TIMER基本定时功能 1.STM32的Timer简介 STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。今天主要是研究剩下的8个定时器。 定时器 计数器分辨率 计数器类型 预分频系数 产生DMA请求 捕获/比较通道 互补输出 TIM1 TIM8 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4 有 TIM2 TIM3 TIM4 TIM5 16位 向上,向下,向上/向下 1-65536之间的任意数 可以 4
[单片机]
STM32学习笔记(5):通用定时器PWM输出
1.TIMER输出PWM基本概念 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。一般用来控制步进电机的速度等等。 STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出。 1.1PWM输出模式 STM32的PWM输出有两种模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。模式1和
[单片机]
关于STM32 通用定时器初始化参数的理解
定时器初始化结构体定义为 typedef struct { uint16_t TIM_Prescaler; uint16_t TIM_CounterMode; uint16_t TIM_Period; uint16_t TIM_ClockDivision; uint8_t TIM_RepetitionCounter; } TIM_TimeBaseInitTypeDef; 其中: TIM_Prescaler为预分频因子,取值范围为0x0000 到 0xFFFF,决定了定时器时钟频率。定时器时钟频率 = 定时器时钟源频率 /
[单片机]
关于<font color='red'>STM32</font> <font color='red'>通用</font><font color='red'>定时器</font>初始化参数的理解
stm32 定时器 通用定时器
STM32F10xxx 2个基本定时器(TIM6、TIM7) 4个通用定时器(TIM2、 TIM3、 TIM4和TIM5) 2个高级定时器(TIM1、TIM8) 每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作 TIMx主要功能 16位向上、向下、向上/向下自动装载计数器 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意 数值 4个独立通道: ─ 输入捕获 ─ 输出比较 ─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 使用外部信号控制定时器和定时器互连的同步电路 如下事件发生时产生中断/DMA: ─ 更新:计数器
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved