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.
С наилучшими пожеланиями, Алекс