STM32-定时器系列(一)基本定时器

article/2025/10/10 18:24:48

    相信学过51单片机的小伙伴们使用过定时刷新数码管吧,那也一定想过,我们在STM32中也想要实现定时刷新数码管,这该怎么实现呢?下面小编就带大家走进STM32的定时器模块吧!

一、什么是定时器

    定时器是一种计时的工具,它具有延时、频率测量、PWM输出、电机控制及编码接口等功能。
    STM32F103微控制器内部集成了多个可编程定时器,可以分为基本定时器(TIM6和TIM7)、通用定时器(TIM2~TIM5)和高级定时器(TIM1、TIM8)3种类型。从功能上看,基本定时器的功能是通用定时器的子集,而通用定时器的功能又是高级定时器的一个子集。

二、基本定时器

1、相关概念

    在STM32F103中,基本定时器TIM6、TIM7各自都包含一个16位自动装载计数器,能够通过各自的可编程预分频器驱动,这两个定时器相互独立,不共享任何资源。

2、主要功能

  • (1)16位自动重载累加计数器
  • (2)16位可编程(可实时修改)预分频器
  • (3)触发DAC同步电路
  • (4)能够咱更新事件(计数器溢出)时产生DMA/中断请求

3、相关寄存器

■ TIM6 和TIM7 控制寄存器 1(TIMx_CR1)
■ TIM6 和TIM7 控制寄存器 2(TIMx_CR2)
■ TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER)
■ TIM6 和TIM7 状态寄存器(TIMx_SR)
■ TIM6 和TIM7 事件产生寄存器(TIMx_EGR)
■ TIM6 和TIM7 计数器(TIMx_CNT)
■ TIM6 和TIM7 预分频器(TIMx_PSC)
■ TIM6 和TIM7 自动重装载寄存器(TIMx_ARR)

三、函数解析

1、清除中断标志位TIM_ClearFlag函数

在这里插入图片描述

2、定时器使能失能设置TIM_Cmd函数

在这里插入图片描述

3、定时器初始化TIM_TimeBaseInit函数

在这里插入图片描述

定时器时基单元配置信息结构体TIM_TimeBaseInitTypeDef

typedef struct
{uint16_t TIM_Prescaler;        uint16_t TIM_CounterMode;       uint16_t TIM_Period;           uint16_t TIM_ClockDivision;     uint8_t TIM_RepetitionCounter; //仅高级定时器TIM1和TIM8有效
} TIM_TimeBaseInitTypeDef;
  • TIM_Period:
        设置在下一个更新事件装入活动的自动重装载寄存器周期的值。它的取值必须在 0x0000 和0xFFFF 之间。
  • TIM_Prescaler:
        设置用来作为 TIMx 时钟频率除数的预分频值。它的取值必须在 0x0000 和 0xFFFF 之间。
  • TIM_ClockDivision:
        配置时钟分割,具体值见下表:
    在这里插入图片描述
  • TIM_CounterMode :
        选择时钟模式,具体选项见下表:
    在这里插入图片描述

四、示例

    小明突发奇想,打算利用STM32F103ZET6开发板做出一个实时时钟出来,其中利用定时器计时并且利用定时器来刷新数码管。

1、基本定时器6(TIM6)配置函数

/** @brif intialization of time(定时器初始化)* @para none* @reval none
*/
void time6_init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;//打开Time6的APB1时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);/*  定时器的初始化以及设置 *///设置自动装载周期的值 寄存器的值为周期的值-1TIM_TimeBaseStructure.TIM_Period = 360-1;//设置预分频系数 预分频寄存器的值为分频系数-1TIM_TimeBaseStructure.TIM_Prescaler = 200-1;//设置时钟分割 TDTS =  Tck_timTIM_TimeBaseStructure.TIM_ClockDivision = 0;//时钟设置为向上计数模式TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);//清楚TIMx的中断待处理位 即TIMx的中断源TIM_ClearFlag(TIM6,TIM_FLAG_Update);/* 设置参数并打开中断*/TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);//设置使能或者失能外设TIM_Cmd(TIM6,ENABLE);/* 设置NVIC参数 即优先级、打开中断 */NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;//指定终端通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//配置抢占式中断优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//配置响应式中断优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//设置成使能中断NVIC_Init(&NVIC_InitStructure);
}

2、基本定时器7(TIM7配置函数)

/** @brif intialization of time(定时器初始化)* @para none* @reval none
*/
void time7_init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;//打开Time6的APB1时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7,ENABLE);/*  定时器的初始化以及设置 *///设置自动装载周期的值 寄存器的值为周期的值-1TIM_TimeBaseStructure.TIM_Period = 36000-1;//设置预分频系数 预分频寄存器的值为分频系数-1TIM_TimeBaseStructure.TIM_Prescaler = 2000-1;//设置时钟分割 TDTS =  Tck_timTIM_TimeBaseStructure.TIM_ClockDivision = 0;//时钟设置为向上计数模式TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM7,&TIM_TimeBaseStructure);//清楚TIMx的中断待处理位 即TIMx的中断源TIM_ClearFlag(TIM7,TIM_FLAG_Update);/* 设置参数并打开中断*/TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);//设置使能或者失能外设TIM_Cmd(TIM7,ENABLE);/* 设置NVIC参数 即优先级、打开中断 */NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;//指定终端通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//配置抢占式中断优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//配置响应式中断优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//设置成使能中断NVIC_Init(&NVIC_InitStructure);
}

