在STM32的输出通道中,总共设置了如下模式(其实就是设置了OCxREF的具体动作):冻结、匹配时设置通道为有效电平、匹配时设置通道为无效电平、翻转、强制为有效电平、强制为无效电平、PWM模式1和PWM模式2。
强制有效电平、强制无效电平在固件库中也有对应的设置:TIM_ForcedAction_Active和TIM_ForcedAction_InActive,对应的函数是:void TIM_ForcedOCxConfig(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction),但在之前也需要配置TIM_OCInitTypeDef结构体来使能相应的通道,并设置对应端口的极性;
PWM1和PWM2在固件库中有对应的模式设置:TIM_OCMode_PWM1(脉冲宽度调制模式1)、TIM_OCMode_PWM2(脉冲宽度调制2),其中PWM1和PWM2的区别就是他们的输出是恰好相反的,就像配置TIM1的通道1、2、3为互补输出的关系一样吧,通过调用函数void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);初始化TIM_OCInitTypeDef结构体实现配置,最后一定要记得调用函数设置BDTR的MOE位,使能输出:void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);
匹配时设置通道为有效电平和匹配时设置通道为无效电平对应固件库的宏定义是:TIM_OCMode_Active(输出比较主动模式)、TIM_OCMode_Inactive(输出比较非主动模式),配置TIM_OCInitTypeDef结构体,可是实现对应的功能,这两个模式的联系与区别和PWM1、PWM2的一样,都实现了输出信号在CNT整体计数过程中的翻转;但是这里就不需要设置BDTR的MOE位来使能输出了么,这是为什么呢?
翻转对应固件库的宏定义为:TIM_OCMode_Toggle(输出比较触发模式),也是通过配置TIM_OCInitTypeDef结构体,调用相应的初始化函数,就可以实现配置了;翻转是从有效电平到无效电平,还是从无效电平到有效电平呢?这里也不需要设置BDTR的MOE位来使能输出了么,这又是为什么呢?
最后是冻结模式,对照程序,只剩下一个TIM_OCMode_Timing
(输出比较时间模式)了,那意思冻结模式就是对应固件库的Timing模式了,网友也说这个模式下,输出管脚无变化?那什么叫做输出比较时间模式呢,是用来开启TIM_IT_CC1比较中断,从而实现相当于定时器的功能么(简单的说就是实现将定时器的定时分为两个步骤)?
对照上面的分析,还有如下两个问题:
1.对照模式定义:
按前面分析,所有输出模式都是CCRx在于CNT进行比较的吧?如果是的话,那为什么后面的PWM命名不能统一呢?
2.还是如前面分析所述,那么PWM1、PWM2、Active、Inactive以及Toggle五种模式都是实现了输出比较控制端口翻转的功能(只是翻转方式不一样而已),对吧?那为什么要搞这么多呢?不是麻烦嘛,我可以用Toggle来实现PWM,也可以用Active来实现PWM,又有什么意义呢? |