STM32定时器-基本定时器

实验芯片:STM32F103

更新日期:2021年8月17日

声明:部分图文来自互联网公开资料,转载注明出处

一、基本定时器简介

TIM6和TIM7是一个16位向上递增的定时器。

1.基本定时器主要功能

功能一:基本定时功能,生成时基。

功能二:专门用于驱动,模数转换DAC。

2.基本定时器功能表

定时器类型 定时器编号 计数模式 分辨率 DMA 预分频系数 通道 互补输出 逻辑引脚 时钟
基本定时器 TIM6、TIM7 UP 16bit YES 1~65536(0-0xFFFF) 0 0 NO APB1

注意STM32F103只有大容量256-512K Flash才有基本定时器

基本定时器只有向上计数模式。

二、基本定时器功能框图

​ 首先先看图中绿色框内容,第一个是带有阴影的方框,方框内容一般是一个寄存器名称,比如图中主体部分的自动重载寄存器 (TIMx_ARR) 或 PSC 预分频器 (TIMx_PSC),这里要特别突出的是阴影这个标志的作用,它表示这个寄存器还自带有影子寄存器,在硬件结构上实际是有两个寄存器,源寄存器是我们可以进行读写操作,而影子寄存器我们是完全无法操作的,有内部硬件使用。影子寄存器是在程序运行时真正起到作用的,源寄存器只是给我们读写用的,只有在特定时候 (特定事件发生时) 才把源寄存器的值拷贝给它的影子寄存器。多个影子寄存器一起使用可以到达同步更新多个寄存器内容的目的。接下来是一个指向右下角的图标,它表示一个事件,而一个指向右上角的图标表示中断和 DMA 输出。这个我们把它放在图中主体更好理解。图中的自动重载寄存器有影子寄存器,它左边有一个带有“U”字母的事件图标,表示在更新事件生成时就把自动重载寄存器内容拷贝到影子寄存器内,这个与上面分析是一致。寄存器右边的事件图标、中断和 DMA 输出图标表示在自动重载寄存器值与计数器寄存器值相等时生成事件、中断和 DMA 输出。

1.时基单元

16位计数器TIMx_CNT

16位分频器TIMx_PSC

16位自动重装载寄存器TIM_ARR

影子寄存器-用户读写操作实际操作的寄存器

预分频寄存器TIMx_PSC

自动重装载寄存器TIMx_ARR

计数器时钟CK_CNT

定时器 CK_CNT,用来驱动计数器计数。PSC 是一个16 位的预分频器,可以对定时器时钟 TIMxCLK 进行 1~65536 (0~0xFFFF)之间的任何一个数进行分频。具体计算方式为:CK_CNT=TIMxCLK/(PSC+1)。

计数器CNT

计数器 CNT 是一个 16 位的计数器,只能往上计数,从0开始计数,最大计数值为 65535(0xFFFF)当计数达到自动重装载寄存器的时候产生更新事件,并清零从头开始计数

自动重装载寄存器

自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。

2.时钟源

​ 定时器实现计数功能必须有个时钟源,基本定时器时钟TIMxCLK只能来自内部时钟CK_INT(经APB1预分频器分频后提供,若APB1预分频系数位1,则频率不变,否则频率乘以2,库函数中APB1预分频的系数是2,PCLK1=32M,则TIMxCLK=36*2=72M),高级定时器和通用定时器还可以选择外部时钟源或直接来自其他定时器等待模式。

​ 我们可以通过 RCC 专用时钟配置寄存器 (RCC_DCKCFGR) 的 TIMPRE 位设置所有定时器的时钟频率,我们一般设置该位为默认值 0,即 TIMxCLK 为总线时钟的两倍,中可选的最大定时器时钟为 84MHz,即基本定时器的内部时钟 (CK_INT) 频率为 84MHz。基本定时器只能使用内部时钟,当 TIM6 和TIM7 控制寄存器 1(TIMx_CR1) 的 CEN 位置 1 时,启动基本定时器,并且预分频器的时钟来源就是 CK_INT。

3.控制器

​ 定时器控制器控制实现定时器功能,控制定时器复位、使能、计数其基础功能,基本定时器还专门用于 DAC 转换触发。

4.计数器

​ 基本定时器计数过程主要涉及到三个寄存器内容,分别是计数器寄存器 (TIMx_CNT)、预分频器寄存器 (TIMx_PSC)、自动重载寄存器(TIMx_ARR),这三个寄存器都是 16 位有效数字,即可设置值为 0 至 65535(0~0XFFFF)。

