TIMER

image.png
image.png
CK_PSC=MCU主频
使用:

  1. 基本定时
  2. 输出比较
  3. 输入捕获:

当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数

  1. 编码器接口

image.png
一. 定时中断

image.png

// 将TIM定时器外设复位到它的默认参数状态  
void TIM_DeInit(TIM_TypeDef* TIMx);  
  
// 初始化TIM定时器的基本定时器参数  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_TimeBaseInitStruct: 指向TIM_TimeBaseInitTypeDef结构体的指针,包含定时器基本配置参数  
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);  
  
// 初始化TIM定时器的输出比较通道1  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_OCInitStruct: 指向TIM_OCInitTypeDef结构体的指针,包含输出比较通道配置参数  
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);  
  
// 初始化TIM定时器的输出比较通道2  
// 同TIM_OC1Init,但是针对通道2  
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);  
  
// 初始化TIM定时器的输出比较通道3  
// 同TIM_OC1Init,但是针对通道3  
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);  
  
// 初始化TIM定时器的输出比较通道4(如果支持)  
// 同TIM_OC1Init,但是针对通道4  
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);  
  
// 初始化TIM定时器的输入捕获通道  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_ICInitStruct: 指向TIM_ICInitTypeDef结构体的指针,包含输入捕获通道配置参数  
void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);  
  
// 配置TIM定时器用于PWM输入模式  
// 注意:这个函数名(TIM_PWMIConfig)可能有些误导,因为它实际上是配置输入捕获通道用于PWM信号检测  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_ICInitStruct: 指向TIM_ICInitTypeDef结构体的指针,包含PWM输入配置参数  
void TIM_PWMIConfig(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);  
  
// 配置TIM定时器的死区时间、刹车功能和自动重加载寄存器的更新等  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_BDTRInitStruct: 指向TIM_BDTRInitTypeDef结构体的指针,包含BDTR(Break and Dead-Time)配置参数  
void TIM_BDTRConfig(TIM_TypeDef* TIMx, TIM_BDTRInitTypeDef *TIM_BDTRInitStruct);  
  
// 将TIM_TimeBaseInitTypeDef结构体中的参数重置为它们的默认值  
// TIM_TimeBaseInitStruct: 指向TIM_TimeBaseInitTypeDef结构体的指针  
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);  
  
// 将TIM_OCInitTypeDef结构体中的参数重置为它们的默认值  
// TIM_OCInitStruct: 指向TIM_OCInitTypeDef结构体的指针  
void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);  
  
// 将TIM_ICInitTypeDef结构体中的参数重置为它们的默认值  
// TIM_ICInitStruct: 指向TIM_ICInitTypeDef结构体的指针  
void TIM_ICStructInit(TIM_ICInitTypeDef* TIM_ICInitStruct);  
  
// 将TIM_BDTRInitTypeDef结构体中的参数重置为它们的默认值  
// TIM_BDTRInitStruct: 指向TIM_BDTRInitTypeDef结构体的指针  
void TIM_BDTRStructInit(TIM_BDTRInitTypeDef* TIM_BDTRInitStruct);  
  
// 启动或停止TIM定时器  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// NewState: 定时器的新状态(ENABLE或DISABLE)  
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);  
  
// 控制TIM定时器的PWM输出(启用或禁用)  
// 注意:这个函数可能用于某些特定的定时器,允许你控制PWM信号的输出  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// NewState: PWM输出的新状态(ENABLE或DISABLE)  
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);
// 使能或失能TIM定时器的中断  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_IT: 要使能或失能的中断类型(例如TIM_IT_Update、TIM_IT_CC1等)  
// NewState: 中断的新状态(ENABLE或DISABLE)  
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);  
  
// 生成TIM定时器的事件  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_EventSource: 要生成的事件类型(例如TIM_EventSource_Update、TIM_EventSource_CC1等)  
void TIM_GenerateEvent(TIM_TypeDef* TIMx, uint16_t TIM_EventSource);  
  
// 配置TIM定时器的DMA(直接内存访问)相关参数  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_DMABase: DMA传输的起始地址(通常是TIM的某个寄存器)  
// TIM_DMABurstLength: DMA传输的数据长度(字节数)  
void TIM_DMAConfig(TIM_TypeDef* TIMx, uint16_t TIM_DMABase, uint16_t TIM_DMABurstLength);  
  
// 使能或失能TIM定时器的DMA请求  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_DMASource: DMA请求的来源(例如TIM_DMA_Update、TIM_DMA_CC1等)  
// NewState: DMA请求的新状态(ENABLE或DISABLE)  
void TIM_DMACmd(TIM_TypeDef* TIMx, uint16_t TIM_DMASource, FunctionalState NewState);  
  
// 将TIM定时器配置为使用内部时钟  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);  
  
// 配置TIM定时器以使用来自ITR(内部触发)的外部时钟  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_InputTriggerSource: 外部时钟的输入触发源  
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);  
  
// 配置TIM定时器以使用TIx(定时器输入)的外部时钟  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_TIxExternalCLKSource: 外部时钟的TIx源  
// TIM_ICPolarity: 输入捕获的极性(TIM_ICPolarity_Rising、TIM_ICPolarity_Falling等)  
// ICFilter: 输入捕获的滤波器设置  
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,  
                                uint16_t TIM_ICPolarity, uint16_t ICFilter);  
  
// 配置TIM定时器的ETR(外部触发)时钟模式1  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_ExtTRGPrescaler: ETR的预分频器值  
// TIM_ExtTRGPolarity: ETR的极性(TIM_ExtTRGPolarity_Inverted、TIM_ExtTRGPolarity_NonInverted等)  
// ExtTRGFilter: ETR的滤波器设置  
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,  
                             uint16_t ExtTRGFilter);  
  
// 配置TIM定时器的ETR时钟模式2(仅部分TIM定时器支持)  
// 参数与TIM_ETRClockMode1Config类似  
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,   
                             uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);  
  
// 配置TIM定时器的ETR时钟(这个函数可能是TIM_ETRClockMode1Config或TIM_ETRClockMode2Config的通用版本)  
// 参数与TIM_ETRClockMode1Config类似  
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,  
                   uint16_t ExtTRGFilter);
// 配置TIM定时器的预分频器  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// Prescaler: 预分频器的值,决定了定时器时钟频率的预分频比例  
// TIM_PSCReloadMode: 预分频器值的更新模式(例如TIM_PSCReloadMode_Immediate或TIM_PSCReloadMode_Update)  
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);  
  
// 配置TIM定时器的计数器模式  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_CounterMode: 计数器模式(例如TIM_CounterMode_Up、TIM_CounterMode_Down等)  
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);  
  
// 选择TIM定时器的输入触发源  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_InputTriggerSource: 输入触发源(例如TIM_TS_ITR0、TIM_TS_TI1FP1等)  
void TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);  
  
