

CK_PSC=MCU主频
使用:
- 基本定时
- 输出比较
- 输入捕获:
当通道输入引脚出现指定电平跳变时,当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数
- 编码器接口

一. 定时中断

// 将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);
内部时钟
- 开启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
*/
- 选择时机单元的时钟源,内部时钟驱动
/*配置时钟源*/
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外部时钟
- 配置时机单元
/*时基单元初始化*/
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开始的bug
TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除定时器更新标志位,
//TIM_TimeBaseInit函数末尾,手动产生了更新事件
//若不清除此标志位,则开启中断后,会立刻进入一次中断
//如果不介意此问题,则不清除此标志位也可
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //开启TIM2的更新中断
- 配置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 */
- 运行控制
/*TIM使能*/
TIM_Cmd(TIM2, ENABLE); //使能TIM2,定时器开始运行
- 定时器中断函数
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
外部时钟
- 开启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
*/
- 选择时机单元的时钟源,内部时钟驱动
/*外部时钟配置*/
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)//反向,低电平有效
- 配置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引脚初始化为上拉输入
- 配置时机单元
/*时基单元初始化*/
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开始的bug
TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除定时器更新标志位,
//TIM_TimeBaseInit函数末尾,手动产生了更新事件
//若不清除此标志位,则开启中断后,会立刻进入一次中断
//如果不介意此问题,则不清除此标志位也可
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //开启TIM2的更新中断
- 配置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 */
- 运行控制
/*TIM使能*/
TIM_Cmd(TIM2, ENABLE); //使能TIM2,定时器开始运行
- 定时器中断函数
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输出比较
- RCC TIM初始化
/*开启时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
- 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引脚初始化为复用推挽输出
//受外设控制的引脚,均需要配置为复用模式
- 配置时钟源
/*配置时钟源*/
TIM_InternalClockConfig(TIM2); //选择TIM2为内部时钟,若不调用此函数,TIM默认也为内部时钟
- 配置时基单元
/*时基单元初始化*/
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的时基单元
- 输出比较初始化 重点:TIM_OCStructInit TIM_OC1Init选择通道

/*输出比较初始化*/
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)//极性反转
- TIM使能
/*TIM使能*/
TIM_Cmd(TIM2, ENABLE); //使能TIM2,定时器开始运行
- 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的值
}
三. 输入捕获

- 开启时钟
/*开启时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //开启TIM3的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
- 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);
- 内部时钟初始化
/*配置时钟源*/
TIM_InternalClockConfig(TIM3); //选择TIM3为内部时钟,若不调用此函数,TIM默认也为内部时钟
- 时基单元初始化
/*时基单元初始化*/
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的时基单元
- 输入捕获初始化,
/*输入捕获初始化*/
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的输入捕获通道

#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. */
- 选择触发源及从模式
/*选择触发源及从模式*/
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)

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) 
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变化时输出一个脉冲,然而门控模式是要检查触发输入的电平 
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)
- TIM使能
TIM_Cmd(TIM3, ENABLE); //使能TIM3,定时器开始运行
- 获取输入捕获的频率
/**
* 函 数:获取输入捕获的频率
* 参 数:无
* 返 回 值:捕获得到的频率
*/
uint32_t IC_GetFreq(void)
{
return 1000000 / (TIM_GetCapture1(TIM3) + 1); //测周法得到频率fx = fc / N,这里不执行+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模式测频率占空比
- 开启时钟
/*开启时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //开启TIM3的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
- 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);
- 配置时钟源
/*配置时钟源*/
TIM_InternalClockConfig(TIM3); //选择TIM3为内部时钟,若不调用此函数,TIM默认也为内部时钟
- 时基单元初始化
/*时基单元初始化*/
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的时基单元
- 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模式
- 选择触发源及从模式
/*选择触发源及从模式*/
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); //触发源选择TI1FP1
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); //从模式选择复位
//即TI1产生上升沿时,会触发CNT归零
- TIM使能
/*TIM使能*/
TIM_Cmd(TIM3, ENABLE); //使能TIM3,定时器开始运行
- 获取输入捕获的频率
/**
* 函 数:获取输入捕获的频率
* 参 数:无
* 返 回 值:捕获得到的频率
*/
uint32_t IC_GetFreq(void)
{
return 1000000 / (TIM_GetCapture1(TIM3) + 1); //测周法得到频率fx = fc / N,这里不执行+1的操作也可
}
- 获取输入捕获的占空比
/**
* 函 数:获取输入捕获的占空比
* 参 数:无
* 返 回 值:捕获得到的占空比
*/
uint32_t IC_GetDuty(void)
{
return (TIM_GetCapture2(TIM3) + 1) * 100 / (TIM_GetCapture1(TIM3) + 1); //占空比Duty = CCR2 / CCR1 * 100,这里不执行+1的操作也可
}
五. 编码器接口测速
- 开启时钟
/*开启时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //开启TIM3的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
- 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);
- 编码器接口会托管时钟,编码器接口就是一个带方向控制的外部时钟,所以不需要内部时钟。
- 时基单元初始化
/*时基单元初始化*/
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的时基单元
- 输入捕获初始化

/*输入捕获初始化*/
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的输入捕获通道
- 编码器接口配置
/*编码器接口配置*/
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)
- TIM使能
/*TIM使能*/
TIM_Cmd(TIM3, ENABLE); //使能TIM3,定时器开始运行
- 获取编码器的增量值
/**
* 函 数:获取编码器的增量值
* 参 数:无
* 返 回 值:自上此调用此函数后,编码器的增量值
*/
int16_t Encoder_Get(void)
{
/*使用Temp变量作为中继,目的是返回CNT后将其清零*/
int16_t Temp;
Temp = TIM_GetCounter(TIM3);
TIM_SetCounter(TIM3, 0);
return Temp;
}
2631

被折叠的 条评论
为什么被折叠?



