根据实际需要,要求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的输出。
根据实际需要,要求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的输出。
举报