硬汉嵌入式论坛

 找回密码
 立即注册
查看: 299|回复: 4
收起左侧

[技术讨论] F030C8T6用TIM1,PWM输出特定个脉冲数的问题,如何实现

[复制链接]

8

主题

28

回帖

57

积分

初级会员

积分
57
发表于 2025-10-27 16:33:02 | 显示全部楼层 |阅读模式
F030C8T6,CPU在47.9MHz,用TIM1,PWM频率100K,想输出10个脉冲后停止。
基本设置后,可以在PA11(TIM1-CH4)上输出100K波形。

继续启用one pulse mode,设置RepetitionCounter ,这时候PA11就没有输出了,在PB15上得到一个4us翻转的波形。

应该是哪里设置的有问题,但是实在搞不定

1.png
2.png
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_CRC_Init();
  MX_I2C1_Init();
  MX_TIM16_Init();
  MX_TIM17_Init();
  MX_USART1_UART_Init();
  MX_ADC_Init();
  MX_IWDG_Init();
  MX_TIM14_Init();
  MX_TIM1_Init();

while(1)
{
        HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
        htim1.Instance->EGR |= TIM_EGR_UG;
        while (htim1.Instance->CR1 & TIM_CR1_CEN);
        HAL_GPIO_TogglePin(PB15_GPIO_Port, PB15_Pin);
};





void MX_TIM1_Init(void)
{

  /* USER CODE BEGIN TIM1_Init 0 */

  /* USER CODE END TIM1_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

  /* USER CODE BEGIN TIM1_Init 1 */

  /* USER CODE END TIM1_Init 1 */
  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 0;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 478;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 9;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_OnePulse_Init(&htim1, TIM_OPMODE_SINGLE) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 239;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
  {
    Error_Handler();
  }
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 0;
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM1_Init 2 */

  /* USER CODE END TIM1_Init 2 */
  HAL_TIM_MspPostInit(&htim1);

}





回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119429
QQ
发表于 2025-10-27 16:42:11 | 显示全部楼层
可以考虑使用TIM UP事件触发DMA传输数据到GPIO BSRR寄存器比较方便。
回复

使用道具 举报

8

主题

28

回帖

57

积分

初级会员

积分
57
 楼主| 发表于 2025-10-30 14:19:33 | 显示全部楼层
搞出来了,其实设置没有问题,问题在HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
这个里面
  if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY)
  {
    return HAL_ERROR;
  }
HAL这破玩意,麻烦的要死,这个地方要判断是否ready,所以第一次之后就不对了

改用寄存器
      htim1.Instance->CR1 |= TIM_CR1_CEN;// 启动
      while ((htim1.Instance->CR1 & TIM_CR1_CEN) != 0)// 等结束
就可以了
回复

使用道具 举报

714

主题

3709

回帖

5876

积分

论坛元老

积分
5876
发表于 2025-10-30 16:09:53 | 显示全部楼层
regsofweb 发表于 2025-10-30 14:19
搞出来了,其实设置没有问题,问题在HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
这个里面
  if (TIM_CHA ...

牛劈呀
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119429
QQ
发表于 2025-10-31 09:31:51 | 显示全部楼层
regsofweb 发表于 2025-10-30 14:19
搞出来了,其实设置没有问题,问题在HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
这个里面
  if (TIM_CHA ...

回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-11-21 23:08 , Processed in 0.043530 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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