根据实际需要,要求STM32F407VE能够输出固定数量PWM脉冲,脉冲范围1024~65535,查阅相关资料选择采用两个定时器的主从功能进行实现,经示逻辑分析仪检测,在定时器时钟不是很高的情况下能够达到精确的脉冲数量。
STM32CubeMX的配置
通过STM32CubeMX配置迅速得到所需的系统配置,节省开发时间,根据需要进行移植
时钟配置
根据实际需要进行时钟配置,我的配置如图所示
定时器配置
这里也是很多教程资料没有说明白的地方,就是定时器主从模式谁做主,谁做从,主需要做什么,从需要做什么。
根据实际情况应该是这样理解的,主定时器用于产生所需要的PWM,从定时器通过主从模式将主定时器产生的PWM作为其输入进行计数,当从定时器达到所设定的数值后触发从定时器的中断,在中断处理中停止主定时器的输出及从定时器的接收,从而达到输出固定数量的PWM脉冲。
本例中采用定时器TIM2作为主定时器,TIM3作为从定时器,PA3输出PWM。根据F4参考手册选择ITR1触发。
具体定时器配置如下图所示。
控制PWM的频率及占空比需要改变Prescaler值和Counter Period以及Pulse的值。定时器总线时钟根据之前的配置为84MHz,根据公式计算其频率及占空比。
不要忘记打开TIM3中断
生成代码
至此完成了基本的配置,接下来生成代码
实际功能代码
Cube只是帮忙完成了最基础工程配置,还需要在生成的tim.c文件中添加以下代码来实现PWM的输出。
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim3); //TIM3中断处理函数
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim) //TIM3达到指定脉冲数回调函数
{
if(htim->Instance == TIM3)
{
if(__HAL_TIM_GET_FLAG(&htim3, TIM_FLAG_CC1) != RESET)
{
__HAL_TIM_CLEAR_FLAG(&htim3, TIM_FLAG_CC1);
HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_4);
HAL_TIM_Base_Stop_IT(&htim3);
}
}
}
void Generate_PWM(uint32_t count) //产生PWM函数
{
__HAL_TIM_SET_AUTORELOAD(&htim3, count - 1);
HAL_TIM_Base_Start_IT(&htim3);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4);
}
结语
至此,通过在主函数中调用Generate_PWM函数即可实现固定数量PWM的输出。