// 配置TIM定时器用于编码器接口  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_EncoderMode: 编码器模式(例如TIM_EncoderMode_TI1、TIM_EncoderMode_TI12等)  
// TIM_IC1Polarity: 输入捕获1的极性  
// TIM_IC2Polarity: 输入捕获2的极性  
void TIM_EncoderInterfaceConfig(TIM_TypeDef* TIMx, uint16_t TIM_EncoderMode,  
                                uint16_t TIM_IC1Polarity, uint16_t TIM_IC2Polarity);  
  
// 强制TIM定时器的输出比较通道1  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_ForcedAction: 强制操作(例如TIM_ForcedAction_Active、TIM_ForcedAction_InActive)  
void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);  
  
// 强制TIM定时器的输出比较通道2  
// 参数与TIM_ForcedOC1Config类似  
void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);  
  
// 强制TIM定时器的输出比较通道3  
// 参数与TIM_ForcedOC1Config类似  
void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);  
  
// 强制TIM定时器的输出比较通道4  
// 参数与TIM_ForcedOC1Config类似  
void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);  
  
// 配置TIM定时器的自动重装载寄存器的预装载功能  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// NewState: 预装载功能的新状态(ENABLE或DISABLE)  
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);  
  
// 配置TIM定时器的互补输出功能  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// NewState: 互补输出的新状态(ENABLE或DISABLE)  
void TIM_SelectCOM(TIM_TypeDef* TIMx, FunctionalState NewState);  
  
// 使能或失能TIM定时器的捕获/比较DMA请求  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// NewState: DMA请求的新状态(ENABLE或DISABLE)  
void TIM_SelectCCDMA(TIM_TypeDef* TIMx, FunctionalState NewState);  
  
// 配置TIM定时器的捕获/比较寄存器的预装载功能  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// NewState: 捕获/比较寄存器的预装载功能的新状态(ENABLE或DISABLE)  
void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState);
// 配置TIM定时器的OC1(输出比较通道1)的预装载功能  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_OCPreload: 预装载使能控制(例如TIM_OCPreload_Enable或TIM_OCPreload_Disable)  
void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);  
  
// 配置TIM定时器的OC2(输出比较通道2)的预装载功能  
// 参数与TIM_OC1PreloadConfig类似  
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);  
  
// 配置TIM定时器的OC3(输出比较通道3)的预装载功能  
// 参数与TIM_OC1PreloadConfig类似  
void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);  
  
// 配置TIM定时器的OC4(输出比较通道4)的预装载功能  
// 参数与TIM_OC1PreloadConfig类似  
void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);  
  
// 配置TIM定时器的OCx(x为1、2、3、4)的快速模式  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_OCFast: 快速模式使能控制(例如TIM_OCFast_Enable或TIM_OCFast_Disable)  
void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);  
// 类似的函数还有TIM_OC2FastConfig, TIM_OC3FastConfig, TIM_OC4FastConfig  
  
// 清除TIM定时器的OC1(输出比较通道1)的参考信号  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_OCClear: 清除控制(通常是TIM_OCClear_Enable或TIM_OCClear_Disable,但可能是其他值)  
void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);  
  
// 清除TIM定时器的OC2(输出比较通道2)的参考信号  
// 参数与TIM_ClearOC1Ref类似  
void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);  
  
// 清除TIM定时器的OC3(输出比较通道3)的参考信号  
// 参数与TIM_ClearOC1Ref类似  
void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);  
  
// 清除TIM定时器的OC4(输出比较通道4)的参考信号  
// 参数与TIM_ClearOC1Ref类似  
void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);  
  
// 配置TIM定时器的OC1(输出比较通道1)的极性  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_OCPolarity: 通道极性(例如TIM_OCPolarity_High或TIM_OCPolarity_Low)  
void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);  
  
// 配置TIM定时器的OC1N(输出比较通道1的互补通道)的极性  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_OCNPolarity: 互补通道极性(例如TIM_OCNPolarity_High或TIM_OCNPolarity_Low)  
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);  
  
// 配置TIM定时器的OC2(输出比较通道2)的极性  
// 参数与TIM_OC1PolarityConfig类似  
void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);  
// 注意:OC3和OC4的极性配置函数可能也存在于某些型号的STM32中,但这里没有直接列出。
// 配置TIM定时器的OC2N(输出比较通道2的互补通道)的极性  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_OCNPolarity: 互补通道极性(例如TIM_OCNPolarity_High或TIM_OCNPolarity_Low)  
void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);  
  
// 配置TIM定时器的OC3(输出比较通道3)的极性  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_OCPolarity: 通道极性(例如TIM_OCPolarity_High或TIM_OCPolarity_Low)  
void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);  
  
// 配置TIM定时器的OC3N(输出比较通道3的互补通道)的极性  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_OCNPolarity: 互补通道极性(例如TIM_OCNPolarity_High或TIM_OCNPolarity_Low)  
void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);  
  
// 配置TIM定时器的OC4(输出比较通道4)的极性  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_OCPolarity: 通道极性(例如TIM_OCPolarity_High或TIM_OCPolarity_Low)  
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);  
  
// 控制TIM定时器的某个通道(CCx)的捕获/比较功能  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_Channel: 通道号(例如TIM_Channel_1, TIM_Channel_2等)  
// TIM_CCx: 使能或禁用该通道(例如TIM_CCx_Enable或TIM_CCx_Disable)  
void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);  
  
// 控制TIM定时器的某个互补通道(CCxN)的捕获/比较功能  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_Channel: 通道号(例如TIM_Channel_1, TIM_Channel_2等)  
// TIM_CCxN: 使能或禁用该互补通道(例如TIM_CCxN_Enable或TIM_CCxN_Disable)  
void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);  
  
// 选择TIM定时器的某个通道(CCx)的输出比较模式  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_Channel: 通道号(例如TIM_Channel_1, TIM_Channel_2等)  
// TIM_OCMode: 输出比较模式(例如TIM_OCMode_Timing, TIM_OCMode_Active等)  
void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);  
  
// 使能或禁用TIM定时器的更新中断/DMA请求  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// NewState: 使能或禁用(ENABLE或DISABLE)  
void TIM_UpdateDisableConfig(TIM_TypeDef* TIMx, FunctionalState NewState);  
  
// 选择TIM定时器的更新事件源  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_UpdateSource: 更新源(例如TIM_UpdateSource_Global, TIM_UpdateSource_Regular等)  
void TIM_UpdateRequestConfig(TIM_TypeDef* TIMx, uint16_t TIM_UpdateSource);  
  
// 使能或禁用TIM定时器的霍尔传感器接口  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// NewState: 使能或禁用(ENABLE或DISABLE)  
void TIM_SelectHallSensor(TIM_TypeDef* TIMx, FunctionalState NewState);  
// 选择TIM定时器的单脉冲模式  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_OPMode: 单脉冲模式配置(如TIM_OPMode_Single、TIM_OPMode_Repetitive等)  
void TIM_SelectOnePulseMode(TIM_TypeDef* TIMx, uint16_t TIM_OPMode);  
  
