Keil RTX, используйте альтернативный аппаратный таймер

Я пытаюсь использовать Embedded Wizard (EW) с Keil RTX на моем STM32F769i-Eval. Для EW мне нужно вызвать функцию EwBspSystemTickIncrement() из SysTick_Handler. Проблема в том, что я не могу получить доступ к SysTick_Handler, потому что это часть базовой библиотеки.

Сначала я попытался инициализировать TIM4, который создает прерывание каждые 1 мс и вызывает функцию. Это работает, но после нескольких событий касания программа сталкивается с неисправностью. Я не знаю почему.

Чтобы быть уверенным, что это не проблема, созданная из разницы systick и emtick, созданного tim4, я хочу инициализировать аппаратный тример как SysTickTimer.

Проблема в том, что я не знаю, как это сделать. Я нашел эту ссылку, но я не совсем уверен, что я должен написать в этой функции.

Сначала я снимаю флажок "Использовать таймеры Cortex-M SysTick как RTX Kernel Timer".

После этого у меня так инициализировать новый аппаратный таймер в os_tick_init, как это?

/*--------------------------- os_tick_init ----------------------------------*/

/// \brief Initializes an alternative hardware timer as RTX kernel timer
/// \return                             IRQ number of the alternative hardware timer
int os_tick_init (void) {
void TIM4_Init(void) //is this correct?
  return (-1);  /* Return IRQ number of timer (0..239) */
}

/*--------------------------- os_tick_val -----------------------------------*/

/// \brief Get alternative hardware timer's current value (0 .. OS_TRV)
/// \return                             Current value of the alternative hardware timer
uint32_t os_tick_val (void) {//what to fill in here?
  return (0);
}

/*--------------------------- os_tick_ovf -----------------------------------*/

/// \brief Get alternative hardware timer's  overflow flag
/// \return                             Overflow flag\n
///                                     - 1 : overflow
///                                     - 0 : no overflow
uint32_t os_tick_ovf (void) { //what to fill in here?
  return (0);
}

/*--------------------------- os_tick_irqack --------------------------------*/

/// \brief Acknowledge alternative hardware timer interrupt
void os_tick_irqack (void) {
  //what to fill in here?
}

Наконец, я должен добавить IMPORT OS_Tick_Handler в RTX_Conf_CM.C

Вот код, как я настроил TIM4

static void TIM4_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
//Clock ist anfangs 108MHz -> 1ms 
  htim4.Instance = TIM4;
  htim4.Init.Prescaler = 10799;
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim4.Init.Period = 9;
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
  {
    Error_Handler(5U);
  }

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler(5U);
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  {
    Error_Handler(5U);
  }

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{


    if(htim_base->Instance==TIM4)
  {
  /* USER CODE BEGIN TIM4_MspInit 0 */

  /* USER CODE END TIM4_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_TIM4_CLK_ENABLE();
    /* TIM4 interrupt Init */
    HAL_NVIC_SetPriority(TIM4_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM4_IRQn);
  /* USER CODE BEGIN TIM4_MspInit 1 */

  /* USER CODE END TIM4_MspInit 1 */
  }

}

Я был бы очень благодарен, если бы кто-то мог помочь мне настроить альтернативный SysTickTimer.

С наилучшими пожеланиями, Алекс

0 ответов

Другие вопросы по тегам