void TIM16_PWM_Init(uint16_t period, uint16_t pulse)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_DeInit(TIM16);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16,ENABLE);
TIM_ARRPreloadConfig(TIM16, ENABLE); // ARR影子开启
TIM_OC1PreloadConfig(TIM16, TIM_OCPreload_Enable); //OC1影子开启
TIM_TimeBaseStructure.TIM_Prescaler = 48-1; //1us per count @48M clock
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseStructure.TIM_Period = period; //首个PWM预装ARR
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM16, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //比较匹配时输出高
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; //空闲时刻输出高
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_Pulse = pulse; //这里初始化装入CC值,实际这个脉冲未发现输出
TIM_OC1Init(TIM16, &TIM_OCInitStructure);
TIM_Cmd(TIM16, ENABLE);
TIM_CtrlPWMOutputs(TIM16, ENABLE);
/* 注意,发现启动TIM后会立即进入中断,在中断中载入需要输出的PWM */
TIM_ClearITPendingBit (TIM16, TIM_IT_Update);
TIM_ClearITPendingBit (TIM16, TIM_IT_CC1); //必须要清除中断标志位
TIM_ITConfig(TIM16,TIM_IT_Update|TIM_IT_CC1, ENABLE);
}
初始化传入参数:
TIM16_PWM_Init(100,10); //无论传入什么参数,这个脉冲都未发现
|