在使用cubemx的情況下,通常會自動初始化HAL_Delay()延時函數的,裸機情況下,就是使用了systick,如果如適用freertos等rtos,那么他會強制使用其他定時器作為時間基准,但起始可以把HAL_Delay()這個函數取消了,因為在cm3內核有dwt作為時間的延時函數,多個中斷,總是浪費一點資源。
1、在裸機平台移植其他rtos,rtos都是使用systick作為時間基准的。那么cubemx生成的systick初始化函數直接注釋掉。
// /**Configure the Systick interrupt time
// */
// HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
// /**Configure the Systick
// */
// HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
// /* SysTick_IRQn interrupt configuration */
// HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0);
2、同時把HAL_InitTick函數直接返回ok
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
#if 0
/* Configure the SysTick to have interrupt in 1ms time basis*/
if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U)
{
return HAL_ERROR;
}
/* Configure the SysTick IRQ priority */
if (TickPriority < (1UL << __NVIC_PRIO_BITS))
{
HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
uwTickPrio = TickPriority;
}
else
{
return HAL_ERROR;
}
#endif
/* Return function status */
return HAL_OK;
}
這樣可以去直接移植其他rtos或者自己寫的rtos了。
不過HAL_Delay函數最好不要用了。直接使用自己根據systick定義出的延時函數,HAL_GetTick 這歌函數里的計數器肯定是個常量了。
或者把HAL_Delay重新定義一個函數也可以,因為驅動函數庫中是__weak void HAL_Delay(uint32_t Delay)有弱定義的。
