STM32F103ZET6 PWM输出

【STM32PWM工作过程】

STM32F103ZET6 PWM输出
STM32F103ZET6 PWM输出
PWM周期由ARR决定,CCRx决定占空比

【PWM工作过程】

STM32F103ZET6 PWM输出
CCR1:捕获比较(值)寄存器(x=1,2,3,4):设置比较值。
CCMR1: OC1M[2:0]位:
对于PWM方式下,用于设置PWM模式1【110】或者PWM模式2【111】
CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效。
CCER:CC1E位:输入/捕获1输出使能。0:关闭,1:打开。

【PWM模式1 & PWM模式2】

寄存器TIMx_CCMR1的OC1M[2:0]位来分析:
STM32F103ZET6 PWM输出

【STM32 PWM工作过程】

STM32F103ZET6 PWM输出

【STM32 PWM】

STM32F103ZET6 PWM输出
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

【自动重载的预装载寄存器】

STM32F103ZET6 PWM输出
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
简单的说,ARPE=1,ARR立即生效。。。APRE=0,ARR下个比较周期生效。

【STM32 定时器3输出通道引脚】

STM32F103ZET6 PWM输出

【PWM输出库函数】

①PWM初始化
void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
②设置比较值函数
void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Compare2);
③使能输出比较预装载
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
④使能自动重装载的预装载寄存器允许位
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

【PWM输出配置步骤】

① 使能定时器3和相关IO口时钟。
使能定时器3时钟:RCC_APB1PeriphClockCmd();
使能GPIOB时钟:RCC_APB2PeriphClockCmd();
② 初始化IO口为复用功能输出。函数:GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,
所以需要开启AFIO时钟。同时设置重映射。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
④ 初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
⑤ 初始化输出比较参数:TIM_OC2Init();
⑥ 使能预装载寄存器: TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
⑦ 使能定时器。TIM_Cmd();
⑧ 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();

【范例代码】