4. FLEXIO定时器详解:定时器结构、计数模式、比较匹配与PWM生成原理
FLEXIO定时器是FLEXIO模块的核心执行单元,负责为移位器提供精确的移位时钟、为外部引脚生成PWM波形,并实现输入信号的捕获与超时检测。本章深入剖析定时器的内部结构、四种计数模式、比较匹配机制以及PWM生成的完整流程。
4.1 定时器内部结构
每个FLEXIO定时器由以下关键寄存器与逻辑单元构成:
- 定时器控制寄存器(TIMCTL):配置定时器使能、触发源、触发极性、停止条件及输出引脚选择。
- 定时器配置寄存器(TIMCFG):定义定时器启动条件、停止条件、复位条件及输出引脚初始状态。
- 定时器比较寄存器(TIMCMP):存储16位的比较值,决定定时器计数的上限或PWM的占空比。
- 16位计数器:实际运行的硬件计数器,在每个时钟周期递增或递减。
- 比较器:实时比较计数器值与TIMCMP值,产生匹配事件。
- 输出控制逻辑:根据比较匹配结果和配置模式,驱动定时器输出引脚的电平变化。
4.2 四种计数模式
FLEXIO定时器支持四种计数模式,通过TIMCFG寄存器的
| TIMOD值 | 模式名称 | 计数方向 | 复位条件 | 典型应用 |
|---|---|---|---|---|
| 00 | 单次计数模式 | 递增 | 比较匹配后复位并停止 | 单脉冲生成、超时检测 |
| 01 | 连续计数模式 | 递增 | 比较匹配后复位并继续 | PWM生成、周期性触发 |
| 10 | 双8位计数模式 | 高8位递增/低8位递减 | 低8位下溢复位 | 非对称PWM、特殊波形 |
| 11 | 触发计数模式 | 递增 | 触发事件复位 | 输入捕获、脉冲宽度测量 |
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字段选择)发生时复位并重新开始计数。常用于测量输入脉冲的宽度或周期,配合移位器实现输入捕获功能。
4.3 比较匹配机制
比较匹配是定时器产生输出信号的核心事件。当16位计数器的值等于TIMCMP寄存器的值时,比较器输出匹配信号,触发以下动作:
- 计数器复位:在单次和连续模式下,计数器立即复位为0。
- 输出引脚翻转:根据TIMCFG寄存器的Polarity位,输出引脚电平发生翻转(高→低或低→高)。
- 中断请求:如果TIMCTL寄存器的Timer Interrupt Enable (TIE)位置1,则产生定时器中断。
- 移位器触发:匹配信号可作为移位器的移位时钟或加载信号,实现数据同步传输。
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%(固定)
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); // 极性配置
4.5 定时器配置流程总结
配置FLEXIO定时器生成PWM或驱动移位器的标准流程如下:
- 使能FLEXIO模块时钟:在CCM模块中配置FLEXIO时钟门控。
- 配置定时器时钟源:通过TIMCTL寄存器的Timer Clock Select (TCLKSEL)字段选择内部时钟或外部引脚时钟。
- 选择计数模式:设置TIMCFG寄存器的TIMOD字段为所需模式。
- 配置触发源:若使用触发模式,设置TRGSEL字段选择触发信号来源。
- 设置比较值:写入TIMCMP寄存器,确定周期和占空比。
- 配置输出引脚:设置TIMCTL的Timer Output Select (TIMOUT)位,使能输出到外部引脚。
- 使能定时器:设置TIMCTL的Timer Enable (TEN)位为1,启动定时器。