Fehler beim Einrichten des Timers HAL PeriodElapsed Callback STM32F334R8T

Ich versuche, mit dem regulären Timer des STM eine Mikrosekunden-Verzögerungsfunktion zu erstellen. Ich wollte einen Timer so einstellen, dass er jede Mikrosekunde einen Interrupt auslöst und dann eine Variable in der Callback-Funktion erhöht, die am Ende des Interrupts aufgerufen wird, und wenn diese Variable den gewünschten Wert erreicht hat, stoppt den Zähler mit HAL_TIM_BASE_STOP_IT().

Normalerweise ruft der Interrupt-Handler bei Verwendung der HAL-Bibliothek für STM32 am Ende eines Interrupts eine Callback-Funktion auf. Die Callback-Funktionen sind bereits deklariert, bleiben aber leer. Der Treiber verwendet ein nicht standardmäßiges Schlüsselwort weak, mit dem Sie die Callback-Funktion überladen können, indem Sie einfach Ihre eigene Definition schreiben. Ich habe dies erfolgreich mit den Callback-Funktionen für die Interrupts für die I2C-, UART- und SPI-Kommunikation durchgeführt, aber für den Timer erhalte ich die folgenden 3 Fehler.

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 

Meine Funktion im Moment ist buchstäblich nur das Umschalten eines Pins, um zu sehen, ob es funktioniert. Wenn ich es auskommentiere, kompiliert es gut.

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

Hier ist der Konfigurationscode für meinen Timer, der von STMCube erstellt wurde, um sich im Modus "Output Compare No Output" zu befinden. Ich verwende HAL_TIM_Base_Start_IT(&htim3), um den Timer zu starten und rufe die Interrupt-Routine auf und komme zur richtigen leeren Callback-Funktion, wenn ich keine eigene Definition der Funktion erstelle.

* 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__);
  }

}

Irgendwelche Ideen, was ich falsch gemacht habe, wären sehr hilfreich.

Das Attribut „schwach“ ist kein Standard und wird häufig so verwendet, wie Sie es beschreiben ... um Benutzern die Möglichkeit zu geben, Standard-Handler zu überschreiben.
Was steht in Zeile 610 in Ihrer main.c? Das scheint eine wichtige Information zu sein.
Ich habe den Begriff Nicht-Standard verwendet, da ich, als ich ihn zum ersten Mal entdeckte und untersuchte, feststellte, dass er nicht in den C-Sprachstandards definiert war. "Schwache Symbole werden von den C- oder C++-Sprachstandards nicht erwähnt; daher ist das Einfügen in Code nicht sehr portabel." en.wikipedia.org/wiki/Weak_symbol
Fairerweise hätte ich sagen sollen, dass „schwach“ ein allgemeines Attribut ist, das von Compilern bereitgestellt wird. Sie haben Recht, dass es nicht Teil des Sprachstandards ist.

Antworten (1)

Sie sollten den Typ von htim in der Funktionsdeklaration hinzufügen, die in fehlt:

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

Wenn Sie es hinzufügen, erhalten Sie:

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

Um zu prüfen, ob die Funktion für Timer 3 aufgerufen wird, suchen Sie nach dem richtigen Timer:

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

(Ich habe keinen Compiler zur Hand, daher kann ich den Code nicht überprüfen).

Es klappt! Du bist ein Genie! Haha. Ziemlich dummer Fehler meinerseits, vielen Dank.
Kein Problem und viel Erfolg bei Ihrem Projekt.