资讯中心

软件:STM32-F1系列-TIM定时器介绍(2026/6/29)

📅 2026/7/26 23:00:00
软件:STM32-F1系列-TIM定时器介绍(2026/6/29)
目录时钟来源简介时基单元:输出比较:一、什么叫输出比较(Output Compare)二:一个具体的时基例子来介绍输出比较三:OC输出比较控制了gpio的输出电平四:定时器中输出比较的几种模式(1)Frozen(2)Active(置高电平)(3)Inactive(置低电平)(4)Toggle(翻转)最经典的(5)PWM模式(最重要)五:有哪些实际项目应用?① 软件定时输出② 蜂鸣器驱动(Toggle)③ PWM控制④:定时触发ADC⑤:步进电机六:占空比和分辨率1:什么是“分辨率” (Reso)?2:什么是占空比:输入捕获:测频法:(脉冲频率高时用)测周法:(脉冲频率低时用)编码器接口:本质作用:程序框图一:定时器采用:RCC内部时钟①:定时器定时:demo②:定时器输出比较:demo③:输入捕获测频率demo④:输入捕获测脉冲占空比demo二:定时器采用:外部时钟源定时器计数:代码demo编码器测速:代码demo时钟来源简介STM32 的定时器想象成一个“电子秒表”。不管这个秒表是哪里供电的(电池、插座、或者别人推着转),它的核心工作逻辑永远是:接收一个脉冲(心跳/嘀嗒声)。计数器加 1。数满了(溢出),响一声(中断)或者做个动作所有时钟源的区别,本质上就是“这个嘀嗒声是从哪来的”结论:时钟源提供了基础的心跳速度,而 PSC 和 ARR 是在这个心跳基础上进行减速,最终决定多久溢出一次。内部时钟:TIM来计数外部时钟模式2:GPIO或者其余能产生脉冲的东西,接到引脚上就可以使用该模式ETR外部时钟模式1:这个模式,定时器TIM有些有4个通道TL1~TL4都可以作为输入源+ETR编码器模式:这个模式仅2个通道TL1~TL2都可以作为输入源定时器是计数用的,cnt++,所以这些输入源都是为了让cnt++倒是输入捕获和输出比较的时候,TL1输入的脉冲和写入CCR的值是一个if判断条件。让cnt++的东西还是我们的内部时钟,这个不能弄乱,然后就是编码器模式一般是双相,TL1和TL2同时接入,一个定时器可以测出速度,而TL3和TL4不接入编码器模式。时基单元:1️⃣ PSC(Prescaler,预分频器)位数:16 位 → 分频范围 1~65536作用:降低时钟频率,有个经典的 off-by-one 坑:写进去的值是 "分频系数 - 1"。影子寄存器:PSC 是带缓冲的(阴影寄存器)。你改了 PSC,不会立刻生效,要等下次更新事件(UEV)才刷进去。这是为了防止计数中途改分频导致一拍错乱。2️⃣ CNT(Counter,计数器)位数:TIM2/TIM5 是32 位,TIM3/TIM4 是 16 位(F1 系列)作用:每个 CK_CNT 脉冲来,CNT += 1(或 -=1,取决于方向)三种计数模式:向上计数(最常用):0 → ARR,归零重来向下计数:ARR → 0,重装 ARR 再来中心对齐:0 → ARR → 0 → ARR…(PWM 对称波常用,减少谐波)3️⃣ ARR(Auto-Reload Register,自动重装载)位数:16 位作用:设定 CNT 的"天花板"。CNT 数到 ARR 那一刻:CNT 清零(向上模式)产生更新事件 UEV可以触发中断 / DMA / TRGO同样 off-by-one:想要 1000 次溢出,ARR 写999:影子寄存器:可开可不开。你可以配置:ARPE = 0:写 ARR 立刻生效(可能下一拍就乱)ARPE = 1:写 ARR 等下次 UEV 才生效(安全,PWM 推荐)更新事件 UEV —— 时基的"产出物"CNT 溢出那一瞬间,硬件自动干这几件事:CNT 归零(或重装 ARR,向下计数时)影子寄存器刷新:PSC、ARR、CCRx 的缓冲值 → 生效值UEV 信号产生:可以打中断(TIM_IT_Update)可以触发 DMA可以送出TRGO(给 ADC/DAC/其他 TIM)你之前问的"硬件自动化"就在这儿——UEV 可以不打扰 CPU,直接 TRGO → ADC 启动采样,这就是定时采样不占 CPU 的典型玩法。初学最容易踩的三个坑PSC/ARR 要减 1:想分 72 分频,写 71;想数 1000 次,ARR 写 999。PSC/ARR 影子寄存器:刚改完 ARR,发现 CNT 还没按新值跑——因为它在等下次 UEV。调试时容易懵。TIM2/TIM5 是 32 位:F1 上只有它俩是 32 位 CNT,要做超长定时(比如几秒~几分钟)用这俩,TIM3/TIM4 16 位最大 65535,分频不够就容易溢出太频。输出比较:定义:STM32 的输出比较(Output Compare,简称 OC)是很多人学习定时器时容易混淆的地方,因为它和 PWM 放在一起讲,但实际上PWM只是输出比较功能的一种特殊应用,输出比较不只是用于PWM电平调制。一、什么叫输出比较(Output Compare)一句话:让定时器CNT计数到指定数值(CCR)时,自动对输出引脚执行一个动作。二:一个具体的时基例子来介绍输出比较假设:ARR = 999,PSC = 71,72 MHZ变为1MHZ,自动重转载计数从0~999如果:设置CCR1 = 500那么:500 ← 匹配!到了500这一瞬间,比较器发现CNT == CCR1,于是OC事件发生依据:OC Mode,决定电平是否变化。一个通用定时器内部通常包含 4 套独立的比较电路,每套电路都有自己的 CCR 寄存器(即 CCR1、CCR2、CCR3、CCR4)三:OC输出比较控制了gpio的输出电平STM32里面每一路定时器都有:TIMx_CH1TIMx_CH2TIMx_CH3TIMx_CH4例如:TIM3_CH1可以映射到PA6于是:CNT == CCR1时,TIM3_CH1会输出你想要的电平至PA6,PA6就会自动改变状态,所以输出比较最终控制的是:对应通道输出引脚的电平。四:定时器中输出比较的几种模式STM32最常见有五种:Frozen,Active,Inactive,Toggle,PWM(1)Frozen CNT == CCR时,什么都不做,一般用于,只产生中断不改变IO。 很多程序就是用于,开启OC中断,CNT==CCR,进入中断,CPU处理事情。(2)Active(置高电平)CNT == CCR时,比较成功,IO口输出低电平变为高电平。 低电平_________,到了CCR变为_______| ̄ ̄ ̄ ̄ ̄ ̄ ̄ 如果:CCR=500 那么:CNT 0----------------500----------------999 输出 _________| ̄ ̄ ̄ ̄ ̄ ̄(3)Inactive(置低电平)CNT == CCR时,比较成功,IO口输出高电平变为低电平。高电平  ̄ ̄ ̄ ̄ ̄ ̄ ̄,到了CCR变为 ̄ ̄ ̄ ̄|__________(4)Toggle(翻转)最经典的例如:第一次:___