当前位置: 首页 > news >正文

STM32F407 通用定时器

文章目录

  • 1 定时器
    • 1.1 定时器基础
    • 1.2 定时器触发信号
      • 1. 触发输入信号(TRGI)
        • 15.4.3 TIMx 从模式控制寄存器 (TIMx_SMCR)
      • 2. 触发输出信号(TRGO)
    • 定时器计算公式
      • 1. 定时器计时公式
      • 2. 举例说明
      • 总结
  • 2 通用定时器框图
    • 2.1 时钟选择
      • 1. 内部时钟(CK_INT)
      • 2. 外部时钟模式 1:外部输入引脚脚 (TIx)
      • 3. 外部时钟模式 2:外部触发输入 ETR,仅适用于 TIM2、TIM3 和 TIM4
      • 4. 外部触发输入 (ITRx):使用一个定时器作为另一定时器的预分频器
    • 2.2 时基单元
    • 2.3 各个寄存器
      • 15.4.7 TIMx 捕获/比较模式寄存器 1 (TIMx_CCMR1)【STM32F4xx中文参考手册 P432】
      • 15.4.9 TIMx 捕获/比较使能寄存器 (TIMx_CCER)【STM32F4xx中文参考手册 P436】
      • 15.4.13 TIMx 捕获/比较寄存器 1 (TIMx_CCR1)【STM32F4xx中文参考手册 P439】
  • 输入捕获
  • 输出比较
    • 模式选择(CCMR1->OC1M[2:0])
      • 常用模式PWM1
        • `CCMR` 寄存器中的 `CC1S` 配置为 `00` 表示 CC1 通道配置为输出模式
        • `CCMR` 寄存器中的 `OC1M` 配置为 `110` 代表选用 `PWM模式1`
      • 互补PWM的应用场景
  • 正弦脉宽调制(SPWM)
    • 编程实战(利用PWM互补实现交替呼吸灯实验)
      • 1. 时间变量的获取与转换
      • 2. 正弦规律占空比的计算
      • 与SPWM的关联
    • 一、输出比较基础原理与核心概念
      • 1.1 输出比较的基本机制
      • 1.2 关键寄存器与功能映射
    • 二、输出比较模式与时序分析
      • 2.1 PWM模式(PWM1与PWM2)
        • 时序示例(向上计数模式)
      • 2.2 非PWM模式(翻转、强制、冻结)
    • 三、影子寄存器与预装载机制
      • 3.1 影子寄存器的作用
      • 3.2 预装载的应用场景
    • 四、计数模式对输出的影响
      • 4.1 递增计数(Upcounting)
      • 4.2 递减计数(Downcounting)
      • 4.3 中心对齐计数(Center-Aligned)
    • 五、STM32F407通用定时器的新特性
      • 5.1 32位计数器(TIM2与TIM5)
      • 5.2 高级同步与级联功能
      • 5.3 动态预装载与双缓冲机制

1 定时器

1.1 定时器基础

定时器类似于我们生活中的闹钟,可以设定一个时间来提醒我们。定时器可以作为基本的定时器/计数器,用于生成周期性的定时中断或作为计数器来计数外部事件的脉冲数。例如1秒钟进入定时器中断干一件事,定时器可以配置为产生脉冲宽度调制(PWM)信号,用于控制电机速度、LED亮度调节,风扇风速调节等应用。

定时器是存在于STM32F407IGH单片机中的一个外设,总共有14个定时器,分别是2个高级定时器(TIM1,TIM8)10个通用定时器(TIM2,TIM3,TIM4,TIM5,TIM9,TIM10,TIM11,TIM12,TIM13,TIM14)和2个基本定时器(TIM6,TIM7)

定时器类别定时器编号特征产生DMA请求捕获/比较通道应用场景
高级定时器TIM1,TIM816 位递增,递减,中央对齐模式可以6带死区控制和紧急刹车,可用于PWM电机控制
通用定时器TIM2,TIM3,TIM4,TIM516 位或32位,递增,递减,中央对齐模式可以4定时计数,PWM输出,输入捕获,输出比较
通用定时器TIM9,TIM10,TIM11,TIM12,TIM13,TIM1416 位自动加载计数器可以2定时计数,PWM输出,输入捕获,输出比较
基本定时器TIM6,TIM716 位自动加载计数器可以0主要应用用于驱动DAC

