有些场合我们需要生成指定个数的PWM,实现方法有很多,这里我介绍一个通过高级定时器的单脉冲模式+重复计数实现指定个数PWM输出,生成完成后会自动停止。
实现程序如下:
/**
* 说明 : 产生指定个数脉冲
* 参数 : 无
* 返回 : 无
*/
void Pulse_Timer_Init(void)
{
LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_TIM1);
/** PWM_OUT->PA11->TIM1_CH4 */
GPIO_InitStruct.Pin=LL_GPIO_PIN_11;
GPIO_InitStruct.Mode=LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed=LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Pull=LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate=LL_GPIO_AF_1;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/** 定时器时基配置(Fpwm=80M/40/10=200KHz) */
LL_TIM_SetPrescaler(TIM1, 39);
LL_TIM_SetAutoReload(TIM1, 9); /*!< 200KHz */
/** 重复计数 */
LL_TIM_SetRepetitionCounter(TIM1, 7); /*!< 这里设置要输出的PWM个数 这里为7+1=8个 */
LL_TIM_SetCounterMode(TIM1, LL_TIM_COUNTERMODE_UP);
LL_TIM_EnableARRPreload(TIM1);
LL_TIM_SetClockSource(TIM1, LL_TIM_CLOCKSOURCE_INTERNAL);
/** 不使用触发 */
LL_TIM_SetTriggerOutput(TIM1, LL_TIM_TRGO_RESET);
/** 失能从模式 */
LL_TIM_DisableMasterSlaveMode(TIM1);
/** 使能单脉冲模式 */
LL_TIM_SetOnePulseMode(TIM1, LL_TIM_ONEPULSEMODE_SINGLE);
/** 输出模式配置:CH4 */
TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
TIM_OC_InitStruct.CompareValue = 5; /*!< 50%占空比 */
TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_LOW;
LL_TIM_OC_Init(TIM1, LL_TIM_CHANNEL_CH4, &TIM_OC_InitStruct);
LL_TIM_OC_EnablePreload(TIM1, LL_TIM_CHANNEL_CH4);
LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH4);
/** 用高级定时器输出PWM时需要调用这个函数 */
LL_TIM_EnableAllOutputs(TIM1);
LL_TIM_GenerateEvent_UPDATE(TIM1); /*!< 记得调用这个函数 */
/** 使能定时器 */
LL_TIM_EnableCounter(TIM1);
}
测试结果如下: