Error al configurar el temporizador HAL PeriodElapsed Callback STM32F334R8T

Estoy tratando de crear una función de retraso de microsegundos usando el temporizador regular de STM. Quería configurar un temporizador para disparar 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 detener el contador con HAL_TIM_BASE_STOP_IT().

Normalmente, cuando se usa la biblioteca HAL para STM32 al final de una 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 weakque 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 la comunicación I2C, UART y SPI, pero para el temporizador obtengo 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, alternar un pin para ver si funciona. Si lo comento, 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 "Comparar salida sin salida". Estoy usando HAL_TIM_Base_Start_IT(&htim3)para iniciar el temporizador y llamo a la rutina de interrupción y llego a 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.

El atributo 'débil' no es no estándar y se usa comúnmente de la manera que usted describe ... para permitir que los usuarios anulen los controladores predeterminados.
¿Qué hay en la línea 610 en tu main.c? Eso parece información crítica.
Utilicé el término no estándar porque cuando lo encontré por primera vez y lo investigué, descubrí que no estaba definido en los estándares del lenguaje C. "Los estándares de lenguaje C o C++ no mencionan los símbolos débiles; como tal, insertarlos en el código no es muy portátil". en.wikipedia.org/wiki/Weak_symbol
Bastante justo, debería haber dicho que 'débil' es un atributo común proporcionado por los compiladores. Tienes razón en que no es parte del estándar del idioma.

Respuestas (1)

Debe agregar el tipo de htim en la declaración de la 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 comprobar si se llama a la función para el temporizador 3, busque 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).

¡Funciona! ¡Eres un genio! Ja ja. Error bastante tonto de mi parte, muchas gracias.
No hay problema y suerte con tu proyecto.