// 选择TIM定时器的输出触发源  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_TRGOSource: 触发输出源(如TIM_TRGOSource_Reset、TIM_TRGOSource_Enable、TIM_TRGOSource_Update等)  
void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource);  
  
// 选择TIM定时器的从模式  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_SlaveMode: 从模式配置(如TIM_SlaveMode_Reset、TIM_SlaveMode_Gated、TIM_SlaveMode_Trigger等)  
void TIM_SelectSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_SlaveMode);  
  
// 选择TIM定时器的主从模式  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_MasterSlaveMode: 主从模式配置(如TIM_MasterSlaveMode_Enable等)  
void TIM_SelectMasterSlaveMode(TIM_TypeDef* TIMx, uint16_t TIM_MasterSlaveMode);  
  
// 设置TIM定时器的计数器值  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// Counter: 新的计数器值  
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);  
  
// 设置TIM定时器的自动重装载值  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// Autoreload: 新的自动重装载值  
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);  
  
// 设置TIM定时器的比较寄存器1的值  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// Compare1: 新的比较值  
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);  
  
// 设置TIM定时器的比较寄存器2的值  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// Compare2: 新的比较值  
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);  
  
// 设置TIM定时器的比较寄存器3的值  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// Compare3: 新的比较值  
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);  
  
// 设置TIM定时器的比较寄存器4的值  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// Compare4: 新的比较值  
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);  
  
// 设置TIM定时器的输入捕获1的预分频值  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_ICPSC: 预分频值  
void TIM_SetIC1Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);  
  
// 设置TIM定时器的输入捕获2的预分频值  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_ICPSC: 预分频值  
void TIM_SetIC2Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);  
  
// 设置TIM定时器的输入捕获3的预分频值(请注意,不是所有TIM模块都支持输入捕获3)  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_ICPSC: 预分频值  
void TIM_SetIC3Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);
// 设置TIM定时器的输入捕获4的预分频值(请注意,不是所有TIM模块都支持输入捕获4)  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_ICPSC: 预分频值  
void TIM_SetIC4Prescaler(TIM_TypeDef* TIMx, uint16_t TIM_ICPSC);  
  
// 设置TIM定时器的时钟分频因子  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_CKD: 时钟分频因子(用于进一步降低定时器的输入时钟频率)  
void TIM_SetClockDivision(TIM_TypeDef* TIMx, uint16_t TIM_CKD);  
  
// 获取TIM定时器的捕获1寄存器的值  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// 返回值: 捕获1寄存器的值  
uint16_t TIM_GetCapture1(TIM_TypeDef* TIMx);  
  
// 获取TIM定时器的捕获2寄存器的值  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// 返回值: 捕获2寄存器的值  
uint16_t TIM_GetCapture2(TIM_TypeDef* TIMx);  
  
// 获取TIM定时器的捕获3寄存器的值(请注意,不是所有TIM模块都支持输入捕获3)  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// 返回值: 捕获3寄存器的值  
uint16_t TIM_GetCapture3(TIM_TypeDef* TIMx);  
  
// 获取TIM定时器的捕获4寄存器的值(请注意,不是所有TIM模块都支持输入捕获4)  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// 返回值: 捕获4寄存器的值  
uint16_t TIM_GetCapture4(TIM_TypeDef* TIMx);  
  
// 获取TIM定时器的当前计数器值  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// 返回值: 当前计数器值  
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);  
  
// 获取TIM定时器的预分频器的值  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// 返回值: 预分频器的值  
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);  
  
// 获取TIM定时器的指定标志位的状态  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_FLAG: 要检查的标志位  
// 返回值: 标志位的状态(SET 或 RESET)  
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);  
  
// 清除TIM定时器的指定标志位  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_FLAG: 要清除的标志位  
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);  
  
// 获取TIM定时器的中断状态  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_IT: 要检查的中断标志  
// 返回值: 中断状态(SET 或 RESET)  
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);  
  
// 清除TIM定时器的指定中断待处理位  
// TIMx: 指向TIM_TypeDef结构体的指针,代表定时器实例  
// TIM_IT: 要清除的中断标志  
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

内部时钟

  1. 开启RCC时钟
/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);			//开启TIM2的时钟
/**
  * @brief  Enables or disables the Low Speed APB (APB1) peripheral clock.
  * @param  RCC_APB1Periph: specifies the APB1 peripheral to gates its clock.
  *   This parameter can be any combination of the following values:
  *     @arg RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,
  *          RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,
  *          RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,
  *          RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, 
  *          RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2,
  *          RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP,
  *          RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC,
  *          RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14
  * @param  NewState: new state of the specified peripheral clock.
  *   This parameter can be: ENABLE or DISABLE.
  * @retval None
  */
  1. 选择时机单元的时钟源,内部时钟驱动
/*配置时钟源*/
	TIM_InternalClockConfig(TIM2);		//选择TIM2为内部时钟,若不调用此函数,TIM默认也为内部时钟
	
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);//选择内部时钟
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);//选择ITRx其他定时器时钟
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,//选择TIx捕获通道的时钟
                                uint16_t TIM_ICPolarity, uint16_t ICFilter);
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                             uint16_t ExtTRGFilter);//选择ETR通过外部时钟模式1输入的时钟
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
                             uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);//选择ETR通过外部时钟模式2输入的时钟
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                   uint16_t ExtTRGFilter);//选择ETR外部时钟
  1. 配置时机单元
/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定义结构体变量
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;		//时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;				//计数周期,即ARR的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;				//预分频器,即PSC的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;			//重复计数器,高级定时器才会用到
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);				//将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元	

#define TIM_CKD_DIV1                       ((uint16_t)0x0000)
#define TIM_CKD_DIV2                       ((uint16_t)0x0100)
#define TIM_CKD_DIV4                       ((uint16_t)0x0200)
#define TIM_CounterMode_Up                 ((uint16_t)0x0000)//向上计数
#define TIM_CounterMode_Down               ((uint16_t)0x0010)//向下计数
#define TIM_CounterMode_CenterAligned1     ((uint16_t)0x0020)//中央对齐模式1
#define TIM_CounterMode_CenterAligned2     ((uint16_t)0x0040)
#define TIM_CounterMode_CenterAligned3     ((uint16_t)0x0060)
  1. 配置输出中断控制

/*中断输出配置*/
//消除计数器从1开始的bug
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);						//清除定时器更新标志位,
																//TIM_TimeBaseInit函数末尾,手动产生了更新事件
																//若不清除此标志位,则开启中断后,会立刻进入一次中断
																//如果不介意此问题,则不清除此标志位也可
	
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);					//开启TIM2的更新中断
  1. 配置NVIC
/*NVIC中断分组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//配置NVIC为分组2
																//即抢占优先级范围:0~3,响应优先级范围:0~3
																//此分组配置在整个工程中仅需调用一次
																//若有多个中断,可以把此代码放在main函数内,while循环之前
																//若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置
	
	/*NVIC配置*/
	NVIC_InitTypeDef NVIC_InitStructure;						//定义结构体变量
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;				//选择配置NVIC的TIM2线
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC线路使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	//指定NVIC线路的抢占优先级为2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC线路的响应优先级为1
	NVIC_Init(&NVIC_InitStructure);								
