Ошибка настройки таймера HAL PeriodElapsed Callback STM32F334R8T

Я пытаюсь создать функцию задержки в микросекундах, используя обычный таймер 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__);
  }

}

Любые идеи относительно того, что я сделал неправильно, были бы очень полезны.

Атрибут «слабый» не является нестандартным и обычно используется именно так, как вы описываете... чтобы пользователи могли переопределять обработчики по умолчанию.
Что находится в строке 610 в вашем файле main.c? Это похоже на важную информацию.
Я использовал термин нестандартный, поскольку, когда я впервые столкнулся с ним и изучил его, я обнаружил, что он не определен в стандартах языка C. «Слабые символы не упоминаются в стандартах языка C или C++, поэтому их вставка в код не очень переносима». en.wikipedia.org/wiki/Слабый_символ
Честно говоря, я должен был сказать, что «слабый» — это общий атрибут, предоставляемый компиляторами. Вы правы, что это не является частью языкового стандарта.

Ответы (1)

Вы должны добавить тип 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);
   }
}

(у меня нет под рукой компилятора, поэтому проверить код не могу).

Оно работает! Ты гений! Ха-ха. Довольно глупая ошибка с моей стороны, большое спасибо.
Никаких проблем и удачи в вашем проекте.