1.2 定时器触发信号

定时器的触发信号分两大类

1. 触发输入信号(TRGI)

从外部过来(也可能是自己输入通道过来)到本定时器的信号。
用来控制本定时器一些动作,比如复位。
这个时候本定时器就处于主从模式中的从模式
在这里插入图片描述

  1. 内部外设信号 (Internal Peripheral Signals) - ETR
  2. 内部定时器互连 (Internal Timer Connections) - ITRx
  3. 外部输入引脚 (External Input Pins) - TIx_ED, TI1F_ED, TI1FP1, TI2FP2
15.4.3 TIMx 从模式控制寄存器 (TIMx_SMCR)

常用复位模式:TIMx_SMCR->SMS
TIMx_SMCR->TS:触发选择

000:内部触发 0 (ITR0)
001:内部触发 1 (ITR1)
010:内部触发 2 (ITR2)
011:内部触发 3 (ITR3)
100:TI1 边沿检测器 (TI1F_ED)
101:滤波后的定时器输入 1 (TI1FP1)
110:滤波后的定时器输入 2 (TI2FP2)
111:外部触发输入 (ETRF)

触发输入信号
第1类
TS[2:0]=000-011 共4个:来源于其他定时器的TRGO信号经过芯片内部连接,来到本定时器的ITRO/1/2/3;内部连接是定死的,不能更改。如下图:
在这里插入图片描述
第2类
TS[2:0]=111 共1个
来源于外部触发脚ETR
经过极性选择,边沿检测和预分频器,输入滤波器,成为TRGI信号
TRGI信号通过从模式控制器控制本定时器实现复位使能更改计数方式等。

第3类
TS[2:0]=100 共1个
来源于定时器自身的通道1信号
经过输入滤波器和边缘检测器,得到TI1FED信号
上升沿和下降沿都会产生TI1F ED信号
经过信号选择器最终成为TRGI信号

第4类
TS[2:0]=101/110共2个
来源于定时器自身的通道1或通道2信号
经过输入滤波器和边沿检测器得到TI1FP1和TI2FP2信号
他们是上升沿或下降沿,只能选择一种
最终成为TRGI信号

2. 触发输出信号(TRGO)

是本定时器输出到其他定时器或其他外设的信号
用于与其他定时器的级联(触发其他定时器的一些工作)或触发一些其他外设工作。
这个时候本定时器就是主从模式中的主模式

定时器计算公式

1. 定时器计时公式

定时器产生一次更新事件(如溢出中断)的周期 T(单位:秒)计算公式为:

T = (PSC + 1) * (ARR + 1) / T_CLK

或者,计算输出频率 F_out(单位:Hz)的公式为:

F_out = T_CLK / [ (PSC + 1) * (ARR + 1) ]

其中:

  • T_CLK:定时器的时钟源频率(单位:Hz)。
    • 例如,在STM32F407中,如果APB1预分频器≠1,则通用定时器(TIM2-TIM5)的时钟 T_CLK 为 84 MHz。
  • PSC:预分频器寄存器 (Prescaler) 的值(16位寄存器,取值范围0~65535)。
  • ARR:自动重载寄存器 (Auto-Reload Register) 的值(16位或32位,取决于定时器,取值范围0~65535或更大)。

