SysTick定時(shí)器被捆綁在NVIC中,是一個(gè)簡(jiǎn)單的定時(shí)器,對(duì)于CM3、CM4內(nèi)核芯片,都有Systick定時(shí)器。Systick定時(shí)器常用來(lái)做延時(shí),或者實(shí)時(shí)系統(tǒng)的心跳時(shí)鐘。這樣可以節(jié)省MCU資源,不用浪費(fèi)一個(gè)定時(shí)器。
Systick定時(shí)器就是系統(tǒng)滴答定時(shí)器,一個(gè)24 位的倒計(jì)數(shù)定時(shí)器,計(jì)到0 時(shí),將從RELOAD 寄存器中自動(dòng)重裝載定時(shí)初值。
系統(tǒng)滴答定時(shí)器有4個(gè)寄存器
CTRL | SysTick控制及狀態(tài)寄存器(地址:0xE000_E010) |
---|---|
LOAD | SysTick重裝載數(shù)值寄存器(地址:0xE000_E014) |
VAL | SysTick當(dāng)前數(shù)值寄存器(地址:0xE000_E018) |
CALIB | SysTick校準(zhǔn)數(shù)值寄存器(地址:0xE000_E01C) |
時(shí)鐘源
該定時(shí)器的時(shí)鐘源可以是
- 內(nèi)部時(shí)鐘(FCLK,CM3上的自由運(yùn)行時(shí)鐘)
- 外部時(shí)鐘( CM3處理器上的STCLK信號(hào))
通過(guò)SysTick控制及狀態(tài)寄存器的第2位來(lái)確定
STM32的時(shí)鐘樹(shù)
RCC通過(guò)AHB時(shí)鐘(HCLK)8分頻或者不分頻作為Cortex系統(tǒng)定時(shí)器(SysTick)的外部時(shí)鐘。CLKSOURCE = 0
FCLK是Cortex?-M3的自由運(yùn)行時(shí)鐘。詳情見(jiàn)ARM的Cortex?-M3技術(shù)參考手冊(cè)。CLKSOURCE = 1
由下圖代碼可知,庫(kù)函數(shù)默認(rèn)選擇FCLK時(shí)鐘作為SysTick的時(shí)鐘源
/* SysTick end of count event each 1ms */
RCC_GetClocksFreq(&RCC_Clocks);
SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000); //Systick定時(shí)周期為1ms
SysTick控制及狀態(tài)寄存器
SysTick重裝載數(shù)值寄存器
24位的倒計(jì)數(shù)器
SysTick當(dāng)前數(shù)值寄存器
SysTick校準(zhǔn)數(shù)值寄存器
系統(tǒng)滴答定時(shí)器中斷優(yōu)先級(jí)設(shè)置
通過(guò)系統(tǒng)異常優(yōu)先級(jí)寄存器來(lái)設(shè)置系統(tǒng)滴答定時(shí)器的優(yōu)先級(jí)
在設(shè)置優(yōu)先級(jí)之前得確定優(yōu)先級(jí)分組,幾位是搶占式優(yōu)先級(jí),幾位是子優(yōu)先級(jí)。
系統(tǒng)異常優(yōu)先級(jí)寄存器在C文件中的代碼core_cm3.h
直接操作寄存器配置系統(tǒng)滴答定時(shí)器demo
采用STM32F103C8T6單片機(jī),KeilMDK5.32版本
時(shí)鐘配置如下圖
選用外部時(shí)鐘源(STCLK)即Cortex System timer 頻率為9MHz
作為系統(tǒng)滴答定時(shí)器的時(shí)鐘源
系統(tǒng)滴答定時(shí)器定時(shí)時(shí)間為1ms,也就是1KHz,根據(jù)時(shí)鐘源頻率 9MHz/1KHz = 9000;
即系統(tǒng)滴答定時(shí)器重載值為9000-1=8999。
SysTick->LOAD = 8999; /* 設(shè)置重載值 */
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* 設(shè)置中斷優(yōu)先級(jí) 15(最低優(yōu)先級(jí)) */
SysTick->VAL = 0UL; /* 當(dāng)前計(jì)數(shù)值 */
SysTick->CTRL |= 0 << 2; /* 選擇外部時(shí)鐘源 */
SCB->SHP[11] = 0xF0; /* 設(shè)置搶占式優(yōu)先級(jí)為15 */
SysTick->CTRL |= 1 << 1; /* SysTick倒數(shù)計(jì)數(shù)到0時(shí)產(chǎn)生SysTick異常(中斷)請(qǐng)求 */
SysTick->CTRL |= 1 << 0; /* 使能SysTick */
HAL庫(kù)配置系統(tǒng)滴答定時(shí)器demo
采用STM32F103C8T6單片機(jī),KeilMDK5.32版本
HAL庫(kù)默認(rèn)采用FCLK作為系統(tǒng)滴答定時(shí)器的時(shí)鐘源72MHz
定時(shí)的時(shí)間為1ms,也就是1KHz,重載值為72000-1=71999
優(yōu)先級(jí)為15
PC13控制LED燈,LED的亮滅指示程序運(yùn)行狀態(tài)
STM32CubeMX配置
主要代碼
先看序號(hào)1
函數(shù)HAL_Init()
調(diào)用HAL_InitTick()
來(lái)配置系統(tǒng)滴答定時(shí)器,
HAL_Init()HAL_InitTick()
調(diào)用HAL_SYSTICK_Config()
配置系統(tǒng)滴答定時(shí)器,和設(shè)置系統(tǒng)滴答定時(shí)器的優(yōu)先級(jí)(優(yōu)先級(jí)為15)。
HAL_InitTick()HAL_SYSTICK_Config()
調(diào)用SysTick_Config()
來(lái)進(jìn)行配送系統(tǒng)滴答定時(shí)器
SysTick_Config()SysTick_Config()
根據(jù)參數(shù)ticks來(lái)設(shè)置重載值,清除當(dāng)前計(jì)數(shù)值,選擇FCLK(72MHz)作為時(shí)鐘源,設(shè)置中斷優(yōu)先級(jí)為15,并使能系統(tǒng)滴答定時(shí)器。
注意:此時(shí)FCLK還不是72MHz,因?yàn)镾TM32的時(shí)鐘樹(shù)相關(guān)的寄存器還未被設(shè)置。
序號(hào)2SystemClock_Config()
調(diào)用了HAL_RCC_ClockConfig()
。HAL_RCC_ClockConfig()
配置STM32的時(shí)鐘樹(shù),將FCLK的頻率設(shè)置為72MHz,再次調(diào)用HAL_InitTick()
配置系統(tǒng)滴答定時(shí)器
此時(shí)才是真正的配置好了系統(tǒng)滴答定時(shí)器文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-400212.html
HAL_RCC_ClockConfig()
工程文件下載鏈接文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-400212.html
到了這里,關(guān)于【STM32】HAL庫(kù)-系統(tǒng)滴答定時(shí)器SysTick的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!