3、基本定时器6中断处理函数

void TIM6_IRQHandler(void)
{ TIM_ClearFlag(TIM6,TIM_IT_Update);//清楚中断标志位refresh_segs();//刷新数码管
}

4、基本定时器7中断处理函数

void TIM7_IRQHandler(void)
{ TIM_ClearFlag(TIM7,TIM_IT_Update);if(++second==60){//时钟的秒加1并且判断是否需要分钟加1second=0;if(++minute==60){//时钟的分加1并且判断是否需要时钟加1minute=0;if(++hour==24) hour=0;//时钟的时加1并且判断24小时是否过完}}	
}

5、主函数

int main(void)
{time6_init();time7_init();seg_GPIO_Init();while(1){segbuff[0] = hour/10;segbuff[1] = hour%10+12;segbuff[2] = minute/10;segbuff[3] = minute%10+12;segbuff[4] = second/10;segbuff[5] = second%10;}
}

五、附

1、基本定时器配置6、基本定时器7的配置

    基本定时器6与基本定时器7在同一个函数中进行配置

/** @brif intialization of time(定时器初始化)* @para none* @reval none
*/
void time6_init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;//打开Time6的APB1时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);//打开Time7的APB1时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7,ENABLE);/*  定时器的初始化以及设置 *///设置自动装载周期的值 寄存器的值为周期的值-1TIM_TimeBaseStructure.TIM_Period = 360-1;//设置预分频系数 预分频寄存器的值为分频系数-1TIM_TimeBaseStructure.TIM_Prescaler = 200-1;//设置时钟分割 TDTS =  Tck_timTIM_TimeBaseStructure.TIM_ClockDivision = 0;//时钟设置为向上计数模式TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);//清楚TIMx的中断待处理位 即TIMx的中断源TIM_ClearFlag(TIM6,TIM_FLAG_Update);/* 设置参数并打开中断*/TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);//设置使能或者失能外设TIM_Cmd(TIM6,ENABLE);/*  定时器的初始化以及设置 *///设置自动装载周期的值 寄存器的值为周期的值-1TIM_TimeBaseStructure.TIM_Period = 36000-1;//设置预分频系数 预分频寄存器的值为分频系数-1TIM_TimeBaseStructure.TIM_Prescaler = 2000-1;//设置时钟分割 TDTS =  Tck_timTIM_TimeBaseStructure.TIM_ClockDivision = 0;//时钟设置为向上计数模式TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM7,&TIM_TimeBaseStructure);//清楚TIMx的中断待处理位 即TIMx的中断源TIM_ClearFlag(TIM7,TIM_FLAG_Update);/* 设置参数并打开中断*/TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE);//设置使能或者失能外设TIM_Cmd(TIM7,ENABLE);/* 设置NVIC参数 即优先级、打开中断 */NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;//指定终端通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//配置抢占式中断优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//配置响应式中断优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//设置成使能中断NVIC_Init(&NVIC_InitStructure);/* 设置NVIC参数 即优先级、打开中断 */NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;//指定终端通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//配置抢占式中断优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//配置响应式中断优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//设置成使能中断NVIC_Init(&NVIC_InitStructure);
}

2、基本定时器的定时时长计算

  • 定时时长T=(自动装载周期的值+1)(预分频系数+1)/72MHz;
      例如,上面用于数码管刷新基本定时器6定时的时长T=360
    200/72000000=1/1000s;用于实时时钟时间刷新的基本定时器7的定时时长T=36000*2000/72000000=1s。

3、其他相关函数

    假如大家想看相关模块的内容请点击链接前往:STM32-刷新数码管


http://chatgpt.dhexx.cn/article/WHcGTt8T.shtml

相关文章

STM32-定时器

定时器(TIM) 本文来自于《STM32——江科大》的笔记整理。 文章目录 定时器(TIM)7. TIM7.1 TIM定时中断7.1.1 TIM简介7.1.2 定时器类型7.1.2.1 基本定时器7.1.2.2 通用定时器内外时钟源的选择实现定时器的级联功能TIM1&TIM8工作…

定时器

51中断系统的组成 定时/计数器的基本原理 逻辑开关闭合后,脉冲信号将对加1计数器充值。若计数器的容量为2 n (n为整数),则当数值达到满计数值后将产生溢出,使中断请求标志TFx(x为0或1)进位为1,同时加1计数器清零。 如果在启动计数…

定时器同步

cube Gated Mode定时器同步 遇到的问题主从模式介绍(参考)解决方法定时器代码和开启代码 遇到的问题 在改造一块无刷电机电调时,遇到一些问题,其中就有:两个定时器分别是三个PWM的H和L驱动脚,当直接设置ti…

