Error al configurar el temporizador HAL PeriodElapsed Callback STM32F334R8T

2

Estoy tratando de crear una función de demora de microsegundos usando el temporizador regular de STM. Quería configurar un temporizador para activar una interrupción cada microsegundo y luego incrementar una variable en la función de devolución de llamada que se llama al final de la interrupción y si esa variable ha alcanzado el valor deseado, detenga el contador con HAL_TIM_BASE_STOP_IT() .

Normalmente, cuando se utiliza la biblioteca HAL para STM32 al final de la interrupción, el controlador de interrupciones llama a una función de devolución de llamada. Las funciones de devolución de llamada ya están declaradas pero se dejan en blanco. El controlador utiliza una palabra clave no estándar weak que le permite sobrecargar la función de devolución de llamada, simplemente escribiendo su propia definición. He hecho esto con éxito con las funciones de devolución de llamada para las interrupciones de las comunicaciones I2C, UART y SPI, pero para el temporizador recibo los siguientes 3 errores.

Error[Pe079]: expected a type specifier C:\projects\automated_testing\voltage measurement node\Src\main.c 610 

Error[Pe147]: declaration is incompatible with "__interwork __softfp void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *)" (declared at line 1558 of "C:\projects\automated_testing\voltage measurement node\Drivers\ C:\projects\automated_testing\voltage measurement node\Src\main.c 610 

Error[Pe141]: unnamed prototyped parameters not allowed when body is present C:\projects\automated_testing\voltage measurement node\Src\main.c 610 

Mi función en este momento es, literalmente, simplemente cambiar un pin para ver si funciona. Si lo comento, se compila bien.

void HAL_TIM_PeriodElapsedCallback(&htim3)
{
  HAL_GPIO_TogglePin(N_CS_GPIO_Port, N_CS_Pin);
}

Aquí está el código de configuración para mi temporizador creado por STMCube para estar en el modo de "Comparación de salida sin salida". Estoy usando HAL_TIM_Base_Start_IT(&htim3) para iniciar el temporizador y llamo a la rutina de interrupción y obtengo la función de devolución de llamada en blanco correcta cuando no creo mi propia definición de la función.

* TIM3 init function */
static void MX_TIM3_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_OC_InitTypeDef sConfigOC;

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 0;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 72;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  if (HAL_TIM_OC_Init(&htim3) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sConfigOC.OCMode = TIM_OCMODE_TIMING;
  sConfigOC.Pulse = 0;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

Cualquier idea sobre lo que he hecho mal sería muy útil.

    

1 respuesta

3

Debería agregar el tipo de htim en la declaración de función que falta en:

void HAL_TIM_PeriodElapsedCallback(&htim3)
{
  HAL_GPIO_TogglePin(N_CS_GPIO_Port, N_CS_Pin);
}

Al agregarlo obtendrás:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  HAL_GPIO_TogglePin(N_CS_GPIO_Port, N_CS_Pin);
}

Para verificar si se llama a la función del temporizador 3, verifique el temporizador correcto:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
   if (htim == &htim3)
   {
      HAL_GPIO_TogglePin(N_CS_GPIO_Port, N_CS_Pin);
   }
}

(No tengo un compilador a mano, por lo que no puedo verificar el código).

    
respondido por el Michel Keijzers

Lea otras preguntas en las etiquetas