No poder habilitar PWM usando la biblioteca HAL TIM en stm32f0

1

El objetivo es utilizar la función PWM de las bibliotecas stm32 HAL TIM para iluminar 4 leds en los pines 0, 1, 4 y 5

He generado el siguiente código usando CubeMX:

void MX_TIM3_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_OC_InitTypeDef sConfigOC;

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 32;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 1000;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_Base_Init(&htim3);

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig);

  HAL_TIM_PWM_Init(&htim3);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig);

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

  HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2);

  HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3);

  HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4);

  HAL_TIM_MspPostInit(&htim3);    
}

Esto inicia el temporizador.

void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
{    
  GPIO_InitTypeDef GPIO_InitStruct;
  if(htim->Instance==TIM3)
  {
  /* USER CODE BEGIN TIM3_MspPostInit 0 */

  /* USER CODE END TIM3_MspPostInit 0 */

    /**TIM3 GPIO Configuration    
    PB0     ------> TIM3_CH3
    PB1     ------> TIM3_CH4
    PB4     ------> TIM3_CH1
    PB5     ------> TIM3_CH2 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* USER CODE BEGIN TIM3_MspPostInit 1 */

  /* USER CODE END TIM3_MspPostInit 1 */
  }
}

Esto inicia los pines GPIO para PWM.

También el reloj está habilitado en la función de devolución de llamada HAL_TIM_Base_MspInit usando __TIM3_CLK_ENABLE() .

En el archivo main.c agregué el siguiente código después de todas las inicializaciones, para iniciar el temporizador base y PWM:

HAL_TIM_Base_Start(&htim3);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_ALL);

Ahora, después de ejecutar este código en el stm32f070cb, los LED no se iluminan al menos ligeramente.

He intentado cambiar los valores de comparación CCRx. También funcionan los pines GPIO ya que puedo usar HAL_GPIO_WritePin para encender los LED. Además, descubrí que el contador se está ejecutando entre 0 y 1000 utilizando la macro __HAL_TIM_GetCounter . Parece que los LED no reaccionan a los valores de comparación.

¿Alguien tuvo un problema similar o alguna sugerencia para seguir desde aquí?

    
pregunta mthaak

2 respuestas

0

Gracias a una sugerencia amable, pude hacer funcionar el PWM usando el ejemplo TIM_PWMOutput bajo el firmware STM32F0 CubeMX:

STM32Cube_FW_F0_V1.5.0 \ Projects \ STM32F0308Discovery \ Illustrations \ TIM \ TIM_PWMOutput

Ahora he resuelto mi problema usando el código del ejemplo. Aunque no estoy seguro de dónde es diferente del código generado por CubeMX.

    
respondido por el mthaak
0

Recientemente experimenté el mismo problema contigo. Modifique el prototipo de la función HAL_TIM_MspPostInit (void) de la siguiente manera:

/**/
static void HAL_TIM_MspPostInit(void)
{    
    GPIO_InitTypeDef GPIO_InitStruct;

    /**TIM3 GPIO Configuration    
    PB0     ------> TIM3_CH3
    PB1     ------> TIM3_CH4
    PB4     ------> TIM3_CH1
    PB5     ------> TIM3_CH2 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

y usa la función como HAL_TIM_MspPostInit (); En la función principal. Básicamente, esto es igual con la función MX_GPIO_Init que puedes encontrar en las bibliotecas HAL. No puedo entender por qué agregaron otras funciones para iniciar GPIO para PWM en particular.

    
respondido por el strumgeschutz

Lea otras preguntas en las etiquetas