1. 程式人生 > >HAL庫延時、SYCCNT與SYSTICK

HAL庫延時、SYCCNT與SYSTICK

and 操作 內核時鐘 height 需要 data 單片機 spa sdi

HAL庫驅動中,由於某些外設的驅動需要使用超時判斷(比如I2C、SPI、SDIO等),需要精確延時(精度為1ms),使用的是SysTick,但是在操作系統裏面,我們需要使用
SysTick來提供系統時基,那麽就沖突了,怎麽辦?答案是利用DWT重新編寫HAL庫的相關延時和超時函數HAL_InitTick()、HAL_GetTick()和HAL_Delay(),這三個函數
在HAL庫中都是弱定義函數(函數開頭帶__weak關鍵字)。

在Cortex-M內核裏面有一個外設叫DWT(Data Watchpoint and Trace), 該外設有一個32位的寄存器叫CYCCNT,它是一個向上的計數器, 記錄的是內核時鐘運行的個數,最

長能記錄的時間為: 10.74s = 2的32次方/400000000 (CYCNNT從0開始計數到溢出,最長的延時時間與內核的頻率有關,假設內核頻率為400M,內核時鐘跳一次的時間大概為
1/400M=2.5ns) ,當CYCCNT溢出之後,會清0重新開始向上計數。這種延時方案不僅精確,而且還不占用單片機的外設資源,非常方便。所以HAL庫裏面剛剛講到的需要重寫的
三個函數我們都基於CYCCNT的方案來實現----》摘錄自RTT。

HAL庫編譯很慢,只有對於大內存的F7/H7才用HAL庫

HAL庫延時、SYCCNT與SYSTICK