一些库函数的用法手册上讲得不甚详细,网上也几乎没有资料,把我个人理解的一些东西和大家分享一下,如有错漏请批评指正。
TIM_DeInit(TIM2);
//注意:按缺省值复位后,时钟源为内部时钟,不必再调用函数设置。如需要更改定时器计时的时钟源,
//调用后面的那几个相关函数就行。定时器的时钟不是直接来自APB1/2,而是来自于输入为APB1/2的一个倍频器。
//当APB1/2的预分频系数为1时,定时器的时钟频率等于APB1/2的频率;
//当APB1/2的预分频系数为其它数值时,定时器的时钟频率等于APB1/2的频率两倍。
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 10000-1;
//设置在下一个更新事件装入活动的自动重装载寄存器周期的值
//由于计数从0开始,所以此处应为理想周期减1,最大值为0xFFFF
TIM_TimeBaseStructure.TIM_Prescaler = 0xF;
//设置用来作为TIMx时钟频率除数的预分频值,最大值为0xFFFF
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//设置定时器输入频率fCK_INT与数字滤波器采样频率基准fDTS使用的采样频率之间的分频比例
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//中央对齐模式1 计数器交替地向上和向下计数。输出比较中断标志位,只在计数器向下计数时被设置
//中央对齐模式2 计数器交替地向上和向下计数。输出比较中断标志位,只在计数器向上计数时被设置
//中央对齐模式3 计数器交替地向上和向下计数。输出比较中断标志位,只在计数器向下和向上计数时均被设置
TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//设置输出模式
//TIM_OCMode_Timing: 比较成功后不在对应输出管脚上产生输出(输出引脚冻结,可另作他用),但产生中断,用来作软件定时器用。
//TIM_OCMode_Toggle: 比较成功后翻转对应输出管脚上的电平。
//TIM_OCMode_Active: 输出比较主动模式,匹配时设置输出引脚为有效电平,当计数值为比较/捕获寄存器值相同时,强制输出为高电平
//TIM_OCMode_Inactive:输出比较非主动模式,匹配时设置输出引脚为无效电平,当计数值为比较/捕获寄存器值相同时,强制输出为低电平
//TIM_OCMode_PWM1: 当计时器值小于比较器设定值时则TIMX输出脚此时输出有效高电位。
// 当计时器值大于或等于比较器设定值时则TIMX输出脚此时输出低电位。
//TIM_OCMode_PWM2时: 与TIM_OCMode_PWM1相反
TIM_OCInitStructure.TIM_Pulse=0xFFFF;//设置输出脉宽,最大只能取0xFFFF
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//使能输出
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//设置输出极性
// TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;
// //指定TIM互补输出引脚的在比较有效时的输出电平。仅供高级定时器有效。
// TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
// //使能或使能TIM的互补输出。仅供高级定时器有效
// TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;
// TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
// //指定在空闲状态下的TIM输出比较引脚的状态。仅供高级定时器有效。
TIM_OC1Init(TIM2, & TIM_OCInitStructure);//使用哪个通道,就把前面的OCxInit改成几
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//选择通道。
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//选择输入捕获的边沿
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
// TIM_ICSelection_DirectTI TIM输入1,2,3或4与IC1或IC2或IC3或IC4相连
// TIM_ICSelection_IndirectTI TIM输入1,2,3或4与IC2或IC1或IC4或IC3相连
// TIM_ICSelection_TRC TIM输入1,2,3或4与TRC(内部触发)相连。
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//设置输入捕获预分频器
TIM_ICInitStructure.TIM_ICFilter = 0x0;
//选择输入比较滤波器。该参数取值在0x0和0xF
//不同的取值代表着不同的采样频率和带宽,详见手册336页表
//实际采样频率fSAMPLING不一定等于采样频率基准fDTS
TIM_ICInit(TIM2, &TIM_ICInitStructure);
//TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);
//新版函数库里取消了TIM_ICMode,TIM_ICInit()默认为输入捕获模式ICAP
//如果使用PWM输入模式,要用TIM_PWMIConfig()来初始化
TIM_Cmd(TIM2, ENABLE);
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE );
//TIM_IT_Update: 更新事件:计数器上溢/下溢,计数器初始化(由软件或内部/外部触发)
//TIM_IT_CC1: 通道1输入捕获/输出比较
//TIM_IT_CC2: 通道2输入捕获/输出比较
//TIM_IT_CC3: 通道3输入捕获/输出比较
//TIM_IT_CC4: 通道4输入捕获/输出比较
//TIM_IT_COM: TIM Commutation Interrupt source
//TIM_IT_Trigger: 触发事件:计数器开始、停止、初始化或由内部/外部触发计数
//TIM_IT_Break: 打断输入
TIM_InternalClockConfig(TIM2);
//禁止从模式,用内部时钟直接驱动定时器的预分频器
TIM_ITRxExternalClockConfig(TIM2, TIM_TS_ITR3);
//设置定时器工作于从模式,时钟源为其他定时器的输出分频.此时钟源无滤波
//TIM_TS_ITR0 TIM内部触发0 TIM1
//TIM_TS_ITR1 TIM内部触发1 TIM2
//TIM_TS_ITR2 TIM内部触发2 TIM3
//TIM_TS_ITR3 TIM内部触发3 TIM4
TIM_TIxExternalClockConfig(TIM2, TIM_TS_TI1FP1,TIM_ICPolarity_Rising, 0);
//设置 TIMx 触发为外部时钟(从四个通道引脚引入)
//触发源选择:
//TIM_TIxExternalCLK1Source_TI1ED: 未经滤波的Timer Input 1
//TIM_TIxExternalCLK1Source_TI1: 滤波后的Timer Input 1
//TIM_TIxExternalCLK1Source_TI2: 滤波后Timer Input 2
//设置输入捕获的边沿:
//TIM_ICPolarity_Rising
//TIM_ICPolarity_Falling
//设置滤波设置:
//必须在0x0与0xF之间
TIM_ETRClockMode1Config(TIM2, TIM_ExtTRGPSC_DIV2,TIM_ExtTRGPolarity_NonInverted, 0x0);
//外部时钟模式1.需要设置预分频,以及外部触发极性:
//TIM_ExtTRGPolarity_Inverted TIM外部触发极性翻转: 低电平或下降沿有效
//TIM_ExtTRGPolarity_NonInverted TIM外部触发极性非翻转:高电平或上升沿有效
//最后要设置滤波环节。
TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_DIV2,TIM_ExtTRGPolarity_NonInverted, 0x0);
//外部时钟模式2.
//通用定时器的计数时钟有三种:
//内部时钟(CK_INT)
//外部时钟源,包括:
//外部时钟模式1 外部输入脚(TIx)
//外部时钟模式2 外部触发输入(ETR)
//内部触发输入(ITRx) 这三种
//ETR仅用于外部触发,CHx还可以输出PWM,ETR是不可能输出PWM的。
//这个函数后面的一些函数大部分是为实现上述功能而需要调用的底层函数,不需要熟练掌握
TIM_ARRPreloadConfig(TIM2, ENABLE);
//使能预装载寄存器后其与影子寄存器间将不再是立即写入的关系,而是等更新事件产生后才写入
//输入捕获和输出比较相关的预装载寄存器同理
TIM_OC1FastConfig(TIM2, TIM_OCFast_Enable);
//输出比较快速特征性能用在缩短单脉冲输出模式时的最小输出延迟
//失能时,由于从激励进入到打开计数器需要时间,因此最小延迟为5个时钟周期
//使能后,一旦有激励进入,将立即输出活动电平,而不管比较结果如何。延迟被缩短为3个时钟周期
//必须将通道配置为PWM模式此设置才有作用