OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3809|回复: 2

【求助】STM32F407两个定时器如何同步触发产生PWM波

[复制链接]

2

主题

4

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2021-11-2
在线时间
7 小时
发表于 2021-11-11 09:30:56 | 显示全部楼层 |阅读模式
目前使用STM32F407IGT6的TIM1CH1生成2MHz的PWM波,然后想在启动TIM1的同时触发TIM2启动,同步产生0.1MHz的PWM波,根据网上的例程修改程序后,一直调试不出来,启动TIM1的时候,TIM2无法同步启动输出PWM波,不知道是程序哪里出了问题,烦请大佬们帮忙看看,感谢。程序如下:
/**
  * 函数功能: 主定时器初始化
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */
void MASTER_TIMx_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef  sMasterConfig;
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
  TIM_OC_InitTypeDef sConfigOC;

  /* 基本定时器外设时钟使能 */
  MASTER_TIM_RCC_CLK_ENABLE();

  /* 主定时器基本功能配置 */
  htimx_MasterTIM.Instance = MASTER_TIM;
  htimx_MasterTIM.Init.Prescaler = MASTER_TIM_PRESCALER;
  htimx_MasterTIM.Init.CounterMode = TIM_COUNTERMODE_UP;
  htimx_MasterTIM.Init.Period = MASTER_TIM_PERIOD;
  htimx_MasterTIM.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htimx_MasterTIM.Init.RepetitionCounter = MASTER_TIM_REPETITIONCOUNTER;
  HAL_TIM_Base_Init(&htimx_MasterTIM);

  /* 定时器时钟源选择 */
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htimx_MasterTIM, &sClockSourceConfig);

  HAL_TIM_PWM_Init(&htimx_MasterTIM);
       
  /* 主模式配置 */
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  HAL_TIMEx_MasterConfigSynchronization(&htimx_MasterTIM,&sMasterConfig);

  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 100;
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_ENABLE;
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  HAL_TIMEx_ConfigBreakDeadTime(&htimx_MasterTIM, &sBreakDeadTimeConfig);

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = MASTER_TIM_CCR;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  HAL_TIM_PWM_ConfigChannel(&htimx_MasterTIM, &sConfigOC, TIM_CHANNEL_1);
       
  /* 调用定时器GPIO引脚初始化函数 */
  HAL_MASTER_TIM_MspPostInit();
}

/**
  * 函数功能: 从定时器初始化
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */
void SLAVE_TIMx_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_SlaveConfigTypeDef  sSlaveConfig;
  TIM_OC_InitTypeDef sConfigOC;

  /* 基本定时器外设时钟使能 */
  SLAVE_TIM_RCC_CLK_ENABLE();

  /* 从定时器基本功能配置 */
  htimx_SlaveTIM.Instance = SLAVE_TIM;
  htimx_SlaveTIM.Init.Prescaler = SLAVE_TIM_PRESCALER;
  htimx_SlaveTIM.Init.CounterMode = TIM_COUNTERMODE_UP;
  htimx_SlaveTIM.Init.Period = SLAVE_TIM_PERIOD;
  htimx_SlaveTIM.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_Base_Init(&htimx_SlaveTIM);

  /* 定时器时钟源选择 */
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htimx_SlaveTIM, &sClockSourceConfig);

  HAL_TIM_PWM_Init(&htimx_SlaveTIM);
       
  /* 从模式:外部触发模式1(内部定时器触发)*/
  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER;                 // 定时器同步:触发模式
  sSlaveConfig.InputTrigger = TIM_TS_ITR0;                                   // 输入触发:选择 ITR0 作为输入源
  sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING;     // 触发极性:上升沿
  sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;    // 触发预分频:无
  sSlaveConfig.TriggerFilter = 0x0;                                                  // 滤波:本例中不需要任何滤波
  HAL_TIM_SlaveConfigSynchronization(&htimx_SlaveTIM,&sSlaveConfig);

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = SLAVE_TIM_PULSE;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  HAL_TIM_PWM_ConfigChannel(&htimx_SlaveTIM, &sConfigOC, TIM_CHANNEL_1);

  /* 调用定时器GPIO引脚初始化函数 */
  HAL_SLAVE_TIM_MspPostInit();
}


/**
  * 函数功能: 主函数.
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */
int main(void)
{
  /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
  HAL_Init();
  /* 配置系统时钟 */
  SystemClock_Config();

  /* 主从定时器初始化 */
  MASTER_TIMx_Init();
  SLAVE_TIMx_Init();

  /* 启动通道PWM输出 */
  HAL_TIM_PWM_Start(&htimx_MasterTIM, TIM_CHANNEL_1);

  /* 无限循环 */
  while (1)
  {
  }
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

465

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1734
金钱
1734
注册时间
2021-4-11
在线时间
320 小时
发表于 2021-11-11 09:50:00 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2020-7-19
在线时间
20 小时
发表于 2021-11-12 19:35:17 | 显示全部楼层
主定时器选择使能信号信号作为触发信号,从定时器选择触发模式,即触发信号启动计数器。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-15 20:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表