4. FLEXIO定时器详解:定时器结构、计数模式、比较匹配与PWM生成原理

FLEXIO定时器是FLEXIO模块的核心执行单元,负责为移位器提供精确的移位时钟、为外部引脚生成PWM波形,并实现输入信号的捕获与超时检测。本章深入剖析定时器的内部结构、四种计数模式、比较匹配机制以及PWM生成的完整流程。

关键概念: FLEXIO模块包含最多8个独立的定时器(TIMER0~TIMER7),每个定时器均可独立配置,互不干扰。定时器的核心功能是产生可编程的时钟/控制信号,驱动移位器或直接输出到引脚。

4.1 定时器内部结构

每个FLEXIO定时器由以下关键寄存器与逻辑单元构成:

  • 定时器控制寄存器(TIMCTL):配置定时器使能、触发源、触发极性、停止条件及输出引脚选择。
  • 定时器配置寄存器(TIMCFG):定义定时器启动条件、停止条件、复位条件及输出引脚初始状态。
  • 定时器比较寄存器(TIMCMP):存储16位的比较值,决定定时器计数的上限或PWM的占空比。
  • 16位计数器:实际运行的硬件计数器,在每个时钟周期递增或递减。
  • 比较器:实时比较计数器值与TIMCMP值,产生匹配事件。
  • 输出控制逻辑:根据比较匹配结果和配置模式,驱动定时器输出引脚的电平变化。
寄存器映射提示: 定时器编号与寄存器偏移地址对应,例如TIMER0的TIMCMP寄存器地址为基址+0x020,TIMER1为基址+0x024,依次类推。编程时务必确认定时器索引与寄存器地址的对应关系。
FLEXIO定时器内部结构框图 FLEXIO定时器内部结构框图 时钟源 (FLEXIO_CLK/外部) 16位计数器 (递增/递减) 比较器 (== TIMCMP) TIMCMP 比较值寄存器 输出控制逻辑 (PWM/触发) TIMER_OUT 输出引脚 TIMCTL / TIMCFG 控制与配置寄存器 说明: 计数器在时钟驱动下递增/递减,与TIMCMP比较产生匹配事件,输出控制逻辑根据匹配结果驱动引脚电平。

4.2 四种计数模式

FLEXIO定时器支持四种计数模式,通过TIMCFG寄存器的字段(位[1:0])选择。不同模式决定了计数器的计数方向、复位条件及输出行为。

TIMOD值 模式名称 计数方向 复位条件 典型应用
00 单次计数模式 递增 比较匹配后复位并停止 单脉冲生成、超时检测
01 连续计数模式 递增 比较匹配后复位并继续 PWM生成、周期性触发
10 双8位计数模式 高8位递增/低8位递减 低8位下溢复位 非对称PWM、特殊波形
11 触发计数模式 递增 触发事件复位 输入捕获、脉冲宽度测量
模式选择注意事项: 双8位计数模式(TIMOD=10)将16位计数器拆分为两个8位计数器,高8位用于控制周期,低8位用于控制占空比。此模式下TIMCMP寄存器的低8位与高8位分别对应不同的比较值,配置时需格外注意寄存器位域划分。

4.2.1 单次计数模式

计数器从0开始递增,当计数值等于TIMCMP值时产生比较匹配,计数器复位并停止。输出引脚在匹配时翻转一次。适用于生成单个脉冲或实现一次性的超时检测。

4.2.2 连续计数模式

计数器从0开始递增,达到TIMCMP值后复位并自动重新开始计数,形成连续的锯齿波。输出引脚在每个周期内根据配置的极性翻转一次,是生成标准PWM波形的首选模式。

4.2.3 双8位计数模式

计数器的高8位递增,低8位递减。当低8位下溢(从0x00变为0xFF)时,高8位加1,低8位重新从TIMCMP[7:0]开始递减。此模式可生成中心对齐的非对称PWM波形,适用于电机控制等需要死区补偿的场景。

4.2.4 触发计数模式

计数器在触发事件(由TIMCTL寄存器的TRGSEL字段选择)发生时复位并重新开始计数。常用于测量输入脉冲的宽度或周期,配合移位器实现输入捕获功能。

四种计数模式波形对比图 四种计数模式波形对比图 单次计数 (TIMOD=00) 0 TIMCMP 停止 连续计数 (TIMOD=01) 0 TIMCMP 复位 双8位计数 (TIMOD=10) 0 低8位下溢 高8位+1 触发计数 (TIMOD=11) 触发 TIMCMP 触发复位 说明: 蓝色-单次计数,红色-连续计数,紫色-双8位计数,绿色-触发计数。虚线表示计数器停止或复位后的行为。

4.3 比较匹配机制