NonMaskableInt_IRQn         = -14,    /*!< 2 Non Maskable Interrupt                             */
  MemoryManagement_IRQn       = -12,    /*!< 4 Cortex-M3 Memory Management Interrupt              */
  BusFault_IRQn               = -11,    /*!< 5 Cortex-M3 Bus Fault Interrupt                      */
  UsageFault_IRQn             = -10,    /*!< 6 Cortex-M3 Usage Fault Interrupt                    */
  SVCall_IRQn                 = -5,     /*!< 11 Cortex-M3 SV Call Interrupt                       */
  DebugMonitor_IRQn           = -4,     /*!< 12 Cortex-M3 Debug Monitor Interrupt                 */
  PendSV_IRQn                 = -2,     /*!< 14 Cortex-M3 Pend SV Interrupt                       */
  SysTick_IRQn                = -1,     /*!< 15 Cortex-M3 System Tick Interrupt                   */

/******  STM32 specific Interrupt Numbers *********************************************************/
  WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                            */
  PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt            */
  TAMPER_IRQn                 = 2,      /*!< Tamper Interrupt                                     */
  RTC_IRQn                    = 3,      /*!< RTC global Interrupt                                 */
  FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                               */
  RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                 */
  EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                 */
  EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                 */
  EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                 */
  EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                 */
  EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                 */
  DMA1_Channel1_IRQn          = 11,     /*!< DMA1 Channel 1 global Interrupt                      */
  DMA1_Channel2_IRQn          = 12,     /*!< DMA1 Channel 2 global Interrupt                      */
  DMA1_Channel3_IRQn          = 13,     /*!< DMA1 Channel 3 global Interrupt                      */
  DMA1_Channel4_IRQn          = 14,     /*!< DMA1 Channel 4 global Interrupt                      */
  DMA1_Channel5_IRQn          = 15,     /*!< DMA1 Channel 5 global Interrupt                      */
  DMA1_Channel6_IRQn          = 16,     /*!< DMA1 Channel 6 global Interrupt                      */
  DMA1_Channel7_IRQn          = 17,     /*!< DMA1 Channel 7 global Interrupt                      */

  ADC1_2_IRQn                 = 18,     /*!< ADC1 and ADC2 global Interrupt                       */
  USB_HP_CAN1_TX_IRQn         = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */
  USB_LP_CAN1_RX0_IRQn        = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */
  CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */
  CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */
  EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */
  TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */
  TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */
  TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */
  TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */
  TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */
  TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */
  TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                */
  I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */
  I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */
  I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                 */
  I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                 */
  SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */
  SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                */
  USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */
  USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */
  USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                              */
  EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */
  RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */
  USBWakeUp_IRQn              = 42      /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */  
  1. 运行控制
/*TIM使能*/
	TIM_Cmd(TIM2, ENABLE);			//使能TIM2,定时器开始运行
  1. 定时器中断函数
void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)		//判断是否是TIM2的更新事件触发的中断
	{
		Num ++;												//Num变量自增,用于测试定时中断
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);			//清除TIM2更新事件的中断标志位
															//中断标志位必须清除
															//否则中断将连续不断地触发,导致主程序卡死
	}
}
__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     PendSV_Handler             ; PendSV Handler
                DCD     SysTick_Handler            ; SysTick Handler

                ; External Interrupts
                DCD     WWDG_IRQHandler            ; Window Watchdog
                DCD     PVD_IRQHandler             ; PVD through EXTI Line detect
                DCD     TAMPER_IRQHandler          ; Tamper
                DCD     RTC_IRQHandler             ; RTC
                DCD     FLASH_IRQHandler           ; Flash
                DCD     RCC_IRQHandler             ; RCC
                DCD     EXTI0_IRQHandler           ; EXTI Line 0
                DCD     EXTI1_IRQHandler           ; EXTI Line 1
                DCD     EXTI2_IRQHandler           ; EXTI Line 2
                DCD     EXTI3_IRQHandler           ; EXTI Line 3
                DCD     EXTI4_IRQHandler           ; EXTI Line 4
                DCD     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1
                DCD     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2
                DCD     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3
                DCD     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4
                DCD     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5
                DCD     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6
                DCD     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7
                DCD     ADC1_2_IRQHandler          ; ADC1_2
                DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX
                DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0
                DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1
                DCD     CAN1_SCE_IRQHandler        ; CAN1 SCE
                DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5
                DCD     TIM1_BRK_IRQHandler        ; TIM1 Break
                DCD     TIM1_UP_IRQHandler         ; TIM1 Update
                DCD     TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and Commutation
                DCD     TIM1_CC_IRQHandler         ; TIM1 Capture Compare
                DCD     TIM2_IRQHandler            ; TIM2
                DCD     TIM3_IRQHandler            ; TIM3
                DCD     TIM4_IRQHandler            ; TIM4
                DCD     I2C1_EV_IRQHandler         ; I2C1 Event
                DCD     I2C1_ER_IRQHandler         ; I2C1 Error
                DCD     I2C2_EV_IRQHandler         ; I2C2 Event
                DCD     I2C2_ER_IRQHandler         ; I2C2 Error
                DCD     SPI1_IRQHandler            ; SPI1
                DCD     SPI2_IRQHandler            ; SPI2
                DCD     USART1_IRQHandler          ; USART1
                DCD     USART2_IRQHandler          ; USART2
                DCD     USART3_IRQHandler          ; USART3
                DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10
                DCD     RTCAlarm_IRQHandler        ; RTC Alarm through EXTI Line
                DCD     USBWakeUp_IRQHandler       ; USB Wakeup from suspend
__Vectors_End

外部时钟

  1. 开启RCC时钟
/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);			//开启TIM2的时钟
/**
  * @brief  Enables or disables the Low Speed APB (APB1) peripheral clock.
  * @param  RCC_APB1Periph: specifies the APB1 peripheral to gates its clock.
  *   This parameter can be any combination of the following values:
  *     @arg RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,
  *          RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,
  *          RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,
  *          RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, 
  *          RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2,
  *          RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP,
  *          RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC,
  *          RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14
  * @param  NewState: new state of the specified peripheral clock.
  *   This parameter can be: ENABLE or DISABLE.
  * @retval None
  */
  1. 选择时机单元的时钟源,内部时钟驱动

	/*外部时钟配置*/
	TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F);
																//选择外部时钟模式2,时钟从TIM_ETR引脚输入
																//注意TIM2的ETR引脚固定为PA0,无法随意更改
																//最后一个滤波器参数加到最大0x0F,可滤除时钟信号抖动
#define TIM_ExtTRGPSC_OFF                  ((uint16_t)0x0000)//不分频
#define TIM_ExtTRGPSC_DIV2                 ((uint16_t)0x1000)//2分频
#define TIM_ExtTRGPSC_DIV4                 ((uint16_t)0x2000)//4分频
#define TIM_ExtTRGPSC_DIV8                 ((uint16_t)0x3000)//8分频