Linux定时器

原文:正点原子Linux驱动手册 Linux内核时间管理 系统时间管理需要一个硬件定时器提供时钟 ,通常这个定时器时通用的,有利于系统移植。 像UCOS 或 FreeRTOS 一般使用 Systick 作为系统时钟源(systick 是cortex-m 内核提供的定时器…

单片机定时器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 一、定时器简介 C51中的定时器和计数器是同一个硬件电路支持的,通过寄存器配置不同,就可以将他当做定时器 或者计数器使用。 确切的说,定…

定时器使用

目录 一、定时器简单介绍 二、定时器的使用 三、定时器的实现 一、定时器简单介绍 定时器就相当于是闹钟 在网络编程中定时器非常关键的 比如浏览器浏览某个网页网卡了,浏览器就会转圈圈(阻塞等待),这个等待不是无限等待&…

51单片机定时器/计数器(定时器中断)

51单片机定时器/计数器(中断系统:定时器中断) 实现功能 通过定时器终端控制LED灯 D1 间隔一秒闪烁 单片机型号:STC89C52 定时器介绍 1、51单片机定时器原理 定时器实质上就是一个加1计数器。它随着计数器的输入脉冲进行自加1&a…

定时器用法

在JavaScr中,定时器可以让我们在设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行。而定时器分别有两种类型: 一次性定时器:仅在指定的延迟时间后触发一次。间隔性定时器:每隔一定的时间间隔就触发一次。 …

STM32定时器

目录 一 定时器的基本介绍 二 定时器的原理框图 1、定时器时钟 2 时基单元 3 捕获输入 4 PWM输出。 三 定时器的应用 1 定时器的基础定时计数功能 2 PWM比较输出 3 外部脉冲计数 a、外部触发输入(ETR--外部时钟模式2&am…

SpringBoot定时器

SpringBoot定时器 1 介绍2 注解3 代码4 Cron表达式1. 格式2. 取值3. 特殊字符4. 经典案例 5 Cron既然那么麻烦就生成吧 1 介绍 定时器是一种控制任务延时调用,或者周期调用的技术。 作用:定时邮件、短信发送、更新数据、同步数据、检查数据库和缓存数据…

555定时器

555定时器 美国signetics公司1972年研制,取代机械式定时器,因为输入端有3个5k欧的电阻得名 电路结构 输入引脚 输出引脚 1.因为要接电容,电流较大,需要用oc门进行输出 2.需要接上拉电阻接vcc功能引脚 5号引脚对参考电压的影…

SysTick 定时器

11.1关于 SysTick 定时器 SysTick定时器(又名系统滴答定时器)是存在于Cortex-M3的一个定时器,只要是ARM Cotex-M系列内核的MCU都包含这个定时器。使用内核的SysTick定时器来实现延时,可以不占用系统定时器,节约资源。由于SysTick是在CPU核内…

JavaScript之定时器

定时器 一、 setTimeout() 定时器二、停止 setTimeout() 定时器三、setInterval() 定时器四、清除setInterval() 定时器五、电子时钟案例 在很多页面中,我们都可以看到一些倒计时或者和时间相关的效果,今天小熊将就JavaScript里面的倒计时做一概述。 首先…

STM32-通用定时器-定时器中断

1 STM32的定时器 STM32F103ZET6一共有8个定时器,其中分别为:高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5);基本定时器(TIM6、TIM7)。 …

Python——定时器

1.定时器 Timer定时器源码实现,和自定义一个线程方式一样,都是继承Thread类,重写了run()方法,只是实现的功能是延时执行一个函数或方法。 (1)线程定时器(Timer)解释: Timer类是Thread的子类&a…

[JavaEE]定时器

专栏简介: JavaEE从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录: 1.定时器的概念 2.标准库中的定时器 3.实现定时…

定时器的作用

一、简介。 在很多时候,我们设计网页时,为了某种表现形式,会使用到定时器这一功能,如:为了保证用户有仔细阅读我们的用户条款,我们会给确认按钮设置只有条款被打开,并超过5秒才允许点击。 二、…

定时器简介

文章目录 一.定时器基本介绍A.CPU时序B.定时器的原理 二.定时/计数器的相关寄存器A.定时器工作方式寄存器(TMOD)B.控制寄存器(TCON) 三.定时器的四种工作方式图解 一.定时器基本介绍 A.CPU时序 振荡周期:CPU外部晶振…

定时器基本常识

1.概念解读 1.1定时器和计数器,电路一样 1.2定时或者计数的本质就是让单片机某个部件数数 1.3当定时器用的时候,靠内部震荡电路数数 1.4当计数器用的时候,书外面的信号,读取针脚的数据 2.定时器怎么定时 定时器的本质原理&a…

定时器详解

1. 什么是定时器(timer) 定时器实际上就是Soc当中的一个内部外设。 (1)定时器与计数器 定时器常与计数器扯到一起,计数器也是soc当中的一个内部外设,计数器顾名思义是用来计数的,就和我们的秒…