基于STM32F4 定时器主从模式输出固定数量PWM脉冲

        根据实际需要,要求STM32F407VE能够输出固定数量PWM脉冲,脉冲范围1024~65535,查阅相关资料选择采用两个定时器的主从功能进行实现,经示逻辑分析仪检测,在定时器时钟不是很高的情况下能够达到精确的脉冲数量。

STM32CubeMX的配置

通过STM32CubeMX配置迅速得到所需的系统配置,节省开发时间,根据需要进行移植

时钟配置

        根据实际需要进行时钟配置,我的配置如图所示
选择外部晶振

时钟具体配置

定时器配置

        这里也是很多教程资料没有说明白的地方,就是定时器主从模式谁做主,谁做从,主需要做什么,从需要做什么。
        根据实际情况应该是这样理解的,主定时器用于产生所需要的PWM,从定时器通过主从模式将主定时器产生的PWM作为其输入进行计数,当从定时器达到所设定的数值后触发从定时器的中断,在中断处理中停止主定时器的输出及从定时器的接收,从而达到输出固定数量的PWM脉冲。
        本例中采用定时器TIM2作为主定时器,TIM3作为从定时器,PA3输出PWM。根据F4参考手册选择ITR1触发。
在这里插入图片描述
        具体定时器配置如下图所示。
选择PA3作PWM输出管脚

在这里插入图片描述
        控制PWM的频率及占空比需要改变Prescaler值和Counter Period以及Pulse的值。定时器总线时钟根据之前的配置为84MHz,根据公式计算其频率及占空比。
PWM频率计算
PWM占空比计算

从定时器TIM3配置
        不要忘记打开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的输出。

  • 17
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值