预分频器PSC,有一个输入时钟CK_PSC和一个输出时钟CK_CNT。输入时钟CK_PSC来源于控制器部分,基本定时器只有内部时钟源,因此CK_PSC=CK_INT。输出频率F(CK_CNT)=F(CK_PSC)/(PSC+1)。

计时时更改PSC时,不会马上更新CK_CNT输出频率,而是等到更新事件发生时。把PSC寄存器的值更新到影子寄存器中,这才真正产生效果。

如下图。PSC由1变为4过程。

在定时器使能 (CEN 置 1) 时,计数器 COUNTER 根据 CK_CNT 频率向上计数,即每来一个CK_CNT 脉冲,TIMx_CNT 值就加 1。当 TIMx_CNT 值与 TIMx_ARR 的设定值相等时就自动生成事件并 TIMx_CNT 自动清零,然后自动重新开始计数,如此重复以上过程。为此可见,我们只要设置 CK_PSC 和 TIMx_ARR 这两个寄存器的值就可以控制事件生成的时间,而我们一般的应用程序就是在事件生成的回调函数中运行的。在 TIMx_CNT 递增至与 TIMx_ARR 值相等,我们叫做为定时器上溢

自动重载寄存器 TIMx_ARR 用来存放于计数器值比较的数值,如果两个数值相等就生成事件,将相关事件标志位置位,生成 DMA 和中断输出。TIMx_ARR 有影子寄存器,可以通过 TIMx_CR1寄存器的 ARPE 位控制影子寄存器功能,如果 ARPE 位置 1,影子寄存器有效,只有在事件更新时才把 TIMx_ARR 值赋给影子寄存器。如果 ARPE 位为 0,修改 TIMx_ARR 值马上有效。

三、定时时间计算

定时器的定时时间等于计数器的中断周期乘以中断的次数。

计数器在CK_CNT的驱动下,计1个数的时间是CK_CNT的倒数,1/(TIMxCLK/(PSC+1))。

产生一次中断的时间等于1/(CK_CLK*ARR)

四、定时器初始化结构体

用于定时器基础参数设置于TIM_TimeBaseInit ()函数配合使用完成配置。

typedef struct
{uint16_t TIM_Prescaler;//指定TIM时钟的预分频值,范围0x0000-0xFFFFuint16_t TIM_CounterMode;//指定计数模式,基本定时器只能向上计数,无需初始化     uint16_t TIM_Period;//指定自动装载值,即定时器周期,范围0x0000-0xFFFF          uint16_t TIM_ClockDivision;//指定定时器时钟于数字滤波器采样时钟分频比,基本定时器无此功能uint8_t TIM_RepetitionCounter;//指定重复计数器的值,基本定时器无需设置
} TIM_TimeBaseInitTypeDef;

基本定时器只需用到TIM_Prescaler和TIM_Period即可。

五、基本定时器配置实例

注意STM32F103只有大容量256-512K Flash才有基本定时器

void Basic_TIM6_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStructure;// 设置中断组为 0NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 设置中断来源NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;// 设置主优先级为 0NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;// 设置抢占优先级为 3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}
void Basic_TIM6_Init(uint16_t arr, uint16_t pre)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //定时器时钟CK_INT=2*PCLK1=2*32MHz=72MHzTIM_TimeBaseStructure.TIM_Period = arr;TIM_TimeBaseStructure.TIM_Prescaler = pre; //CK_CNT=CKINT/(pre+1)// 时钟分频因子 ,基本定时器没有,不用管//TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //定时器6、7没有// 计数器计数模式,基本定时器只能向上计数,没有计数模式的设置//TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//定时器6、7没有// 重复计数器的值,基本定时器没有,不用管//TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//定时器1、8、15、16、17才有TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //初始化定时器Basic_TIM6_NVIC_Config(); //中断配置TIM_ClearFlag(TIM6, TIM_FLAG_Update);     //清除计数器中断标志位TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); //开启计数器更新中断(上溢中断)TIM_Cmd(TIM6, ENABLE);                    //使能计数器
}void TIM6_IRQHandler(void)
{if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET){TIM_ClearITPendingBit(TIM6, TIM_FLAG_Update);/*your code!*/}
}