#define TIM_ExtTRGPolarity_Inverted        ((uint16_t)0x8000)//不反向,高电平有效
#define TIM_ExtTRGPolarity_NonInverted     ((uint16_t)0x0000)//反向,低电平有效
  1. 配置GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟
/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);						//将PA0引脚初始化为上拉输入
  1. 配置时机单元
/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定义结构体变量
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;		//时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;				//计数周期,即ARR的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;				//预分频器,即PSC的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;			//重复计数器,高级定时器才会用到
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);				//将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元	

#define TIM_CKD_DIV1                       ((uint16_t)0x0000)
#define TIM_CKD_DIV2                       ((uint16_t)0x0100)
#define TIM_CKD_DIV4                       ((uint16_t)0x0200)
#define TIM_CounterMode_Up                 ((uint16_t)0x0000)//向上计数
#define TIM_CounterMode_Down               ((uint16_t)0x0010)//向下计数
#define TIM_CounterMode_CenterAligned1     ((uint16_t)0x0020)//中央对齐模式1
#define TIM_CounterMode_CenterAligned2     ((uint16_t)0x0040)
#define TIM_CounterMode_CenterAligned3     ((uint16_t)0x0060)
  1. 配置输出中断控制

/*中断输出配置*/
//消除计数器从1开始的bug
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);						//清除定时器更新标志位,
																//TIM_TimeBaseInit函数末尾,手动产生了更新事件
																//若不清除此标志位,则开启中断后,会立刻进入一次中断
																//如果不介意此问题,则不清除此标志位也可
	
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);					//开启TIM2的更新中断
  1. 配置NVIC
/*NVIC中断分组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//配置NVIC为分组2
																//即抢占优先级范围:0~3,响应优先级范围:0~3
																//此分组配置在整个工程中仅需调用一次
																//若有多个中断,可以把此代码放在main函数内,while循环之前
																//若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置
	
	/*NVIC配置*/
	NVIC_InitTypeDef NVIC_InitStructure;						//定义结构体变量
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;				//选择配置NVIC的TIM2线
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC线路使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	//指定NVIC线路的抢占优先级为2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC线路的响应优先级为1
	NVIC_Init(&NVIC_InitStructure);								
NonMaskableInt_IRQn         = -14,    /*!< 2 Non Maskable Interrupt                             */
  MemoryManagement_IRQn       = -12,    /*!< 4 Cortex-M3 Memory Management Interrupt              */
  BusFault_IRQn               = -11,    /*!< 5 Cortex-M3 Bus Fault Interrupt                      */
  UsageFault_IRQn             = -10,    /*!< 6 Cortex-M3 Usage Fault Interrupt                    */
  SVCall_IRQn                 = -5,     /*!< 11 Cortex-M3 SV Call Interrupt                       */
  DebugMonitor_IRQn           = -4,     /*!< 12 Cortex-M3 Debug Monitor Interrupt                 */
  PendSV_IRQn                 = -2,     /*!< 14 Cortex-M3 Pend SV Interrupt                       */
  SysTick_IRQn                = -1,     /*!< 15 Cortex-M3 System Tick Interrupt                   */

/******  STM32 specific Interrupt Numbers *********************************************************/
  WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                            */
  PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt            */
  TAMPER_IRQn                 = 2,      /*!< Tamper Interrupt                                     */
  RTC_IRQn                    = 3,      /*!< RTC global Interrupt                                 */
  FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                               */
  RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                 */
  EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                 */
  EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                 */
  EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                 */
  EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                 */
  EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                 */
  DMA1_Channel1_IRQn          = 11,     /*!< DMA1 Channel 1 global Interrupt                      */
  DMA1_Channel2_IRQn          = 12,     /*!< DMA1 Channel 2 global Interrupt                      */
  DMA1_Channel3_IRQn          = 13,     /*!< DMA1 Channel 3 global Interrupt                      */
  DMA1_Channel4_IRQn          = 14,     /*!< DMA1 Channel 4 global Interrupt                      */
  DMA1_Channel5_IRQn          = 15,     /*!< DMA1 Channel 5 global Interrupt                      */
  DMA1_Channel6_IRQn          = 16,     /*!< DMA1 Channel 6 global Interrupt                      */
  DMA1_Channel7_IRQn          = 17,     /*!< DMA1 Channel 7 global Interrupt                      */

  ADC1_2_IRQn                 = 18,     /*!< ADC1 and ADC2 global Interrupt                       */
  USB_HP_CAN1_TX_IRQn         = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */
  USB_LP_CAN1_RX0_IRQn        = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */
  CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */
  CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */
  EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */
  TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */
  TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */
  TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */
  TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */
  TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */
  TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */
  TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                */
  I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */
  I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */
  I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                 */
  I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                 */
  SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */
  SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                */
  USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */
  USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */
  USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                              */
  EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */
  RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */
  USBWakeUp_IRQn              = 42      /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */  
  1. 运行控制
/*TIM使能*/
	TIM_Cmd(TIM2, ENABLE);			//使能TIM2,定时器开始运行
  1. 定时器中断函数
void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)		//判断是否是TIM2的更新事件触发的中断
	{
		Num ++;												//Num变量自增,用于测试定时中断
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);			//清除TIM2更新事件的中断标志位
															//中断标志位必须清除
															//否则中断将连续不断地触发,导致主程序卡死
	}
}
__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     SVC_Handler                ; SVCall Handler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
                DCD     PendSV_Handler             ; PendSV Handler
                DCD     SysTick_Handler            ; SysTick Handler

                ; External Interrupts
                DCD     WWDG_IRQHandler            ; Window Watchdog
                DCD     PVD_IRQHandler             ; PVD through EXTI Line detect
                DCD     TAMPER_IRQHandler          ; Tamper
                DCD     RTC_IRQHandler             ; RTC
                DCD     FLASH_IRQHandler           ; Flash
                DCD     RCC_IRQHandler             ; RCC
                DCD     EXTI0_IRQHandler           ; EXTI Line 0
                DCD     EXTI1_IRQHandler           ; EXTI Line 1
                DCD     EXTI2_IRQHandler           ; EXTI Line 2
                DCD     EXTI3_IRQHandler           ; EXTI Line 3
                DCD     EXTI4_IRQHandler           ; EXTI Line 4
                DCD     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1
                DCD     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2
                DCD     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3
                DCD     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4
                DCD     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5
                DCD     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6
                DCD     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7
                DCD     ADC1_2_IRQHandler          ; ADC1_2
                DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX
                DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0
                DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1
                DCD     CAN1_SCE_IRQHandler        ; CAN1 SCE
                DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5
                DCD     TIM1_BRK_IRQHandler        ; TIM1 Break
                DCD     TIM1_UP_IRQHandler         ; TIM1 Update
                DCD     TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and Commutation
                DCD     TIM1_CC_IRQHandler         ; TIM1 Capture Compare
                DCD     TIM2_IRQHandler            ; TIM2
                DCD     TIM3_IRQHandler            ; TIM3
                DCD     TIM4_IRQHandler            ; TIM4
                DCD     I2C1_EV_IRQHandler         ; I2C1 Event
                DCD     I2C1_ER_IRQHandler         ; I2C1 Error
                DCD     I2C2_EV_IRQHandler         ; I2C2 Event
                DCD     I2C2_ER_IRQHandler         ; I2C2 Error
                DCD     SPI1_IRQHandler            ; SPI1
                DCD     SPI2_IRQHandler            ; SPI2
                DCD     USART1_IRQHandler          ; USART1
                DCD     USART2_IRQHandler          ; USART2
                DCD     USART3_IRQHandler          ; USART3
                DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10
                DCD     RTCAlarm_IRQHandler        ; RTC Alarm through EXTI Line
                DCD     USBWakeUp_IRQHandler       ; USB Wakeup from suspend
