1.SYSTICK原理及其寄存器 1.1 SYSTICK原理 SysTick 是一個24位的倒計數(shù)定時器,當計到0時,將從RELOAD寄存器中自動重裝載定時初值并繼續(xù)計數(shù),且同時觸發(fā)中斷。只要不把它在SysTick控制及狀態(tài)寄存器中的使能位清除,就永不停息。 SysTick 的最大使命,就是定期地產(chǎn)生異常請求,作為系統(tǒng)的時基,產(chǎn)生一個周期性的中斷。
1.2SYSTICK寄存器 CTRL: Systick控制和狀態(tài)寄存器 CLKCOURCE-時鐘源 0:外部時鐘源HCLK(AHB總線時鐘)/8 72M/8 = 9M 1:內(nèi)核時鐘(HCLK) 72M CURRENT: 每經(jīng)過一個Systick時鐘周期,寄存器值-1 。
2.STM32CubeMX配置與代碼生成 如下圖STM32CubeMX配置所示,圖中To Cortex System timer(MHz)就是Systick的時鐘頻率。 自動代碼生成如下: /**Configure the Systick interrupt time */ /**Configure the Systick */ /* SysTick_IRQn interrupt configuration */
3.相關(guān)重要的函數(shù) 3.1中斷處理函數(shù) void SysTick_Handler(void) /* USER CODE END SysTick_IRQn 0 */ /* USER CODE END SysTick_IRQn 1 */ __IO uint32_t uwTick; __weak void HAL_IncTick(void) 每次SysTick異常中斷后,會執(zhí)行SysTick_Handler() 函數(shù),然后HAL_IncTick()函數(shù)。由于uwTick是 無符號32位整型數(shù),所以根據(jù)C語言的定義,當累計到0xFFFFFFFF后,再加1等于0。 3.2 延時函數(shù) __weak void HAL_Delay(uint32_t Delay) /* Add a freq to guarantee minimum wait */ while ((HAL_GetTick() - tickstart) < wait) __weak uint32_t HAL_GetTick(void) 由于tickstart和HAL_GetTick()的返回值都是無符號32位整型,所以HAL_GetTick() - tickstart =HAL_GetTick() + (~ tickstart) ,如果tickstart > HAL_GetTick(),也可以計算出兩者之間正確的差值。
4.注意事項 1.Systick的中斷函數(shù)一定要在STM32CubeMX中設置自動生成出來; 2.由于Systick中斷每次累加值uwTickFreq是在stm32f1xx_hal.c定義,且默認是1U(以1kHz為默認頻率)。而Systick配置函數(shù)是在stm32f1xx_hal_cortex.c和core_cm3.h定義,各自完全獨立。因此,如果Systck配置頻率不是1kHz時,需要利用stm32f1xx_hal.c的HAL_SetTickFreq()函數(shù)重新配置累計值uwTickFreq; 3.當處理器在調(diào)試期間被喊停(halt)時,則SysTick定時器亦將暫停運作。
|
|