TIM简介
- TIM(Timer)定时器
- 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断
- 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时
- 不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能
- 根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型
实际外设: STM32F103C8T6定时器资源:TIM1、TIM2、TIM3、TIM4
| 类型 | 编号 | 总线 | 功能 |
|---|---|---|---|
| 高级定时器 | TIM1、TIM8 | APB2 | 拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能 |
| 通用定时器 | TIM2、TIM3、TIM4、TIM5 | APB1 | 拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能 |
| 基本定时器 | TIM6、TIM7 | APB1 | 拥有定时中断、主模式触发DAC的功能 |
TIM结构
主要结构
- 预分频器 PSC
- 计数器 CNT
- 自动重装器 ARR
- 重复计数器 REP
高级定时器

通用定时器

基本定时器

定时器中断结构

定时器的触发模式
- 内部时钟触发:CK_INT
- 外部时钟触发(外部时钟模式2):ETR
- 从模式触发(外部时钟模式1):TRGI
- 编码器接口触发:TI1FP1&TI2FP2
时基单元
预分频器
计数器计数频率:
计数器
计数器溢出频率:
ARPE=0时,TIMx_ARR无预装入。ARR值即刻生效(不建议)
ARPE=1时,TIMx_ARR有预装入。ARR值在下次重装时生效
代码
|
|
配置TIM时钟
- 选择内部时钟( INT ):
void TIM_InternalClockConfig(TIM_TypeDef* TIMx); - 选择其他定时器( ITRx ):
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); - 选择外部引脚( TIx ):
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource, uint16_t TIM_ICPolarity, uint16_t ICFilter); - 选择外部时钟( ETR )
- 模式1( TRGI ):
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter); - 模式2:
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);
- 模式1( TRGI ):
主要参数:
TIMx为TIM编号TIM_InputTriggerSource为输入定时器源TIM_TIxExternalCLKSource为外部输入引脚TIM_ICPolarity为外部引脚极性选择ICFilter为外部引脚滤波器:0x0-0xFTIM_ExtTRGPrescaler为外部时钟预分频器TIM_ExtTRGPolarity为外部时钟极性ExtTRGFilter为外部时钟滤波器:0x0-0xF
| TIM_InputTriggerSource | 值 | 描述 |
|---|---|---|
| TIM_TS_ITR0 | ((uint16_t)0x0000) | TIM内部触发0 |
| TIM_TS_ITR1 | ((uint16_t)0x0010) | TIM内部触发1 |
| TIM_TS_ITR2 | ((uint16_t)0x0020) | TIM内部触发2 |
| TIM_TS_ITR3 | ((uint16_t)0x0030) | TIM内部触发3 |
| TIM_TIxExternalCLKSource | 值 | 描述 |
|---|---|---|
| TIM_TS_TI1FP1 | ((uint16_t)0x0050) | TIMIC1连接TI1(即使用TIMx_CH1) |
| TIM_TS_TI2FP2 | ((uint16_t)0x0060) | TIMIC2连接TI2(即使用TIMx_CH2) |
| TIM_TS_TI1F_ED | ((uint16_t)0x0040) | TIMIC1连接TI1,使用边缘检测 |
| TIM_ExtTRGPrescaler | 值 | 描述 |
|---|---|---|
| TIM_ExtTRGPSC_OFF | ((uint16_t)0x0000) | TIM ETRP 不分频 |
| TIM_ExtTRGPSC_DIV2 | ((uint16_t)0x1000) | TIM ETRP 二分频 |
| TIM_ExtTRGPSC_DIV4 | ((uint16_t)0x2000) | TIM ETRP 四分频 |
| TIM_ExtTRGPSC_DIV8 | ((uint16_t)0x3000) | TIM ETRP 八分频 |
| TIM_ICPolarity | 值 | 描述 |
|---|---|---|
| TIM_ICPolarity_Rising | ((uint16_t)0x0000) | 上升沿有效 |
| TIM_ICPolarity_Falling | ((uint16_t)0x0002) | 下降沿有效 |
| TIM_ICPolarity_BothEdge | ((uint16_t)0x000A) | 双边缘有效 |
| TIM_ICPolarity | 值 | 描述 |
|---|---|---|
| TIM_ExtTRGPolarity_Inverted | ((uint16_t)0x8000) | 极性翻转,低电平或下降沿有效 |
| TIM_ExtTRGPolarity_NonInverted | ((uint16_t)0x0000) | 极性不翻转,高电平或上升沿有效 |
配置时基单元
TIM_ClockDivision为时钟分频,与预分频器作用类似,但作用有限TIM_CounterMode为计数方式TIM_Period为自动重装值( ARR )TIM_Prescaler为预分频系数( PSC )TIM_RepetitionCounter为重复计数值( REP ,仅高级定时器有效)
| TIM_ClockDivision | 值 | 描述 |
|---|---|---|
| TIM_CKD_DIV1 | ((uint16_t)0x0000) | 不分频 |
| TIM_CKD_DIV2 | ((uint16_t)0x0100) | 二分频 |
| TIM_CKD_DIV4 | ((uint16_t)0x0200) | 四分频 |
| TIM_CounterMode | 值 | 描述 |
|---|---|---|
| TIM_CounterMode_Up | ((uint16_t)0x0000) | 向上计数模式 |
| TIM_CounterMode_Down | ((uint16_t)0x0010) | 向下计数模式 |
| TIM_CounterMode_CenterAligned1 | ((uint16_t)0x0020) | 中心对齐计数模式,向下计数时匹配 |
| TIM_CounterMode_CenterAligned2 | ((uint16_t)0x0040) | 中心对齐计数模式,向上计数时匹配 |
| TIM_CounterMode_CenterAligned3 | ((uint16_t)0x0060) | 中心对齐计数模式,匹配所有 |
配置中断
- 在初始化时基单元后,会产生一个更新事件来装入自动重装值。因此需要用
TIM_ClearFlag清除中断标志位(当使用更新中断时) - 定时器能产生多种中断,需要用
TIM_ITConfig配置
| TIM_IT | 值 | 描述 |
|---|---|---|
| TIM_IT_Update | ((uint16_t)0x0001) | 更新中断,计数器向上溢出/向下溢出,计数器初始化 |
| TIM_IT_CC1 | ((uint16_t)0x0002) | 捕获/比较中断,CH1 |
| TIM_IT_CC2 | ((uint16_t)0x0004) | 捕获/比较中断,CH2 |
| TIM_IT_CC3 | ((uint16_t)0x0008) | 捕获/比较中断,CH3 |
| TIM_IT_CC4 | ((uint16_t)0x0010) | 捕获/比较中断,CH4 |
| TIM_IT_Trigger | ((uint16_t)0x0040) | 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) |
输出比较
- OC(Output Compare)输出比较
- 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
- 每个高级定时器和通用定时器都拥有4个输出比较通道
- 高级定时器的前3个通道额外拥有死区生成和互补输出的功能


