STM32的TIMx中Prescaler和ClockDivision的区别
Prescaler预分频,以笔者目前的学习程度来说,这个参数,一般来说是对主时钟进行分频后的计数器时钟。这个预分频后的时钟主要是用于的计数的。
这个主时钟,对于时基单元来说可以是内部时钟,也可以是外部时钟。一般来说我们的内部时钟是72MHZ的,经过预分频比如 Prescaler = 72-1;那么现在的计数时钟是1MHZ。
对于外部时钟来说,首先这个外部时钟是通过GPIO口输入来作为时基单元的主时钟的,那么这个时候设置的PSC参数就是对外部时钟分频,举个例子:比如我们把对射式光耦的触发频率作为主时钟频率,显然这个时钟是一个不稳定的偶发性时钟,完全取决于它的光耦触发频率。然后呢我们再设置时基单元的PSC = 2-1;那么现在的时钟频率就是feq_CK_CNT = 光耦触发频率 / (2-1)+1; 相当于光耦触发两次,计数器就会加1.
那么对于CLockDivision,这个主要是对定时器的主时钟进行分频,一般来说这个时钟就是内部时钟72MHZ,所以定时器滤波的采样时钟(目前笔者认为是针对外部输入或者输入捕获的)可以直接是这个主时钟频率72MHZ也可以是分频后的频率比如2分频是36MHZ,这个分频后的频率写为fDTS。
举个例子,假设主时钟频率是 72MHz,CKD 设置为分频因子 2,那么 fDTS 的频率就是 36MHz。此时,如果数字滤波器使用这个 fDTS 作为采样时钟,每个采样周期的时间是 1/36MHz≈27.78ns。如果设置滤波器的采样次数为 4 次,那么有效的滤波时间就是 4*27.78≈111ns,即只有信号稳定超过这个时间才会被确认。如果 CKD 设置为分频因子 4,fDTS 为 18MHz,采样周期为 55.56ns,四次采样就是 222ns,这样滤波时间更长,可以滤除更宽的脉冲噪声,但信号变化的检测会有更大的延迟。
STM32 定时器的外部时钟输入(如 ETR 引脚)最大频率为 APB 时钟的 1/4。若 APB 时钟为 72MHz,则外部输入信号最高为 18MHz。
看一下手册上相关的部分的说明:
其实这个图笔者看不太懂,如果这个tDTS代表频率的话好像和上文的陈述相反的,如果tDTS代表的是采样时间的话那确实是正确的,比如10:代表4分频,4分频后的采样时间是不分频的4倍。
这个主要是针对ETR设置的,具体操作库函数是:
TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,
uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);第二个参数是PSC的设置联系上下文,这个参数我们设置为2即TIM_ExtTRGPSC_DIV2,那代表光耦工作两次计数器加1.
这个最后一项的参数就是寄存器ETF的相关设置,设置的就是外部触发滤波的方式共16种,这里说明一下这个框图里的描述“它记录到N个事件后会产生一个输出的跳变”,这里的N个事件指代的是什么意思?一开始笔者把它和PSC能混了,以为这个事件是指光耦的跳变电平信号,N个时间就是指N个跳变电平信号。其实不然,如果触发电平是上升沿,那么N个事件就是说在N个采样周期内采样到的电平都是高电平,同理如果触发电平是下降沿,那么N个事件就是说在N个采样周期内采样到的电平都是低电平。
对于输入信号的处理,区别分辩不同场景输入信号的处理方式(下文来着deepseek)
一、功能对比
功能模块 | ETR 外部触发通道 | 定时器输入通道(CH1-CH4) | 外部中断(EXTI) |
---|---|---|---|
核心用途 | 外部时钟同步或触发定时器操作 | 输入捕获(频率、脉宽测量)、PWM 输入 | 快速响应外部电平 / 边沿变化 |
信号处理能力 | 支持高频信号(最高 APB/4) | 支持高频信号(受定时器时钟限制) | 低频信号(依赖中断响应速度) |
硬件资源 | 定时器专用引脚(如 TIMx_ETR) | 定时器复用引脚(TIMx_CH1~CH4) | 任意 GPIO(需配置为 EXTI) |
信号滤波 | 可配置数字滤波器(基于 tDTS) | 可配置数字滤波器(基于 tDTS) | 无硬件滤波,依赖软件去抖 |
分频 / 预分频 | 支持外部时钟预分频(ETRPSC) | 支持输入捕获分频(ICPSC) | 无分频,直接响应边沿 |
触发事件类型 | 上升沿、下降沿、双边沿 | 上升沿、下降沿、双边沿 | 上升沿、下降沿、双边沿 |
中断 / DMA 支持 | 支持触发中断或 DMA 请求 | 支持输入捕获中断或 DMA | 仅支持中断 |
二、应用场景对比
1. ETR 外部触发通道
- 适用场景:
- 高频外部时钟输入(如外部晶振、高速脉冲计数)。
- 定时器级联(主从模式,同步多个定时器)。
- 精确触发 ADC/DAC 等外设(通过定时器触发输出)。
- 示例:
使用 ETR 引脚接收 18MHz 外部时钟,驱动定时器计数(PSC=0),实现高精度计时。
2. 定时器输入通道(CH1-CH4)
- 适用场景:
- PWM 输入模式测量占空比和频率(如电机控制)。
- 编码器接口(正交编码信号解码)。
- 输入捕获测量脉冲宽度(超声波测距、红外通信)。
- 示例:
配置 TIMx_CH1 为输入捕获模式,测量 10kHz PWM 信号的上升沿和下降沿时间差,计算占空比。
3. 外部中断(EXTI)
- 适用场景:
- 按键检测(低频率、非精确时序需求)。
- 快速响应外部事件(如紧急停止信号)。
- 简单电平状态监控(如传感器触发)。
- 示例:
配置 EXTI13(连接按键 GPIO)为下降沿触发,检测按键按下事件并唤醒 MCU。
三、关键差异总结
-
信号处理能力
- ETR:专为高频信号设计,支持外部时钟输入和复杂触发逻辑。
- 定时器输入通道:适合中高频信号的时间参数测量(如脉宽、频率)。
- EXTI:仅适合低频事件响应,无法处理高频或精确时序需求。
-
硬件集成度
- ETR / 定时器通道:与定时器深度集成,支持滤波、分频等硬件预处理。
- EXTI:独立于定时器,依赖软件处理信号抖动和事件响应。
-
中断响应速度
- ETR / 定时器通道:通过硬件自动记录时间戳,中断延迟对测量精度无影响。
- EXTI:中断延迟(通常 1~2μs)直接影响事件响应实时性。
四、替代性分析
1. 何时可以互相替代?
- 低频事件检测(如按键检测):
EXTI 和定时器输入通道均可实现,但 EXTI 更节省资源。 - 边沿触发计数:
ETR 和输入通道均可实现,但 ETR 适合高频,输入通道适合带时间戳的计数。
2. 何时不可替代?
- 高频信号处理(>100kHz):必须使用 ETR 或定时器输入通道。
- 精确时间测量(如超声波测距):必须使用定时器输入捕获。
- 硬件级信号同步(如 ADC 触发):必须使用 ETR 或定时器触发输出。
5、配置建议
-
高频信号(>1MHz)
- 首选 ETR 外部时钟模式,配合预分频器(ETRPSC)降低频率至 APB/4 以内。
- 例:144MHz 信号 → 外部分频 8 倍 → 18MHz → ETR 输入。
-
中频信号(10kHz~1MHz)
- 使用定时器输入捕获通道,开启数字滤波(ICF)抗噪声。
- 例:测量 100kHz PWM 占空比,配置 ICPSC 分频和双边沿捕获。
-
低频事件(<10kHz)
- 使用 EXTI,配合软件去抖(如定时器轮询或二次检测)。
- 例:检测按键按下,EXTI 触发中断后启动防抖延时。
然后对这个滤波器笔者自己的一些猜想和看法,首先由DEEPSEEK指出,高频信号适用的是ETR端口,但是ETR端口最大采样频率是18MHZ,为什么会这样呢?
从滤波逻辑来说,72M的每个周期都用于检测信号的话最大也只能能检测72MHZ的外源波形 ,如果我们极端点外源信号是144MHZ,那么可见的无论你怎么挑选检测周期,72M的每个周期内必然检测到边沿信号,一旦检测到边沿跳变信号,信号就会被滤波器过滤掉,因此它就不会输出任何信号。因此采样频率要尽量的快
显然滤波功能起码包括三个阶段,开始滤波,检测信号,结束滤波,三部分最少要三个周期 。因此72MHZ的主频只能检测18MHZ的信号是可以理解的,因为极限也就24MHZ。