原文鏈接:https://blog.csdn.net/callmesumo/article/details/89403787
when FreeRtos is used.It is strongly recommended to use a HAL timebase source other than the Systic
在stmcubeMX中進行配置的時候,如果使用了freertos系統,生成代碼的時候會有如下提示:
其意思就是,當使用了FreeRtos的時候,強烈建議HAL庫使用除了Systick以外的時鍾源。也就是說當不使用FreeRtos的時候,HAL使用的是systick作為時鍾源,現在使用了rtos,不建議hal庫和rtos一起使用systick作為時鍾源。
我們先看一下rtos和HAL庫使用systick作為時鍾源的代碼:
在文件stm32f1xx_it.c中,滴答定時器中斷內容如下圖所示,可以看到HAL庫和rtos公用一個systick作為時鍾源
接着根據軟件的建議,使用定時作為HAL庫的時鍾源:
這里我們使用TIM1作為HAL庫的時鍾源,點擊生成代碼時,上邊的警告已經不再出現了。
查看代碼:發現現在使用systick作為時鍾源的只有rtos
HAL庫使用TIM1作為時鍾源后,生成了一個文件
該文件里邊的HAL_InitTick(uint32_t TickPriority)里邊對tim1進行了配置
該文件里邊的函數就是用來配置定時器的,1ms中斷一次
在main()->HAL_Init()->HAL_InitTick(TICK_INT_PRIORITY);其中TICK_INT_PRIORITY的值為0,此時tim1的中斷優先級是最高的。在tim1的中斷函數中,我們可以看到,HAL庫使用tim1的更新中斷作為了時鍾源
HAL_InitTick(uint32_t TickPriority)函數,有一段說明,里邊有一點要注意,就是說當中斷函數里邊調用HAL_Delay()的時候,必須保證systick的優先級比中斷函數的優先級高,因為這里是使用tim1作為時鍾源,所以就是要求tim1的優先級比中斷函數的優先級高,什么意思呢?例如串口中斷的優先級是5,tim1的優先級是6,那么串口中斷的優先級是高於tim1,此時調用HAL_Delay()是會出問題的。只有當tim1的優先級高於串口中斷的時候(設置的數值小於5),才能調用,所以這里tim1的優先級就設置為了0,最高優先級。