HAL STM32 定时器 PWM DMA 输出配置指南

HAL STM32 定时器PWM DMA输出方式


  • 🧨遗留问题:当配置RCR重复计数器,配置为2时,在定义了3组PWM参数情况下,只能输出第二组参数的PWM波形。(HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, aCCValue_Buffer, 3));设置其它计数值,则没有问题。如果RCR重复计数器为2,DMA配置2组PWM参数也没有问题。(HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, aCCValue_Buffer, 2))。


  • 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 = 84-1;
      htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim1.Init.Period = 10000;
      htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
      htim1.Init.RepetitionCounter = 3;//配置2则只能输出一组pwm波形
      htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
      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();
      }
      sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
      sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
      if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
      {
        Error_Handler();
      }
      sConfigOC.OCMode = TIM_OCMODE_PWM1;
      sConfigOC.Pulse = 5000;
      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;
      if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != 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);
    
    }
    
    
  • 🔖重复计数设置为3,输出的3组pwm参数波形:
  • 🔖重复计数设置为1,输出的3组pwm参数波形:
  • 🔖重复计数设置为0,输出的3组pwm参数波形:
  • 📑RCR寄存器中的值会随着定时器更新事件递减,一直到0,在允许更新事件UEV发生的情况下,则TIM的更新事件UEV就会产生;如果设置RCR的值为N,那么PWM模式下,更新事件将会在弟N+1个周期发生;
  • 🛠STM32CubeMX配置

  • 🌿选择定时TIM1,时钟源选择内部时钟源,PWM通道选择
  • 🌿PWM参数配置;(Output compare preload默认使能开启)
  • 🌿DMA配置(stm32F4)

    -🔖 stm32f103
  • 📄业务代表

  • 🌿main函数
  • int main(void)
    {
    
      /* USER CODE BEGIN 1 */
    	uint32_t aCCValue_Buffer[3] = {0, 0, 0};
      /* Compute CCR1 value to generate a duty cycle at 80% */
      aCCValue_Buffer[2] = (uint32_t)(((uint32_t) 80 * (10000 - 1)) / 100); //84000 000
      /* Compute CCR1 value to generate a duty cycle at 50% */
      aCCValue_Buffer[1] = (uint32_t)(((uint32_t) 50 * (10000 - 1)) / 100);
      /* Compute CCR1 value to generate a duty cycle at 25% */
      aCCValue_Buffer[0] = (uint32_t)(((uint32_t) 25 * (10000 - 1)) / 100);
      /* USER CODE END 1 */
    
      /* MCU Configuration--------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_DMA_Init();
      MX_TIM1_Init();
      /* USER CODE BEGIN 2 */
      /*## Start PWM signal generation in DMA mode ############################*/
      if (HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, aCCValue_Buffer, 3) != HAL_OK)
      {
        /* Starting Error */
        Error_Handler();
      }
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
        /* USER CODE END WHILE */
    
        /* USER CODE BEGIN 3 */
      }
      /* USER CODE END 3 */
    }
    

    参数工程

  • 🌿stm32f103
  • 链接:https://pan.baidu.com/s/1bKWQSkmbv4WoJgH07g9Y6g?pwd=ihj3 
    提取码:ihj3
    
  • 🌿stm32f401
  • 链接:https://pan.baidu.com/s/1KtpPRzCX_xS4ZaDI-uty6w?pwd=w0qj 
    提取码:w0qj
    

    作者:perseverance52

    物联沃分享整理
    物联沃-IOTWORD物联网 » HAL STM32 定时器 PWM DMA 输出配置指南

    发表回复