Я пытаюсь создать функцию задержки в микросекундах, используя обычный таймер STM. Я хотел установить таймер для запуска прерывания каждую микросекунду, а затем увеличить переменную в функции обратного вызова, которая вызывается в конце прерывания, и если эта переменная достигла желаемого значения, остановите счетчик с помощью HAL_TIM_BASE_STOP_IT()
.
Обычно при использовании библиотеки HAL для STM32 в конце прерывания обработчик прерывания вызывает функцию обратного вызова. Функции обратного вызова уже объявлены, но оставлены пустыми. Драйвер использует нестандартное ключевое слово weak
, которое позволяет вам перегрузить функцию обратного вызова, просто написав собственное определение. Я успешно сделал это с функциями обратного вызова для прерываний для связи I2C, UART и SPI, но для таймера я получаю следующие 3 ошибки.
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
Моя функция на данный момент буквально просто переключает булавку, чтобы увидеть, работает ли она. Если я его закомментирую, он компилируется нормально.
void HAL_TIM_PeriodElapsedCallback(&htim3)
{
HAL_GPIO_TogglePin(N_CS_GPIO_Port, N_CS_Pin);
}
Вот код конфигурации для моего таймера, созданного STMCube, который находится в режиме «Сравнение вывода без вывода». Я использую HAL_TIM_Base_Start_IT(&htim3)
для запуска таймера и вызываю процедуру прерывания и получаю правильную пустую функцию обратного вызова, когда я не создаю собственное определение функции.
* 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__);
}
}
Любые идеи относительно того, что я сделал неправильно, были бы очень полезны.
Вы должны добавить тип htim в объявление функции, которое отсутствует в:
void HAL_TIM_PeriodElapsedCallback(&htim3)
{
HAL_GPIO_TogglePin(N_CS_GPIO_Port, N_CS_Pin);
}
Добавив его, вы получите:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
HAL_GPIO_TogglePin(N_CS_GPIO_Port, N_CS_Pin);
}
Чтобы проверить, вызывается ли функция для таймера 3, проверьте правильный таймер:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim == &htim3)
{
HAL_GPIO_TogglePin(N_CS_GPIO_Port, N_CS_Pin);
}
}
(у меня нет под рукой компилятора, поэтому проверить код не могу).
Эллиот Алдерсон
Эллиот Алдерсон
универсальнаяфиолетоваячерепаха
Эллиот Алдерсон