STM32F030F4 Timer3 no funciona

Uso STM32F030F4 en el paquete TSSOP-20 y el temporizador no funciona. Intento encontrar un ejemplo para STM32F103 y funciona muy bien.

Aquí está el ejemplo de código que uso:

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

GPIO_InitTypeDef GPIO_Config;
GPIO_Config.GPIO_Pin = GPIO_Pin_6;

GPIO_Config.GPIO_Mode = GPIO_Mode_AF;
GPIO_Config.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Config.GPIO_OType = GPIO_OType_PP;
GPIO_Config.GPIO_PuPd = GPIO_PuPd_NOPULL;

TIM_TimeBaseInitTypeDef timer;
TIM_OCInitTypeDef timerPWM;

TIM_TimeBaseStructInit(&timer);
timer.TIM_Prescaler = 0;
timer.TIM_Period = 100;
timer.TIM_ClockDivision = 0;
timer.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &timer);

TIM_OCStructInit(&timerPWM);
timerPWM.TIM_OCMode = TIM_OCMode_PWM1;
timerPWM.TIM_OutputState = TIM_OutputState_Enable;
timerPWM.TIM_Pulse = 50;
timerPWM.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OC1Init(TIM3, &timerPWM);
TIM_Cmd(TIM3, ENABLE);

TIM3->CCR1 = 50;
Su STM32F0 es sustancialmente diferente de un STM32F1, especialmente con respecto a cómo se configuran las funciones alternativas de GPIO. Su TSSOP-20 sería una de las variantes más bajas del chip, por lo que es importante verificar qué periféricos se pueden eliminar; sin embargo, tiene suerte, el temporizador 3 está allí, son los temporizadores 6, 7 y 15 los que no lo están. .

Respuestas (1)

Aquí está el código de inicialización del temporizador 3 generado por el STM32CubeMX:

/* TIM3 init function */
void MX_TIM3_Init(void)
{
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 5;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 400;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 0;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_TIM_MspPostInit(&htim3);

}

Y dentro de HAL_TIM_MspPostInit(&htim3) aquí está el código relacionado con la inicialización del pin:

__HAL_RCC_GPIOA_CLK_ENABLE();
/**TIM3 GPIO Configuration    
PA6     ------> TIM3_CH1
PA7     ------> TIM3_CH2 
*/
GPIO_InitStruct.Pin = PWM_ISO_Pin|PWM_LED_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

Noté que te falta esta declaración: 'GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;' lo que significa que establece el pin como Alternate_Function pero olvida establecer a qué AF debe asignarse. Espero que ayude.

Muchas gracias por el detalle de la publicación. Todavía no he usado la biblioteca HAL, así que es hora de intentarlo :)
Y uno más sobre la estructura GPIO: typedef struct { uint32_t GPIO_Pin; GPIOMode_TypeDef GPIO_Mode; GPIOSpeed_TypeDef GPIO_Speed; GPIOOType_TypeDef GPIO_OType; GPIOPuPd_TypeDef GPIO_PuPd; }GPIO_InitTypeDef; No tiene el campo Alternate_Function, pero todos los demás campos los inicié.
Probé este código, pero no funciona por completo. No sé, tal vez el MC no funciona correctamente y debería reemplazarlo. Pero escribir 1 en pin_0 funciona perfectamente. ¿Alguien tiene algunas ideas?