__Vectors_End

二. TIM输出比较
image.png

  1. RCC TIM初始化
/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);			//开启TIM2的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟
  1. GPIO初始化(想要外设控制引脚,只能选择复用推挽输出)
/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;		//GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);							//将PA0引脚初始化为复用推挽输出	
																	//受外设控制的引脚,均需要配置为复用模式		
  1. 配置时钟源

	/*配置时钟源*/
	TIM_InternalClockConfig(TIM2);		//选择TIM2为内部时钟,若不调用此函数,TIM默认也为内部时钟
  1. 配置时基单元
/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定义结构体变量
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;					//计数周期,即ARR的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;				//预分频器,即PSC的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;            //重复计数器,高级定时器才会用到
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);             //将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元
	
  1. 输出比较初始化 重点:TIM_OCStructInit TIM_OC1Init选择通道

image.png

/*输出比较初始化*/
	TIM_OCInitTypeDef TIM_OCInitStructure;							//定义结构体变量
	TIM_OCStructInit(&TIM_OCInitStructure);							//结构体初始化,若结构体没有完整赋值
																	//则最好执行此函数,给结构体所有成员都赋一个默认值
																	//避免结构体初值不确定的问题
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;				//输出比较模式,选择PWM模式1
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;		//输出极性,选择为高,若选择极性为低,则输出高低电平取反
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	//输出使能
	TIM_OCInitStructure.TIM_Pulse = 0;								//初始的CCR值
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);	//配置TIM通道
#define TIM_OCMode_Timing                  ((uint16_t)0x0000)//冻结模式
#define TIM_OCMode_Active                  ((uint16_t)0x0010)//相等时置有效电平
#define TIM_OCMode_Inactive                ((uint16_t)0x0020)//相等时置无效电平
#define TIM_OCMode_Toggle                  ((uint16_t)0x0030)//相等时电平翻转
#define TIM_OCMode_PWM1                    ((uint16_t)0x0060)//PWM模式1
#define TIM_OCMode_PWM2                    ((uint16_t)0x0070)//PWM模式2
#define TIM_OCPolarity_High                ((uint16_t)0x0000)//极性不反转,输出高电平        
#define TIM_OCPolarity_Low                 ((uint16_t)0x0002)//极性反转
  1. TIM使能
/*TIM使能*/
	TIM_Cmd(TIM2, ENABLE);			//使能TIM2,定时器开始运行

  1. CCR设置函数
/**
  * 函    数:PWM设置CCR
  * 参    数:Compare 要写入的CCR的值,范围:0~100
  * 返 回 值:无
  * 注意事项:CCR和ARR共同决定占空比,此函数仅设置CCR的值,并不直接是占空比
  *           占空比Duty = CCR / (ARR + 1)
  */
void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2, Compare);		//设置CCR1的值
}

三. 输入捕获
image.png
image.png

  1. 开启时钟
/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);			//开启TIM3的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟
	
  1. GPIO初始化
/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);			
  1. 内部时钟初始化
/*配置时钟源*/
	TIM_InternalClockConfig(TIM3);		//选择TIM3为内部时钟,若不调用此函数,TIM默认也为内部时钟
	
  1. 时基单元初始化
/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定义结构体变量
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;               //计数周期,即ARR的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;               //预分频器,即PSC的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;            //重复计数器,高级定时器才会用到
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);             //将结构体变量交给TIM_TimeBaseInit,配置TIM3的时基单元
	
  1. 输入捕获初始化,
/*输入捕获初始化*/
	TIM_ICInitTypeDef TIM_ICInitStructure;							//定义结构体变量
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;				//选择配置定时器通道1
	TIM_ICInitStructure.TIM_ICFilter = 0xF;							//输入滤波器参数,可以过滤信号抖动,减少毛刺和噪声
	TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;		//极性,选择为上升沿触发捕获
	TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;			//捕获预分频,选择不分频,每次信号都触发捕获,二分频表示每两个信号触发一次
	TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;	//输入信号交叉,选择直通,不交叉
	TIM_ICInit(TIM3, &TIM_ICInitStructure);							//将结构体变量交给TIM_ICInit,配置TIM3的输入捕获通道
	

image.png

#define TIM_Channel_1                      ((uint16_t)0x0000)
#define TIM_Channel_2                      ((uint16_t)0x0004)
#define TIM_Channel_3                      ((uint16_t)0x0008)
#define TIM_Channel_4                      ((uint16_t)0x000C)

#define  TIM_ICPolarity_Rising             ((uint16_t)0x0000)
#define  TIM_ICPolarity_Falling            ((uint16_t)0x0002)
#define  TIM_ICPolarity_BothEdge           ((uint16_t)0x000A)
#define TIM_ICPSC_DIV1                     ((uint16_t)0x0000) /*!< Capture performed each time an edge is detected on the capture input. */
#define TIM_ICPSC_DIV2                     ((uint16_t)0x0004) /*!< Capture performed once every 2 events. */
#define TIM_ICPSC_DIV4                     ((uint16_t)0x0008) /*!< Capture performed once every 4 events. */
#define TIM_ICPSC_DIV8                     ((uint16_t)0x000C) /*!< Capture performed once every 8 events. */

#define TIM_ICSelection_DirectTI           ((uint16_t)0x0001) /*!< TIM Input 1, 2, 3 or 4 is selected to be 
                                                                   connected to IC1, IC2, IC3 or IC4, respectively */
#define TIM_ICSelection_IndirectTI         ((uint16_t)0x0002) /*!< TIM Input 1, 2, 3 or 4 is selected to be
                                                                   connected to IC2, IC1, IC4 or IC3, respectively. */
#define TIM_ICSelection_TRC                ((uint16_t)0x0003) /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC. */
  1. 选择触发源及从模式
/*选择触发源及从模式*/
	TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);					//触发源选择TI1FP1
	TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);					//从模式选择复位
																	//即TI1产生上升沿时,会触发CNT归零
