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