程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)

STM32F103定时器配置

一、定时器

定时器,顾名思义,就是用于定时或计数,它其实就是一个加1计数器。

1.1 定时器类型

STM32f103有三类定时器:

类型 编号 总线 功能
高级定时器 TIM1、TIME8 APB2 拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能
通用定时器 TIM2、TIM3、TIM4、TIM5 APB1 拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能
基本定时器 TIM6、TIM7 APB1 拥有定时中断、主模式触发DAC的功能

每个通用定时器TIMx功能:

  • 位于低速的APB1总线上;
  • 16位向上、向下、向上/向下自动装载计数器(TIMx_CNT);
  • 16位可编程预分频器(TIMx_PSC),计数器的时钟频率的分频系数为1~65535之间的任意数值;
  • 4个独立通道(TIMx_CH1~4),这些通道可以用来作为:
    • 输入捕获;
    • 输出比较;
    • PWM生成;
    • 单脉冲模式输出;
  • 可使用外部信号(TIMx_ETR)控制定时器和定时器互联的同步电路;
  • 如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器):
    • 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或内部外部触发);
    • 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数);
    • 输入捕获;
    • 输出比较;
    • 支持针对定位的增量(正交)编码器和霍尔传感器电路;
    • 触发输入作为外部时钟或者按周期的电流管理;

STM32的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。

使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32的每个通用定时器都是完全独立的,没有互相共享的任何资源。

1.1.1 高级定时器框图
1.1.2 通用定时器框图
1.1.3 基本定时器框图

1.2 计数器模式

通用定时器可以向上计数、向下计数、向上向下双向计数模式。

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

具体如下图所示:

img

1.3 功能介绍

1.3.1 定时器中断
在这里插入图片描述
1.3.2 输出比较

输出比较可以通过比较CNTCCRx寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形。

输出比较模式:

模式 描述
冻结 CNT=CCR时,REF保持为原状态
匹配时置有效电平 CNT=CCR时,REF置有效电平
匹配时置无效电平 CNT=CCR时,REF置无效电平
匹配时置电平翻转 CNT=CCR时,REF电平翻转
强制为无效电平 CNT与CCR无效,REF强制为无效电平
强制为有效电平 CNT与CCR无效,REF强制为有效电平
PWM模式1 向上计数:CNT<CCR时,REF置有效电平,CNT≥CCR时,REF置无效电平
向下计数:CNT>CCR时,REF置无效电平,CNT≤CRR时,REF置有效电平
PWM模式2 向上计数:CNT<CCR时,REF置无效电平,CNT≥CCR时,REF置有效电平
向下计数:CNT>CCR时,REF置有效电平,CNT≤CRR时,REF置无效电平
1.3.3 PWM基本结构
在这里插入图片描述

PWM频率 :Freq=Tclk/(PSC+1)/(ARR+1)

PWM占空比:Duty=CCR/(ARR+1)

PWM分辨率:Peso=1/(ARR+1)

二、定时器相关寄存器

2.1 控制寄存器(TIMx_CR1

想要使用定时器功能,首先要使能定时器。使能定时器主要用到控制寄存器1TIMx_CR1),此处重点关注第一位,这一位是计数器使能位,给此位设1,使能计数器;

此外我们也需要关注位7 ARPE、位4 DIR