| 模式 | 描述 |
|---|---|
| 冻结 | CNT=CCR时,REF保持为原状态 |
| 匹配时置有效电平 | CNT=CCR时,REF置有效电平 |
| 匹配时置无效电平 | CNT=CCR时,REF置无效电平 |
| 匹配时电平翻转 | CNT=CCR时,REF电平翻转 |
| 强制为无效电平 | CNT与CCR无效,REF强制为无效电平 |
| 强制为有效电平 | CNT与CCR无效,REF强制为有效电平 |
| PWM模式1 | 向上计数:CNT<CCR时,REF置有效电平,CNT≥CCR时,REF置无效电平<br>向下计数:CNT>CCR时,REF置无效电平,CNT≤CCR时,REF置有效电平 |
| PWM模式2 | 向上计数:CNT<CCR时,REF置无效电平,CNT≥CCR时,REF置有效电平<br>向下计数:CNT>CCR时,REF置有效电平,CNT≤CCR时,REF置无效电平 |
以PWM模式1向上计数为例:

- PWM频率:
- PWM占空比:
- PWM分辨率:
代码
|
|
TIM_OCInitTypeDef为输出比较配置结构体
TIM_OCStructInit函数为结构体赋默认值(特别)TIM_SetComparex函数能设置CCRx寄存器值TIM_SetAutoreload函数能设置ARR寄存器值TIM_PrescalerConfig函数能设置PSC寄存器值:
TIM_PSCReloadMode_Immediate立即生效TIM_PSCReloadMode_Update更新事件后生效
TIM_OCxInit函数能配置OCx通道TIM_OCMode为输出比较模式TIM_OCPolarity为输出极性:TIM_OCPolarity_High正常,TIM_OCPolarity_Low翻转TIM_OutputState为输出使能:TIM_OutputState_Enable开启,TIM_OutputState_Disable关闭TIM_Pulse为CCR初始值
| TIM_OCMode | 值 | 描述 |
|---|---|---|
| TIM_OCMode_Timing | ((uint16_t)0x0000) | 冻结 |
| TIM_OCMode_Active | ((uint16_t)0x0010) | 匹配时置有效电平 |
| TIM_OCMode_Inactive | ((uint16_t)0x0020) | 匹配时置无效电平 |
| TIM_OCMode_Toggle | ((uint16_t)0x0030) | 匹配时电平翻转 |
| TIM_OCMode_PWM1 | ((uint16_t)0x0060) | PWM模式1 |
| TIM_OCMode_PWM2 | ((uint16_t)0x0070) | PWM模式2 |
输入捕获
- IC(Input Capture)输入捕获
- 输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参
- 每个高级定时器和通用定时器都拥有4个输入捕获通道
- 可配置为PWMI模式,同时测量频率和占空比
- 可配合主从触发模式,实现硬件全自动测量

频率测量

-
测频法:在闸门时间T内,对上升沿计次,得到N,则频率
$$ f_x = \frac{N}{T} $$ -
测周法:两个上升沿内,以标准频率fc计次,得到N ,则频率
$$ f_x = \frac{f_c}{N} $$ -
中界频率:测频法与测周法误差相等的频率点
$$ f_m = \sqrt\frac{f_c}{T} $$
PWMI(测周法)

