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 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 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.
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).
eliot alderson
eliot alderson
tortuga morada genérica
eliot alderson