STM32定时器-基本定时器相关推荐

  1. STM32单片机一个定时器输出不同频率PWM波

      在使用STM32单片机输出PWM波形的时候,通常可以直接使用定时器提供的PWM模式.可以通过自动重装载寄存器(TIMx_ARR)来设置定时器的输出频率,然后通过捕获/ 比较寄存器 1(TIMx_C ...

  2. STM32:配置定时器为PWM输出模式以及编码器接口模式

    一:STM32的高级定时器TIM8配置为PWM输出模式 最近在工程项目中,需要用stm32的定时器 (以高级定时器TIM8为例 ) 产生两路PWM输出,作为电机的pwm输入,方法如下: /****** ...

  3. c语言定时器定时1ms程序,STM32 Cubemx 配置定时器定时1mS

    最近才发现原来我把定时器里的配置参数代表的意义给搞混了,这里记录一下,防止以后自己忘记. 以建立一个定时1mS定时器为例: 1.先打开定时器 2.配置好时钟 3.配置定时器设置 重点来了,以前在这里我 ...

  4. STM32用一个定时器封装多个定时函数调用

    STM32用一个定时器封装多个定时函数调用 用一个定时器开一个1ms的中断: 头文件宏定义如下: #define BASIC_TIM TIM6 #define BASIC_TIM_APBxClock_ ...

  5. STM32 TIM高级定时器死区时间的计算

    STM32 TIM高级定时器的互补PWM支持插入死区时间,本文将介绍如何计算以及配置正确的死区时间. 文章目录 什么是死区时间? 数据手册的参数 如何计算合理的死区时间? STM32中配置死区时间 什 ...

  6. STM32关于使用定时器来实现串口通信的整活实验

    目录 一.整活说明 二.原理简介 先说接收 发送数据 优化 三.实验条件和目标 条件 目标 四.掉头发环节 1.定义串口类 2.定义简单宏 3.定义私有数据 4.init 函数 5.其他接口函数 6. ...

  7. STM32 多个定时器 多路PWM配置

    实验过程中的笔记   在持续更新中  只是一个简化版本 利用定时器1 2 3 4 配置的PWM输出 高级定时器的 PWM 输出,与普通定时器稍有区别,必须通过函数 TIM_CtrlPWMOutputs ...

  8. STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)高级定时器+普通定时器,定时计数模式下总结

    STM32定时器配置(TIM1.TIM2.TIM3.TIM4.TIM5.TIM8)高级定时器+普通定时器,定时计数模式下总结 文章结构: --> 一.定时器基本介绍 --> 二.普通定时器 ...

  9. 【STM32】通用定时器的PWM输出(实例:PWM输出)

    STM32F1xx官方资料: <STM32中文参考手册V10>-第14章  通用定时器 通用定时器PWM概述 STM32定时器输出通道引脚 这里以TIM3为例来讲解.STM32的通用定时器 ...

  10. 深入浅出地理解STM32中的定时器工作原理

    深入浅出地理解STM32中的定时器工作原理 一.如何实现延时 1 纯硬件电路 2 纯软件编程 3 可编程定时/计数器 二.可编程定时/计数器有哪些功能? 三.STM32F103 的定时器有哪些 1 基 ...

最新文章

  1. esp32 python-在esp32上配置运行microPython
  2. BZOJ2843:极地旅行社
  3. 使用VHDL编程的直接扩频发生器
  4. 《动手学深度学习 PyTorch版》学习笔记(一):数据操作
  5. 体脂数C语言switch,c语言switch语句
  6. 中国数字泵控制器行业市场供需与战略研究报告
  7. tfs 2013 access deny
  8. 怎样访问服务器的文件,怎样访问服务器上的mht文件
  9. stc和sac_SAC与短期边际成本SMC.PPT
  10. 解决桌面单击右键反应慢的问题
  11. 如何从Excel文件创建在线预算报告
  12. JZOJ4788. 序列
  13. 精美中文简历LaTex模板集锦
  14. 创建数据库,有次要文件的数据库,以及给现有数据库添加次要数据库,
  15. Ubuntu系统中编写c语言程序教程
  16. 【UE4教程文档翻译】First Person Shooter C++ Tutoria(第一人称射击C++教程)
  17. 格力何时实行周末双休?董明珠回应:社会需要时,要放下自我
  18. IT公司是动物园——程序猿、攻城狮、射鸡师、产品锦鲤、西衣鸥!
  19. 服务器阵列工作原理,服务器RAID技术基础了解一下
  20. Windows微信DPI适配

热门文章

  1. linux安装mysql5.7教程
  2. 设置项目的favicon图标
  3. Python编程:cookiejar的使用
  4. float和double取值范围和精度问题
  5. 图像处理函数详解——im2bw
  6. CSS 7 CSS 层叠规则 BFC 和 IFC 机制
  7. Java进阶 23种设计模式 详解+应用+实例代码
  8. 寂静岭3java攻略_《寂静岭3HD》通关心得:感人之佳作
  9. 汽车电子嵌入式编程-【无人驾驶】QNX操作系统
  10. bootstrapTable Rows