#define TIM_TS_ITR0                        ((uint16_t)0x0000)
#define TIM_TS_ITR1                        ((uint16_t)0x0010)
#define TIM_TS_ITR2                        ((uint16_t)0x0020)
#define TIM_TS_ITR3                        ((uint16_t)0x0030)
#define TIM_TS_TI1F_ED                     ((uint16_t)0x0040)
#define TIM_TS_TI1FP1                      ((uint16_t)0x0050)
#define TIM_TS_TI2FP2                      ((uint16_t)0x0060)
#define TIM_TS_ETRF                        ((uint16_t)0x0070)

image.png
000:复位 – TIMx_EGR寄存器的UG位被用于作为触发输出(TRGO)。如果是触发输入产生的 复位(从模式控制器处于复位模式),则TRGO上的信号相对实际的复位会有一个延迟。
001:使能 – 计数器使能信号CNT_EN被用于作为触发输出(TRGO)。有时需要在同一时间启动 多个定时器或控制在一段时间内使能从定时器。计数器使能信号是通过CEN控制位和门控模式 下的触发输入信号的逻辑或产生。 当计数器使能信号受控于触发输入时,TRGO上会有一个延迟,除非选择了主/从模式(见 TIMx_SMCR寄存器中MSM位的描述)。
010:更新 – 更新事件被选为触发输入(TRGO)。例如,一个主定时器的时钟可以被用作一个从 定时器的预分频器。
011:比较脉冲 – 在发生一次捕获或一次比较成功时,当要设置CC1IF标志时(即使它已经为 高),触发输出送出一个正脉冲(TRGO)。
100:比较 – OC1REF信号被用于作为触发输出(TRGO)。
101:比较 – OC2REF信号被用于作为触发输出(TRGO)。
110:比较 – OC3REF信号被用于作为触发输出(TRGO)。
111:比较 – OC4REF信号被用于作为触发输出(TRGO)
image.png
000:关闭从模式 – 如果CEN=1,则预分频器直接由内部时钟驱动。
001:编码器模式1 – 根据TI1FP1的电平,计数器在TI2FP2的边沿向上/下计数。
010:编码器模式2 – 根据TI2FP2的电平,计数器在TI1FP1的边沿向上/下计数。
011:编码器模式3 – 根据另一个信号的输入电平,计数器在TI1FP1和TI2FP2的边沿向上/下计 数。
100:复位模式 – 选中的触发输入(TRGI)的上升沿重新初始化计数器,并且产生一个更新寄存 器的信号。
101:门控模式 – 当触发输入(TRGI)为高时,计数器的时钟开启。一旦触发输入变为低,则计 数器停止(但不复位)。计数器的启动和停止都是受控的。
110:触发模式 – 计数器在触发输入TRGI的上升沿启动(但不复位),只有计数器的启动是受控 的。
111:外部时钟模式1 – 选中的触发输入(TRGI)的上升沿驱动计数器。 注:如果TI1F_EN被选为触发输入(TS=100)时,不要使用门控模式。这是因为,TI1F_ED在每 次TI1F变化时输出一个脉冲,然而门控模式是要检查触发输入的电平
image.png
000:内部触发0(ITR0),TIM1
100:TI1的边沿检测器(TI1F_ED)
001:内部触发1(ITR1),TIM2
101:滤波后的定时器输入1(TI1FP1)
010:内部触发2(ITR2),TIM3
110:滤波后的定时器输入2(TI2FP2)
011:内部触发3(ITR3),TIM4
111:外部触发输入(ETRF)

#define TIM_SlaveMode_Reset                ((uint16_t)0x0004)
#define TIM_SlaveMode_Gated                ((uint16_t)0x0005)
#define TIM_SlaveMode_Trigger              ((uint16_t)0x0006)
#define TIM_SlaveMode_External1            ((uint16_t)0x0007)
  1. TIM使能
TIM_Cmd(TIM3, ENABLE);			//使能TIM3,定时器开始运行
  1. 获取输入捕获的频率
/**
  * 函    数:获取输入捕获的频率
  * 参    数:无
  * 返 回 值:捕获得到的频率
  */
uint32_t IC_GetFreq(void)
{
	return 1000000 / (TIM_GetCapture1(TIM3) + 1);		//测周法得到频率fx = fc / N,这里不执行+1的操作也可
}

  1. PWM设置PSC
/**
  * 函    数:PWM设置PSC
  * 参    数:Prescaler 要写入的PSC的值,范围:0~65535
  * 返 回 值:无
  * 注意事项:PSC和ARR共同决定频率,此函数仅设置PSC的值,并不直接是频率
  *           频率Freq = CK_PSC / (PSC + 1) / (ARR + 1)
  */
void PWM_SetPrescaler(uint16_t Prescaler)
{
	TIM_PrescalerConfig(TIM2, Prescaler, TIM_PSCReloadMode_Immediate);		//设置PSC的值
}

四.PWMI模式测频率占空比

  1. 开启时钟
/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);			//开启TIM3的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟
	
  1. GPIO初始化
/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);			
  1. 配置时钟源
/*配置时钟源*/
	TIM_InternalClockConfig(TIM3);		//选择TIM3为内部时钟,若不调用此函数,TIM默认也为内部时钟
	
  1. 时基单元初始化
/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定义结构体变量
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;               //计数周期,即ARR的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;               //预分频器,即PSC的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;            //重复计数器,高级定时器才会用到
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);             //将结构体变量交给TIM_TimeBaseInit,配置TIM3的时基单元
	
  1. PWMI模式初始化
/*PWMI模式初始化*/
	TIM_ICInitTypeDef TIM_ICInitStructure;							//定义结构体变量
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;				//选择配置定时器通道1
	TIM_ICInitStructure.TIM_ICFilter = 0xF;							//输入滤波器参数,可以过滤信号抖动
	TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;		//极性,选择为上升沿触发捕获
	TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;			//捕获预分频,选择不分频,每次信号都触发捕获
	TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;	//输入信号交叉,选择直通,不交叉
	TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);						//将结构体变量交给TIM_PWMIConfig,配置TIM3的输入捕获通道
																	//此函数同时会把另一个通道配置为相反的配置,实现PWMI模式
  1. 选择触发源及从模式
/*选择触发源及从模式*/
	TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);					//触发源选择TI1FP1
	TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);					//从模式选择复位
																	//即TI1产生上升沿时,会触发CNT归零
	
  1. TIM使能
/*TIM使能*/
	TIM_Cmd(TIM3, ENABLE);			//使能TIM3,定时器开始运行

  1. 获取输入捕获的频率
/**
  * 函    数:获取输入捕获的频率
  * 参    数:无
  * 返 回 值:捕获得到的频率
  */
uint32_t IC_GetFreq(void)
{
	return 1000000 / (TIM_GetCapture1(TIM3) + 1);		//测周法得到频率fx = fc / N,这里不执行+1的操作也可
}
  1. 获取输入捕获的占空比
/**
  * 函    数:获取输入捕获的占空比
  * 参    数:无
  * 返 回 值:捕获得到的占空比
  */
