定时器PWM更新中断问题

2019-07-20 08:12发布

芯片:STM32F405RGT6
目的:输出可控个数的PWM波用于步进电机的控制
方法:利用高级定时器8的PWM的更新中断和RCR重复计数器实现。
定时器8的通道1设置为PWM模式,开启UPDATE中断,这样理论上没发一个PWM波就会产生一个更新中断;然后通过修改RCR重复计数器使芯片在发出一定个PWM波后产生更新中断,在更新中断中在做其他处理。
过程:
1、CUBE的定时器配置如图1-3
2、生成Keil5工程里,用HAL_TIM_PWM_Start_IT(&htim8,TIM_CHANNEL_1);语句以中断方式开启定时器8通道1的PWM输出。GOTO到此语句对应的HAL库函数中,发现只有CC中断的判断,没有UPDATE中断的判断。请忽略标记的语句,那是我自己添加的开启UPDATE中断的语句。
/**
  * @brief  Starts the PWM signal generation in interrupt mode.
  * @param  htim pointer to a TIM_HandleTypeDef structure that contains
  *                the configuration information for TIM module.
  * @param  Channel TIM Channel to be enabled.
  *          This parameter can be one of the following values:
  *            @arg TIM_CHANNEL_1: TIM Channel 1 selected
  *            @arg TIM_CHANNEL_2: TIM Channel 2 selected
  *            @arg TIM_CHANNEL_3: TIM Channel 3 selected
  *            @arg TIM_CHANNEL_4: TIM Channel 4 selected
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)
{
  /* Check the parameters */
  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

  switch (Channel)
  {
    case TIM_CHANNEL_1:
    {      
       //__HAL_TIM_ENABLE_IT(htim,TIM_IT_UPDATE);
                        
                        
                        
                        
      /* Enable the TIM Capture/Compare 1 interrupt */
      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1);
    }
    break;

    case TIM_CHANNEL_2:
    {
      /* Enable the TIM Capture/Compare 2 interrupt */
      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2);
    }
    break;

    case TIM_CHANNEL_3:
    {
      /* Enable the TIM Capture/Compare 3 interrupt */
      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3);
    }
    break;

    case TIM_CHANNEL_4:
    {
      /* Enable the TIM Capture/Compare 4 interrupt */
      __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC4);
    }
    break;

    default:
    break;
  }

  /* Enable the Capture compare channel */
  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);

  if(IS_TIM_ADVANCED_INSTANCE(htim->Instance) != RESET)  
  {
    /* Enable the main output */
    __HAL_TIM_MOE_ENABLE(htim);
  }

  /* Enable the Peripheral */
  __HAL_TIM_ENABLE(htim);

  /* Return function status */
  return HAL_OK;
}

这样的话系统运行的时候肯定就没有UPDATE的中断,RCR重复计数器也就没用了。就完不成我想要的输出固定个数PWM波的目的。

在HAL_TIM_PWM_Start_IT(&htim8,TIM_CHANNEL_1);库函数中没有UPDATE中断,但是在生成的stm32f4xx_it.c文件里有UPDATE中断的代码,但是运行时是进不去的。void TIM8_UP_TIM13_IRQHandler(void){
  /* USER CODE BEGIN TIM8_UP_TIM13_IRQn 0 */
        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_13);
       
        HAL_TIM_PWM_Stop_IT(&htim8,TIM_CHANNEL_1);
       
  /* USER CODE END TIM8_UP_TIM13_IRQn 0 */
  HAL_TIM_IRQHandler(&htim8);
  /* USER CODE BEGIN TIM8_UP_TIM13_IRQn 1 */

  /* USER CODE END TIM8_UP_TIM13_IRQn 1 */
}


解决方法:
在HAL库函数里HAL_TIM_PWM_Start_IT(&htim8,TIM_CHANNEL_1);自己添加HAL_TIM_ENABLE_IT(htim,TIM_IT_UPDATE);
在定时器8的更新中断里就可以完成目的了。问题:高级定时器的PWM更新中断不能通过CUBEMX配置直接产生代码框架么?为什么在HAL_TIM_PWM_Start_IT(&htim8,TIM_CHANNEL_1);里没有呢?另外,高级定时器的HAL_TIM_Base_Start_IT();的定时功能是可以通过CUBEMX配置直接产生UPDATE更新中断的代码框架,而且RCR重复计数器也可以完成相应功能。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。