代码
|
|
TIM_ICInitTypeDef为输入捕获配置结构体
TIM_Channel为输入通道:TIM_Channel_x(x=1,2,3,4)TIM_ICFilter为输入滤波器:0x0-0xFTIM_ICPolarity为输入极性选择TIM_ICPrescaler为预分频配置TIM_ICSelection为信号交叉选择TIM_PWMIConfig函数会对另一通道进行相应配置,TIM_ICInit函数只会配置当前通道TIM_GetCapturex函数会获取CCRx寄存器的值
计算占空比时,对CCR1和CCR2的值+1的的操作可以避免除0,实际值应为
$$ val_1=CCR1+0.5\quad(\pm0.5) $$$$ val_2=CCR2+0.5\quad(\pm0.5) $$$$ Freq=\frac{CK_{PSC}}{(PSC+1)*val_1} $$$$ Duty=100\%*\frac{val_2}{val_1} $$主从触发

从模式
|
|
TIM_SelectInputTrigger函数用于配置从模式触发源TIM_SelectSlaveMode函数用于配置从模式
| TIM_InputTriggerSource | 值 | 描述 |
|---|---|---|
| TIM_TS_ITR0 | ((uint16_t)0x0000) | Internal Trigger 0 |
| TIM_TS_ITR1 | ((uint16_t)0x0010) | Internal Trigger 1 |
| TIM_TS_ITR2 | ((uint16_t)0x0020) | Internal Trigger 2 |
| TIM_TS_ITR3 | ((uint16_t)0x0030) | Internal Trigger 3 |
| TIM_TS_TI1F_ED | ((uint16_t)0x0040) | TI1 Edge Detector |
| TIM_TS_TI1FP1 | ((uint16_t)0x0050) | Filtered Timer Input 1 |
| TIM_TS_TI2FP2 | ((uint16_t)0x0060) | Filtered Timer Input 2 |
| TIM_TS_ETRF | ((uint16_t)0x0070) | External Trigger input |
| TIM_SlaveMode | 值 | 描述 |
|---|---|---|
| TIM_SlaveMode_Reset | ((uint16_t)0x0004) | Rising edge of the selected trigger signal (TRGI) re-initializes<br> the counter and triggers an update of the registers. |
| TIM_SlaveMode_Gated | ((uint16_t)0x0005) | The counter clock is enabled when the trigger signal (TRGI) is high. |
| TIM_SlaveMode_Trigger | ((uint16_t)0x0006) | The counter starts at a rising edge of the trigger TRGI. |
| TIM_SlaveMode_External1 | ((uint16_t)0x0007) | Rising edges of the selected trigger (TRGI) clock the counter. |


主模式
|
|
TIM_SelectMasterSlaveMode函数用于使能主模式:TIM_MasterSlaveMode_Enable开启TIM_MasterSlaveMode_Disable关闭
TIM_SelectOutputTrigger函数用于配置触发源
| TIM_TRGOSource | 值 | 描述 |
|---|---|---|
| TIM_TRGOSource_Reset | ((uint16_t)0x0000) | The UG bit in the TIM_EGR register is used as the trigger output (TRGO). |
| TIM_TRGOSource_Enable | ((uint16_t)0x0010) | The Counter Enable CEN is used as the trigger output (TRGO). |
| TIM_TRGOSource_Update | ((uint16_t)0x0020) | The update event is selected as the trigger output (TRGO). |
| TIM_TRGOSource_OC1 | ((uint16_t)0x0030) | The trigger output sends a positive pulse when the CC1IF flag is to be set, as soon as a capture or compare match occurs (TRGO). |
| TIM_TRGOSource_OC1Ref | ((uint16_t)0x0040) | OC1REF signal is used as the trigger output (TRGO). |
| TIM_TRGOSource_OC2Ref | ((uint16_t)0x0050) | OC2REF signal is used as the trigger output (TRGO). |
| TIM_TRGOSource_OC3Ref | ((uint16_t)0x0060) | OC3REF signal is used as the trigger output (TRGO). |
| TIM_TRGOSource_OC4Ref | ((uint16_t)0x0070) | OC4REF signal is used as the trigger output (TRGO). |
编码器接口
- Encoder Interface 编码器接口
- 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度
- 每个高级定时器和通用定时器都拥有1个编码器接口
- 两个输入引脚借用了输入捕获的通道1和通道2




代码
|
|
TIM_EncoderInterfaceConfig为编码器配置函数TIM_ICxPolarity参数与通道配置重复TIM_ICPolarity_Rising代表不反相,TIM_ICPolarity_Falling表示反相
| TIM_EncoderMode | 值 | 描述 |
|---|---|---|
| TIM_EncoderMode_TI1 | ((uint16_t)0x0001) | Counter counts on TI1FP1 edge depending on TI2FP2 level. |
| TIM_EncoderMode_TI2 | ((uint16_t)0x0002) | Counter counts on TI2FP2 edge depending on TI1FP1 level. |
| TIM_EncoderMode_TI12 | ((uint16_t)0x0003) | Counter counts on both TI1FP1 and TI2FP2 edges depending on the level of the other input. |