uint32_t IC_GetDuty(void)
{
	return (TIM_GetCapture2(TIM3) + 1) * 100 / (TIM_GetCapture1(TIM3) + 1);	//占空比Duty = CCR2 / CCR1 * 100,这里不执行+1的操作也可
}

五. 编码器接口测速
image.png

  1. 开启时钟
/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);			//开启TIM3的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟
	
  1. GPIO初始化
/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);			
  1. 编码器接口会托管时钟,编码器接口就是一个带方向控制的外部时钟,所以不需要内部时钟。
  2. 时基单元初始化
/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定义结构体变量
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;               //计数周期,即ARR的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;               //预分频器,即PSC的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;            //重复计数器,高级定时器才会用到
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);             //将结构体变量交给TIM_TimeBaseInit,配置TIM3的时基单元
	
  1. 输入捕获初始化
/*输入捕获初始化*/
	TIM_ICInitTypeDef TIM_ICInitStructure;							//定义结构体变量
	TIM_ICStructInit(&TIM_ICInitStructure);							//结构体初始化,若结构体没有完整赋值
																	//则最好执行此函数,给结构体所有成员都赋一个默认值
																	//避免结构体初值不确定的问题
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;				//选择配置定时器通道1
	TIM_ICInitStructure.TIM_ICFilter = 0xF;							//输入滤波器参数,可以过滤信号抖动
	TIM_ICInit(TIM3, &TIM_ICInitStructure);							//将结构体变量交给TIM_ICInit,配置TIM3的输入捕获通道
	TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;				//选择配置定时器通道2
	TIM_ICInitStructure.TIM_ICFilter = 0xF;							//输入滤波器参数,可以过滤信号抖动
	TIM_ICInit(TIM3, &TIM_ICInitStructure);							//将结构体变量交给TIM_ICInit,配置TIM3的输入捕获通道

  1. 编码器接口配置
/*编码器接口配置*/
	TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
																	//配置编码器模式以及两个输入通道是否反相
																	//注意此时参数的Rising和Falling已经不代表上升沿和下降沿了,而是代表是否反相
																	//此函数必须在输入捕获初始化之后进行,否则输入捕获的配置会覆盖此函数的部分配置

#define TIM_EncoderMode_TI1                ((uint16_t)0x0001)
#define TIM_EncoderMode_TI2                ((uint16_t)0x0002)
#define TIM_EncoderMode_TI12               ((uint16_t)0x0003)


#define  TIM_ICPolarity_Rising             ((uint16_t)0x0000)
#define  TIM_ICPolarity_Falling            ((uint16_t)0x0002)
#define  TIM_ICPolarity_BothEdge           ((uint16_t)0x000A)


#define  TIM_ICPolarity_Rising             ((uint16_t)0x0000)
#define  TIM_ICPolarity_Falling            ((uint16_t)0x0002)
#define  TIM_ICPolarity_BothEdge           ((uint16_t)0x000A)

  1. TIM使能
/*TIM使能*/
	TIM_Cmd(TIM3, ENABLE);			//使能TIM3,定时器开始运行

  1. 获取编码器的增量值
/**
  * 函    数:获取编码器的增量值
  * 参    数:无
  * 返 回 值:自上此调用此函数后,编码器的增量值
  */
int16_t Encoder_Get(void)
{
	/*使用Temp变量作为中继,目的是返回CNT后将其清零*/
	int16_t Temp;
	Temp = TIM_GetCounter(TIM3);
	TIM_SetCounter(TIM3, 0);
	return Temp;
}
06-07
### 关于 Timer 定时器的计时功能 Timer 定时器是一种用于在指定时间间隔后执行某些任务的工具,广泛应用于多种编程语言和操作系统中。以下是对 Timer 宮时器计时功能的详细解析: #### 1. Windows 系统中的计时器队列 在 Windows 平台下,`CreateTimerQueueTimer` 和 `ChangeTimerQueueTimer` 是两个核心函数,用于创建和更新计时器队列[^1]。通过这两个函数,可以指定一个回调函数,当设定的时间到达时,线程池中的某个线程会调用该回调函数。例如,以下代码展示了如何使用 `CreateTimerQueueTimer` 创建一个定时器: ```cpp #include <windows.h> void CALLBACK TimerCallback(PVOID lpParameter, BOOLEAN TimerOrWaitFired) { // 回调函数逻辑 printf("Timer triggered\n"); } HANDLE hTimerQueue = CreateTimerQueue(); if (hTimerQueue) { CreateTimerQueueTimer(NULL, hTimerQueue, TimerCallback, NULL, 1000, 5000, WT_EXECUTEDEFAULT); } ``` 上述代码中,定时器会在首次触发后延迟 1000 毫秒,并每隔 5000 毫秒重复触发回调函数。 #### 2. Kotlin 中的 Timer 定时器 在 Kotlin 编程语言中,`Timer` 类提供了类似的功能。通过 `schedule` 方法可以指定一个 `TimerTask` 对象,定义任务的执行逻辑。以下是一个示例: ```kotlin val timer = Timer() timer.schedule(object : TimerTask() { override fun run() { println("Task executed") } }, 8000, 100) ``` 此代码会在 8 秒后首次执行任务,并每隔 100 毫秒重复执行一次[^2]。 #### 3. .NET 平台中的 System.Threading.Timer 在 .NET 平台中,`System.Threading.Timer` 提供了灵活的计时功能。通过构造函数可以指定回调函数、初始延迟时间和周期性延迟时间。例如: ```csharp using System; using System.Threading; public class Program { public static void Main() { Timer timer = new Timer(Callback, null, 1000, 5000); } private static void Callback(object state) { Console.WriteLine("Timer triggered"); } } ``` 在此示例中,计时器会在 1 秒后首次触发,并每隔 5 秒重复触发回调函数。如果需要立即启动计时器,可以将初始延迟时间设置为 0;如果不需要周期性触发,则可以将周期性延迟时间设置为 `Timeout.Infinite`[^3]。 #### 4. 按键精灵中的计时器 按键精灵提供了一种基于脚本的计时器实现方式。通过 `Timer` 函数可以获取当前时间戳(以毫秒为单位),并结合条件判断实现循环计时功能。例如: ```vbscript Rem Start_to_Find_Picture startTime = Timer Rem 此处写你的找图代码 endTime = Timer elapsedMilliSeconds = (endTime - startTime) * 1000 If elapsedMilliSeconds < 300000 Then ' 5 minutes Goto Start_to_Find_Picture Else Goto Start_to_Collect_Image End If ``` 上述代码实现了在 5 分钟内重复执行某段代码的逻辑,超过 5 分钟则跳转到其他位置[^4]。 ### 总结 不同的平台和编程语言提供了多样化的计时器实现方式。无论是 Windows 的计时器队列、Kotlin 的 `Timer` 类、.NET 的 `System.Threading.Timer`,还是按键精灵的脚本计时器,它们的核心思想都是在指定时间间隔后执行特定任务。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值