比较匹配是定时器产生输出信号的核心事件。当16位计数器的值等于TIMCMP寄存器的值时,比较器输出匹配信号,触发以下动作:

  • 计数器复位:在单次和连续模式下,计数器立即复位为0。
  • 输出引脚翻转:根据TIMCFG寄存器的Polarity位,输出引脚电平发生翻转(高→低或低→高)。
  • 中断请求:如果TIMCTL寄存器的Timer Interrupt Enable (TIE)位置1,则产生定时器中断。
  • 移位器触发:匹配信号可作为移位器的移位时钟或加载信号,实现数据同步传输。
比较匹配的时序关键点: 比较匹配发生在计数器值等于TIMCMP值的下一个时钟周期。因此,实际输出波形的周期为 (TIMCMP + 1) 个时钟周期。例如,TIMCMP=99时,周期为100个时钟周期。

4.4 PWM生成原理

利用FLEXIO定时器的连续计数模式(TIMOD=01)可以方便地生成PWM波形。PWM的两个关键参数——频率和占空比——通过TIMCMP寄存器的配置实现。

4.4.1 频率控制

PWM频率由TIMCMP值决定,公式如下:

PWM频率 = FLEXIO_CLK / (TIMCMP + 1)

其中FLEXIO_CLK为定时器的输入时钟频率。例如,若FLEXIO_CLK=40MHz,TIMCMP=3999,则PWM频率=40MHz/4000=10kHz。

4.4.2 占空比控制

占空比由TIMCMP值与输出极性共同决定。在连续计数模式下,输出引脚在计数器复位时置为有效电平,在比较匹配时翻转。因此:

  • 高电平时间 = TIMCMP + 1 个时钟周期(若极性配置为高有效)
  • 低电平时间 = 周期 - 高电平时间
  • 占空比 = (TIMCMP + 1) / (TIMCMP + 1) × 100% = 50%(固定)
重要限制: 标准连续计数模式只能生成50%固定占空比的方波。要实现可调占空比的PWM,必须使用双8位计数模式或配合移位器输出。双8位模式下,高8位控制周期,低8位控制占空比,实现0%~100%的占空比调节。

4.4.3 双8位模式PWM配置示例

以下代码展示了如何配置定时器0在双8位模式下生成PWM波形:

// 假设 FLEXIO_CLK = 40MHz
// 目标:PWM频率 = 10kHz,占空比 = 60%

// 1. 计算周期值(高8位)
// 周期 = FLEXIO_CLK / 频率 = 40MHz / 10kHz = 4000
// 高8位 = 4000 / 256 = 15(取整)
uint8_t period_high = 15;

// 2. 计算占空比(低8位)
// 占空比 = 60% → 高电平时间 = 4000 * 0.6 = 2400
// 低8位 = 2400 % 256 = 96
uint8_t duty_low = 96;

// 3. 配置TIMCMP寄存器
// TIMCMP[15:8] = period_high, TIMCMP[7:0] = duty_low
FLEXIO_0->TIMCMP[0] = (period_high << 8) | duty_low;

// 4. 配置TIMCFG为双8位模式
FLEXIO_0->TIMCFG[0] = (3 << 0) |   // TIMOD = 11 (双8位)
                       (1 << 8) |   // TIMOUT = 1 (输出使能)
                       (0 << 12);   // 极性配置
PWM生成原理时序图 PWM生成原理时序图(双8位模式) 计数器值 0 低8位下溢 高8位+1 周期结束 PWM输出 占空比 = 60% 占空比 = 40% 说明: 红色波形为PWM输出,高电平宽度由低8位比较值控制,周期由高8位比较值控制。通过调整TIMCMP的低8位可实现占空比调节。

4.5 定时器配置流程总结

配置FLEXIO定时器生成PWM或驱动移位器的标准流程如下:

  1. 使能FLEXIO模块时钟:在CCM模块中配置FLEXIO时钟门控。
  2. 配置定时器时钟源:通过TIMCTL寄存器的Timer Clock Select (TCLKSEL)字段选择内部时钟或外部引脚时钟。
  3. 选择计数模式:设置TIMCFG寄存器的TIMOD字段为所需模式。
  4. 配置触发源:若使用触发模式,设置TRGSEL字段选择触发信号来源。
  5. 设置比较值:写入TIMCMP寄存器,确定周期和占空比。
  6. 配置输出引脚:设置TIMCTL的Timer Output Select (TIMOUT)位,使能输出到外部引脚。
  7. 使能定时器:设置TIMCTL的Timer Enable (TEN)位为1,启动定时器。
调试建议: 在首次配置定时器时,建议先使用单次计数模式验证比较匹配是否正常,再切换到连续模式生成PWM。使用逻辑分析仪观察TIMER_OUT引脚波形,确认频率和占空比符合预期。