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.
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).
Elliot Alderson
Elliot Alderson
generischelila Schildkröte
Elliot Alderson