当前有个项目用到输出特定时间有效电平的功能,最先想到的是定时器的单脉冲模式。但查看用户手册,单脉冲模式只能使用定时器的通道1和通道2,且其中一个通道作为触发输入,另一个通道作为比较输出,与想象中的并不一样,因此只能另想办法。
可以通过使用PWM输出的中断模式,在触发输出比较的中断回调函数HAL_TIM_PWM_PulseFinishedCallback中停止PWM输出。下面以定时器2通道1为例:
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim)
{
/* Prevent unused argument(s) compilation warning */
if(htim->Instance==TIM2)
{
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
HAL_TIM_PWM_Stop_IT(htim, TIM_CHANNEL_1);
motor1_stop = 0;
}
}
}
测试过程中,每次设置的PWM输出的时间都是上次设置的时间,通过查看用户手册,定时器每个通道的输出比较寄存器TIMx_CCRx可以预装载。虽然默认不使能预装载,查看HAL库源代码发现,调用HAL_TIM_PWM_ConfigChannel时,会使能预装载。因此需要再调用HAL_TIM_PWM_ConfigChannel之后,需要调用__HAL_TIM_DISABLE_OCxPRELOAD(&htim2, TIM_CHANNEL_1);失能预装载。