初始化PWM
第一步,RCC开启时钟,把我们要用的TIM外设和GPIO外设的时钟打开
第二步,配置时基单元,包括这前面的时钟源选择,和这里的时基单元,都配置好
第三步,配置输出比较单元,里面包括这个CCR的值、输出比较模式、极性选择、输出使能这些参数,在库函数里也是用库函数来统一配置的
第四步,配置GPIO,把PWM对应的GPIO口,初始化为复用推挽输出的配置,这个PWM和GPIO的对应关系是怎么样的呢?看一下引脚定义表
第五步,就是运行控制了,启动计数器,这样就能输出PWM了
TIM剩下的库函数:
下面四个函数就是用来配置输出比较模块的,OC就是Output Compare,输出比较,因为输出比较单元有4个所以有4个函数
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);//第二个结构体就是输出比较的那些参数了void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);//给上面说的那个输出比较结构体赋一个默认值的void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);//再补充说明一下这个函数,仅高级定时器使用,在使用高级定时器输出PWM时,需要调用这个函数,使能主输出,否则PWM将不能正常输出下面四个函数是用来配置强制输出模式的,如果你在运行中想要暂停输出波形并且强制输出高或低电平,一般用的不多,因为强制输出高电平和设置100%占空比是一样的,强制输出低电平和设置0%占空比也是一样的
void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);这四个函数是用来配置CCR寄存器的预装功能的,这个预装功能,就是影子寄存器,之前也介绍过,你写入的值不会立刻生效,而是在更新事件才会生效,这个一般可以不用,了解一下即可,不需要掌握
void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);这四个函数是用来配置快速使能的,这个功能手册里,单脉冲模式,那一节有一小段介绍,用的不多,不需要掌握
void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);
void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);这个功能在手册里,外部事件时清除REF信号,那一节有介绍,这个也不需要掌握
void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);这些就是用来单独设置输出比较的极性的,这里带个N的就是高级定时器里互补通道的配置,那这里有函数可以设置极性,在结构体初始化的那个函数里也可以设置极性,这两个地方设置极性的作用是一样的,只不过是用结构体是一起初始化的,这里是一个单独的函数进行修改的,一般来说结构体里的参数,都会有一个单独的函数可以进行更改
void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
OC4没有互补通道,所以就没有OC4N的函数用来单独修改输出使能参数的
void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);
void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);选择输出比较模式,这个是用来单独更改输出比较模式的函数
void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);这四个是用来单独更改CCR寄存器值的函数,这四个函数比较重要,我们在运行的时候,更改占空比,就需要用到这四个函数
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);
8.50