2.2 DMA/中断使能寄存器(TIMx_DIER

定时器的使用,很多情况下都伴随着中断,因此下面要重点关注的是DMA/中断使能寄存器(TIMx_DIER)。同样的,只用关注第一位。该位为更新中断允许位,当该位设置为1时,将允许由于更新事件所产生的中断;

2.3 预分频寄存器(TIMx_PSC

接下来就要确定定时器的时间,定时器的定时是通过频率计算出来的。这里要用到预分频寄存器(TIMx_PSC)。该寄存器用于设置对时钟进行分频,然后提供给计数器,作为计数器的时钟;

2.3.1 计数器计数频率

定时器的时钟频率是TclkTIMx_PSC即为PSC的值。时钟频率被分频了PSC+1,那么定时器的时钟频率:

CK_CNT=/=TclkPSC+1

故可知定时器计数值加1所需的时间为:PSC+1Tclk

2.3.2 计数器溢出频率

自动重装载值ARR,即TIM_ARR。定时器从0计数到ARR时清零。由第一步已经计算出了被分频了PSC+1的最终定时器的时钟频率为TclkPSC+1,这是计数一次的频率,故计数器溢出频率 (或者说定时器溢出频率):

CK_CNT_OV=//=CK_CNT/(ARR+1)=Tclk/(PSC+1)/(ARR+1)

2.3.3 计数器溢出时间

计数器溢出时间(或者说定时器溢出时间):

Tout=1/CK_CNT_OV=(PSC+1)×(ARR+1)Tclk

其中

  • Tclk为定时器的输入时钟频率(单位Mhz),通常为系统时钟频率或者定时器外部时钟频率;
  • ARRTIM_ARR):自动重装载值,是定时器溢出前的计数值;
  • PSCTIMx_PSC):预分频值,是用来降低定时器时钟频率的参数;
  • T_{out}:定时器溢出时间(单位us),一定要注意这个单位是us

2.4 从模式控制寄存器(TIMx_SMCR

从框图中可以看到统通用定时器时钟来源有以下几个:

  • 内部时钟(CK_INT)默认;
  • 外部时钟模式1:外部输入脚(TIx);
  • 外部时钟模式2:外部触发输入(ETR);
  • 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。

时钟源的选择,可以通过从模式寄存器(TIMx_SMCR)的第3位来选择;

2.5 自动重装载寄存器(TIMx_ARR

下面是自动重载寄存器。自动装载寄存器(TIMx_ARR)是预先装载的,写或读自动重装载寄存器将访问预装载寄存器;

2.6 状态寄存器(TIMx_SR

如果发生了更新中断,UIF位会被置1

三、定时中断源码

3.1 定时中断初始化步骤

定时中断配置流程如下:

(1) TIMx时钟使能:通过配置RCC_APB1ENR/RCC_APB2ENR寄存器使能TIMx时钟;

(2) 配置TIMx时基单元;

  • 配置TIMx_ARR寄存器自动重装载的值;

  • 配置TIMx_PSC频寄存器预分频系数;

(3) 配置TIMx_DIER寄存器允许更新中断(UIE=1);

(4) 设置NVIC;

(5) 中断处理函数;

  • 设置中断服务函数(包括清除中断标志,清SR寄存器状态标志位(UIF=0))。

亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。

日期姓名金额
2023-09-06*源19
2023-09-11*朝科88
2023-09-21*号5
2023-09-16*真60
2023-10-26*通9.9
2023-11-04*慎0.66
2023-11-24*恩0.01
2023-12-30I*B1
2024-01-28*兴20
2024-02-01QYing20
2024-02-11*督6
2024-02-18一*x1
2024-02-20c*l18.88
2024-01-01*I5
2024-04-08*程150
2024-04-18*超20
2024-04-26.*V30
2024-05-08D*W5
2024-05-29*辉20
2024-05-30*雄10
2024-06-08*:10
2024-06-23小狮子666
2024-06-28*s6.66
2024-06-29*炼1
2024-06-30*!1
2024-07-08*方20
2024-07-18A*16.66
2024-07-31*北12
2024-08-13*基1
2024-08-23n*s2
2024-09-02*源50
2024-09-04*J2
2024-09-06*强8.8
2024-09-09*波1
2024-09-10*口1
2024-09-10*波1
2024-09-12*波10
2024-09-18*明1.68
2024-09-26B*h10
2024-09-3010
2024-10-02M*i1
2024-10-14*朋10
2024-10-22*海10
2024-10-23*南10
2024-10-26*节6.66
2024-10-27*o5
2024-10-28W*F6.66
2024-10-29R*n6.66
2024-11-02*球6
2024-11-021*鑫6.66
2024-11-25*沙5
2024-11-29C*n2.88
posted @   大奥特曼打小怪兽  阅读(409)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2023-12-04 Rockchip RK3588 - NanoPC-T6开发板介绍
2021-12-04 Mini2440裸机开发之DM9000
如果有任何技术小问题,欢迎大家交流沟通,共同进步

公告 & 打赏

>>

欢迎打赏支持我 ^_^

最新公告

程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)。

了解更多

点击右上角即可分享
微信分享提示