1. 通用定时器单元Timer4
搭载两个通用定时器单元,每个单元含有4个通道。本产品的引脚兼用功能可配置到除P00以外的任意端口,因此通用定时器单元的通道数可灵活配置。
2. Timer4的基本功能
2.1 独立通道运行功能:
- 间隔定时器:用作以固定间隔产生中断(INTTMmn)的基准定时器。
- 方波输出:每当产生INTTMmn中断时,就进行交替运行并且从定时器的输出引脚(TOmn)输出50%占空比的方波。
- 外部事件计数器:对定时器输入引脚(TImn)的输入信号的有效边沿进行计数,如果达到规定次数,就能用作产生中断的事件计数器。
- 分频器:定时器输入引脚(TImn)的输入时钟进行分频,然后从输出引脚(TOmn)输出。
- 输入脉冲间隔的测量:在定时器输入引脚(TImn)的输入脉冲信号的有效边沿开始计数并且在下一个脉冲的有效边沿捕捉计数值,从而测量输入脉冲的间隔。
- 输入信号的高低电平宽度的测量:在定时器输入引脚(TImn)的输入信号的一个边沿开始计数并且在另一个边沿捕捉计数值,从而测量输入信号的高低电平宽度。
- 延迟计数器:在定时器输入引脚(TImn)的输入信号的有效边沿开始计数并且在经过任意延迟期间后产生中断。
2.2 多通道联动运行功能
多通道联动运行功能是将主控通道(主要控制周期的基准定时器)和从属通道(遵从主控通道运行的定时器)组合实现的功能。
- 单触发脉冲输出:将2个通道成对使用,生成能任意设置输出时序和脉宽的单触发脉冲。
- PWM输出将2个通道成对使用,生成能任意设置周期和占空比的脉冲
- 多重PWM输出:能通过扩展PWM功能并且使用1个主控通道和多个从属通道,以固定周期生成最多3+3种任意占空比的PWM信号。
3. 定时器时钟的设置
运行时钟与定时器通道在复位时并不绑定,可分别设置,按需求组合。其中TPSm设置PSC,TDRmn设置ARR。
3.1 各运行时钟预分频器的设置(TPSm)
3.2 各定时器通道的设置(TMRmn)
m:单元号(m=0,1) n:通道号(n=0~3)
3.3 各通道定时器时间的设定(TDRmn)
- 定时器数据寄存器mn(TDRmn)用作比较寄存器的情况从TDRmn寄存器的设置值开始递减计数,当计数值变为“0000H”时,产生中断信号(INTTMmn)。保持TDRmn寄存器的值,直到被改写为止。
- 定时器数据寄存器mn(TDRmn)用作捕捉寄存器的情况通过输入捕捉触发,将定时器计数寄存器mn(TCRmn)的计数值捕捉到TDRmn寄存器。能选择TImn引脚的有效边沿作为捕捉触发信号。通过定时器模式寄存器mn(TMRmn)来设置捕捉触发的选择。
4. 定时器时间的设置(以输出比较为例)
目标:生成 2 kHz 的 PWM 输出,要求占空比分辨率 ≥ 1%,即周期计数深度 ≥ 100。
4.1 需求分析
为实现 2 kHz PWM 输出 且占空比分辨率不超过 1% 的要求,需对定时器的输入时钟频率及其分频策略进行如下计算和配置:
- 占空比分辨率要求分析
- PWM 频率:2 kHz
- 占空比分辨率要求:不低于 1%
- 即:PWM 计数周期需不少于 100 个计数点
因此,对应的定时器时钟频率应满足:
$$
f_{timer} \geq 2\,\text{kHz} \times 100 = 200\,\text{kHz}
$$
- 定时器时钟分频计算
系统主时钟频率为:
$$
f_{clk} = 64\,\text{MHz}
$$
需要求出定时器时钟的最小分频倍数:
$$
\frac{f_{clk}}{f_{timer}} = \frac{64\,\text{MHz}}{200\,\text{kHz}} = 320
$$
计算对数:
$$
\log_2(320) \approx \log_2(2^8 \times 1.25) = 8 + \log_2(1.25) \approx 8.3219
$$
对结果向下取整,得到分频指数为 8
,即选择:
$$
\text{分频系数} = 2^8 = 256
$$
- 时钟源选择
定时器支持多个内部时钟源(如 CKm0、CKm1、CKm3 等)。本例中选择 CKm0 作为定时器时钟源,配合上述分频配置,可获得适用于本需求的定时器时钟频率。
- 定时器通道配置(PWM 多通道模式)
为实现 PWM 波形输出,需配置定时器为 多通道 PWM 模式:
- 主通道:通道 0(用于设置周期和占空比基准)
- 从通道:通道 1(作为实际 PWM 输出通道)
在该配置下,通道 1 作为从通道输出 PWM 信号,周期和比较值由主通道(通道 0)控制。
4.2 示例代码
while(1){
Cnt = (Cnt + 1) % 50;
TM40_PWM_1Period_1Duty(125, 100+(abs(25-Cnt)));
delayMs(50);
}
/***********************************************************************************************************************
* Function Name: TM40_PWM_1Period_1Duty
* @brief This function initializes the TM4 module as PWM function.
* @param period - the period of PWM waveform
* @param duty - the duty factor of PWM waveform
* @return None
***********************************************************************************************************************/
void TM40_PWM_1Period_1Duty(uint16_t period, uint16_t duty)
{
CGC->PER0 |= CGC_PER0_TM40EN_Msk; /* enables input clock supply */
//下方修改运行时钟的分频系数,这里用到的是_0008_TM4_CKM0_fCLK_8
TM40->TPS0 = _0000_TM4_CKM3_fCLK_8 | _0000_TM4_CKM2_fCLK_1 | _0000_TM4_CKM1_fCLK_0 | _0008_TM4_CKM0_fCLK_8;
/* master channel */
//修改主通道的运行时钟
TM40->TMR00 = _0000_TM4_CLOCK_SELECT_CKM0 | _0000_TM4_TRIGGER_SOFTWARE | _0001_TM4_MODE_PWM_MASTER;
TM40->TDR00 = period - 1;
TM40->TO0 &= ~_0001_TM4_CH0_OUTPUT_VALUE_1;
TM40->TOE0 &= ~_0001_TM4_CH0_OUTPUT_ENABLE;
/* slave channel */
//修改从通道的运行时钟,与主通道保持一致
TM40->TMR01 = _0000_TM4_CLOCK_SELECT_CKM0 | _0400_TM4_TRIGGER_MASTER_INT | _0009_TM4_MODE_PWM_SLAVE;
TM40->TDR01 = duty;
TM40->TOM0 |= _0002_TM4_CH1_SLAVE_OUTPUT; /* slave channel output mode */
TM40->TOL0 &= ~_0002_TM4_CH1_OUTPUT_LEVEL_L; /* positive logic output (active-high) */
TM40->TO0 &= ~_0002_TM4_CH1_OUTPUT_VALUE_1; /* TOmp default output level */
TM40->TOE0 |= _0002_TM4_CH1_OUTPUT_ENABLE; /* Enable TOmp output by counting operation */
TO01_PORT_SETTING();
/* Start specify channel */
TM40_Channel_Start(TM4_CHANNEL_0 | TM4_CHANNEL_1);
};
//设定输出引脚,我这里接LED,作呼吸灯的效果
/* ToDo: You can allocate the TO01 to any desired pins with PxxCFG register */
#define TO01_PORT_SETTING() do{ \
PORT->P31CFG = PTCFG_TO01; /* allocate TO01 to P31 */ \
PORT->PM3 &= ~(1 << 1); /* P31 is used as TO01 output */ \
PORT->POM3 &= ~(1 << 1); /* P31 is normal output mode */ \
PORT->PMC3 &= ~(1 << 1); /* P31 digital function */ \
}while(0)