公式的核心思想是:
定时器的实际计数频率 F_CNTPSCT_CLK 分频得到:F_CNT = T_CLK / (PSC + 1)
然后,计数器从0计到 ARR,总共需要 (ARR + 1)F_CNT 的周期。
所以总时间(周期的倒数T = (计数次数) / (计数频率) = (ARR + 1) / F_CNT = (ARR + 1) / [T_CLK / (PSC + 1)] = (PSC + 1) * (ARR + 1) / T_CLK


2. 举例说明

目标: 使用STM32F407的TIM3(时钟为84MHz)产生一个1Hz的闪烁频率(即定时周期为1秒)。

我们需要计算 PSCARR 的值。

  1. 公式:
    T = 1s = (PSC + 1) * (ARR + 1) / 84,000,000 Hz

  2. 计算:
    我们需要让 (PSC + 1) * (ARR + 1) = 84,000,000
    这个数很大,我们需要把它分解为两个相乘的整数。

    • 一个常见的选择是让 (PSC + 1)(ARR + 1) 都接近84000000的平方根(约9165)。
    • 例如,令 PSC = 8399,那么 PSC + 1 = 8400
    • ARR + 1 = 84,000,000 / 8400 = 10,000
    • 因此,ARR = 9999
  3. 验证:

    • 计数器实际频率:F_CNT = 84 MHz / 8400 = 10,000 Hz = 10 kHz
    • 计数一次的时间:1 / 10 kHz = 0.1 ms
    • 从0计数到9999(共10000次)的时间:10000 * 0.1 ms = 1000 ms = 1s
    • 验证正确。
  4. 代码配置:

    // 在初始化函数中
    htim3.Instance = TIM3;
    htim3.Init.Prescaler = 8399;     // PSC
    htim3.Init.Period = 9999;        // ARR
    // ... 其他设置
    HAL_TIM_Base_Init(&htim3);
    

总结

项目正确公式
周期T = (PSC + 1) * (ARR + 1) / T_CLK
频率F_out = T_CLK / [ (PSC + 1) * (ARR + 1) ]
关键PSC+1 是一个整体,代表分频系数

2 通用定时器框图

在这里插入图片描述

2.1 时钟选择

1. 内部时钟(CK_INT)

  • 当对 TIMx_CR1->CEN 位写入1时,预分频器的时钟就由内部时钟 CK INT 提供
  • TIMx_SMCR->SMS 设置为 “000” 表示禁止从模式––如果 TIMx_CR1->CEN =“1”,预分频器时钟直接由内部时钟提供

2. 外部时钟模式 1:外部输入引脚脚 (TIx)

3. 外部时钟模式 2:外部触发输入 ETR,仅适用于 TIM2、TIM3 和 TIM4

4. 外部触发输入 (ITRx):使用一个定时器作为另一定时器的预分频器

2.2 时基单元

在这里插入图片描述

2.3 各个寄存器

15.4.7 TIMx 捕获/比较模式寄存器 1 (TIMx_CCMR1)【STM32F4xx中文参考手册 P432】

位 1:0 CC1S: 捕获/比较 1 选择 (Capture/Compare 1 selection)
位 2 OC1FE: 输出比较 1 快速使能 (Output compare 1 fast enable)
位 3 OC1PE: 输出比较 1 预装载使能 (Output compare 1 preload enable)
位 6:4 OC1M:输出比较 1 模式 (Output compare 1 mode)
位 7 OC1CE: 输出比较 1 清零使能 (Output compare 3 clear enable)

15.4.9 TIMx 捕获/比较使能寄存器 (TIMx_CCER)【STM32F4xx中文参考手册 P436】

1514131211109876543210
CC4NPRes.CC4PCC4ECC3NPRes.CC3PCC3ECC2NPRes.CC2PCC2ECC1NPRes.CC1PCC1E

位 0 CC1E:捕获/比较 1 输出使能 (Capture/Compare 1 output enable)
位 1 CC1P:捕获/比较 1 输出极性 (Capture/Compare 1 output Polarity)
位 3 CC1NP:捕获/比较 1 输出极性 (Capture/Compare 1 output Polarity)

15.4.13 TIMx 捕获/比较寄存器 1 (TIMx_CCR1)【STM32F4xx中文参考手册 P439】

CCR1[15:0]
CCR1[31:16] (depending on timers)
如果通道 CC1(指的是TIMx_CCMR1->CC1S) 配置为输出,CCR1 是捕获/比较寄存器 1 的预装载值
如果通道 CC1(指的是TIMx_CCMR1->CC1S) 配置为输入,CCR1 为上一个输入捕获 1 事件 (IC1) 发生时的计数器值

输入捕获

输出比较

在这里插入图片描述

测:测量外部输出的占空比、周期
产生:根据时钟频率产生方波信号

模式选择(CCMR1->OC1M[2:0])

在这里插入图片描述

常用模式PWM1

CCMR 寄存器中的 CC1S 配置为 00 表示 CC1 通道配置为输出模式
CCMR 寄存器中的 OC1M 配置为 110 代表选用 PWM模式1

CNT< CCR 输出高电平 CNT >= CCR 输出低电平
在这里插入图片描述

在这里插入图片描述

互补PWM的应用场景

同步buck电路(降压电源)
在这里插入图片描述

SW1 和 SW2 交替导通

正弦脉宽调制(SPWM)

编程实战(利用PWM互补实现交替呼吸灯实验)

在这里插入图片描述

高级定时器需要闭合 MOE 开关: TIM CtrlPWMOutputs(TIMl, ENABLE);

float t = GetTick() * 1.0e-3f;
float duty=0.5*(sin(2*3.14*t)+ 1);

这两行代码用于生成随时间按正弦规律变化的占空比,为后续生成正弦脉宽调制(SPWM)信号做准备,结合SPWM原理解释如下:

1. 时间变量的获取与转换

float t = GetTick() * 1.0e-3f;
  • GetTick() 通常是获取系统的“滴答计数”(一般为毫秒级,记录系统运行的累计时间)。
  • 乘以 1.0e-3f(即 0.001),是将毫秒单位的时间转换为秒,使得 t 表示“从起始时刻到当前的时间(单位:秒)”,作为正弦变化的时间基准

2. 正弦规律占空比的计算

float duty=0.5*(sin(2*3.14*t)+ 1);

这一行计算占空比的比例值(范围 0~1),步骤分解:

  • sin(2*3.14*t)2*3.14 近似为 ,因此这是一个周期为1秒的正弦函数(角频率 ω=2π,周期 T=2π/ω=1s),取值范围 [-1, 1],描述“正弦变化的周期性趋势”。
  • sin(2*3.14*t) + 1:将正弦波上移1,使取值范围从 [-1, 1] 变为 [0, 2],实现“单极性化”(占空比无负区间,只需要正区间变化)。
  • 0.5 * (...):将 [0, 2] 的范围缩放为 [0, 1],此时 duty 表示“占空比的比例”(0 对应0%占空比,1 对应100%占空比)。

与SPWM的关联

后续若要生成SPWM信号,需将 duty 映射到**捕获比较寄存器(CCR)**的值:
假设定时器的“自动重装载寄存器(ARR)”设为 1000(对应PWM周期的计数上限),则 CCR1 = duty * 1000(即 CCR1duty 按正弦规律变化)。

最终,定时器输出的PWM信号占空比会随时间按正弦规律变化,经滤波后可还原为平滑的正弦波,常用于逆变器、电机变频控制等场景。

一、输出比较基础原理与核心概念

输出比较是通用定时器(TIM2~TIM5)的核心功能之一,其本质是通过计数器(CNT)与捕获/比较寄存器(CCR)的实时比较,控制GPIO引脚输出特定电平或脉冲。典型应用包括PWM波形生成(如LED亮度调节、舵机控制)、单脉冲输出、频率占空比测量等。

1.1 输出比较的基本机制

当定时器计数器CNT的值与捕获/比较寄存器TIMx_CCRx的值匹配时,硬件会根据配置的输出模式(如PWM模式1/2、翻转模式等)改变输出引脚的电平状态。核心流程如下:

  1. 计数器计数CNT从0递增(或递减/中心对齐)至自动重载值ARR,再循环。
  2. 比较触发:当CNT == CCR时,触发比较事件,输出逻辑根据OCxM位配置改变电平。
  3. 输出使能:通过CCER寄存器的CCxE位控制通道输出到GPIO引脚。

1.2 关键寄存器与功能映射

寄存器作用
TIMx_CCRx存储比较值,决定PWM占空比或触发时刻
TIMx_ARR自动重载值,决定PWM周期或计数范围
TIMx_CCMR1/2配置输出模式(OCxM[2:0])、预装载使能(OCxPE)等
TIMx_CCER使能通道输出(CCxE)、配置输出极性(CCxP
TIMx_CR1控制计数模式(DIRCMS)、自动重载预装载(ARPE

二、输出比较模式与时序分析

2.1 PWM模式(PWM1与PWM2)

PWM(脉冲宽度调制)是输出比较最典型的应用,通过OCxM[2:0]配置为110(PWM模式1)或111(PWM模式2)实现。两者的核心区别在于有效电平的判定逻辑

  • PWM模式1:向上计数时,CNT < CCR输出有效电平;向下计数时,CNT > CCR输出无效电平。
  • PWM模式2:向上计数时,CNT < CCR输出无效电平;向下计数时,CNT > CCR输出有效电平。
时序示例(向上计数模式)
timelinetitle PWM模式1时序(ARR=1000, CCR=300)0 : CNT=0, OC1REF=高(有效)300 : CNT=300, OC1REF=低(无效)1000 : CNT=1000, 溢出,OC1REF=高(重新计数)

2.2 非PWM模式(翻转、强制、冻结)

除PWM外,输出比较还支持以下模式(通过OCxM配置):

  • 翻转模式(Toggle):每次CNT==CCR时,输出电平翻转(如高→低或低→高)。
  • 强制模式(Force):强制输出高/低电平(由OCxM子位选择)。
  • 冻结模式(Freeze):输出电平保持初始状态,仅在更新事件时刷新。

三、影子寄存器与预装载机制

3.1 影子寄存器的作用

TIMx_CCRxTIMx_ARR均配备影子寄存器(Shadow Register),用于缓冲写入值,确保多通道同步或周期内参数无抖动更新。当OCxPE(CCR预装载使能)或ARPE(ARR预装载使能)置1时,写入的新值仅在**更新事件(UEV)**发生时才会加载到影子寄存器,否则立即生效。

3.2 预装载的应用场景

  • 多通道PWM同步更新:多通道PWM需同时改变占空比时,可通过UEV同步加载所有CCR的新值。
  • 动态调整周期/占空比:在定时器运行时修改ARRCCR,通过预装载确保参数在周期结束后统一更新。

四、计数模式对输出的影响

4.1 递增计数(Upcounting)

计数器从0递增至ARR,溢出后重新从0开始。PWM模式下,一个周期内仅触发一次比较事件(CNT==CCR)。

4.2 递减计数(Downcounting)

计数器从ARR递减至0,下溢后重新从ARR开始。适用于需要从高到低触发比较的场景(如中心对齐PWM的下半周期)。

4.3 中心对齐计数(Center-Aligned)

计数器先递增至ARR-1(上溢),再递减至1(下溢),循环往复。中心对齐PWM可实现对称波形,但需注意CCR的取值范围(需小于ARR)。

五、STM32F407通用定时器的新特性

5.1 32位计数器(TIM2与TIM5)

TIM2和TIM5支持32位计数模式,可处理更长的定时周期(最大计数值2³²-1),适用于低频或长时间的PWM控制(如电机调速、电源管理)。

5.2 高级同步与级联功能

通过TIMx_SMCR寄存器可配置定时器级联,实现多定时器同步或分频。例如,TIM3的更新事件可作为TIM2的触发源,形成复杂的时序控制。

5.3 动态预装载与双缓冲机制

ARPEOCxPE的组合使用可实现运行时参数无扰更新。例如,在PWM输出过程中动态调整占空比,新值在下次更新事件时自动加载,避免波形抖动。

http://www.dtcms.com/a/515362.html

相关文章:

  • lodash-es
  • 股票交易网站建设四会市城乡规划建设局网站
  • API技术深度解析:从基础原理到最佳实践
  • 西安今晚12点封城吗龙岩网站优化
  • 使用有限体积法求解双曲型守恒性方程(一)FV 框架
  • jenkins流水线部署springboot项目
  • YOLOv5:目标检测的实用派王者
  • 《工业之心:Blender 工业场景解构》
  • 【Linux网络】应用层自定义协议
  • unity免费改名工具-Mulligan Renamer
  • Git分支的多人协作
  • 服务外包网站成都住建局官网app
  • 【ABAP函数】+ALSM_EXCEL_TO_INTERNAL_TABLE批导长字段
  • 艺术学院网站模板wordpress二手车模板
  • docker api 常用接口
  • flutter鸿蒙:实现类似B站或抖音的弹幕功能
  • 从静态模型到数据驱动:图观模型编辑器让工程设备真实还原
  • 了解Docker的多阶段构建(Multi-stage Build)
  • [特殊字符] Berry.Live:开箱即用的.NET直播流媒体服务器
  • 网站模板的修改宝安企业网站建设
  • 网站开发软件费用2018网站流量怎么做
  • 数据结构:顺序表讲解(1)
  • 第二次作业-第二章时间服务
  • Python爬虫实战:获取香港恒生指数历史数据与趋势分析
  • 【Frida Android】基础篇11:Native层hook基础——修改原生函数的返回值
  • 什么是DNS负载均衡?提升网站稳定性与容错性的方法
  • 设计自学网站哪个好建设银行网站怎么短信转账
  • 网站如何做seo优化教程迪虎科技网站建设
  • win10底部搜索栏怎么关闭 图文详解
  • 网站备案密码是什么样的大冶建设局网站