SysTick是存在于stm32內(nèi)核的定時(shí)器,嵌套在NVIC中,24位,只能遞減。在stm32中文參考手冊(cè)中,對(duì)于SysTick的描述其實(shí)很少,主要如下。systick的時(shí)鐘可以為AHB時(shí)鐘,或者是AHB時(shí)鐘8分頻=9M。而校準(zhǔn)值固定為9000,也就是說,當(dāng)時(shí)鐘頻率為9M時(shí),9000的固定值對(duì)應(yīng)1ms時(shí)間基準(zhǔn),9000 000對(duì)應(yīng)1s時(shí)間。
在core-CM3編程手冊(cè)中,有配置systick的寄存器描述。
SysTick控制和狀態(tài)寄存器STK_CTRL
位描述:
COUNTFLAG:如果上一次計(jì)數(shù)到0,則返回1,為計(jì)數(shù)標(biāo)志。
CLKSOURCE:選擇時(shí)鐘源,為0時(shí)即為AHB時(shí)鐘8分頻,為1時(shí)直接就等于AHB總線時(shí)鐘。
TICKINT:SysTick異常請(qǐng)求使能,該位為1則計(jì)數(shù)值減到0時(shí)發(fā)起系統(tǒng)異常請(qǐng)求,為0時(shí)不響應(yīng)。
ENABLE:該位為1時(shí),計(jì)數(shù)值從重裝載值寄存器開始往下遞減,當(dāng)減到0,會(huì)設(shè)置COUNTFLAG標(biāo)志位為1,并根據(jù)TICKINT的值來選擇是否發(fā)起系統(tǒng)異常請(qǐng)求,然后重新裝初始值,開始計(jì)數(shù)。
STK_LOAD重裝載值寄存器,設(shè)置計(jì)數(shù)初值。值得注意的是,SysTick是減到0,一次完整的計(jì)數(shù)過程是0 - 99 - 98 -... -0共100個(gè)數(shù),這是循環(huán)計(jì)數(shù)過程。因此,如果我們希望的計(jì)數(shù)值為N,實(shí)際上要寫入到LOAD寄存器的值必須為N-1,這個(gè)非常重要。
另外,如果是希望計(jì)數(shù)只觸發(fā)一次,則填入的值還是N,因?yàn)樯倭艘粋€(gè)0-N的一次記數(shù),這些都有寄存器描述,最常用的循環(huán)計(jì)數(shù)還是初始值為N-1
還有一個(gè)當(dāng)前計(jì)數(shù)值寄存器,該寄存器一旦寫入就會(huì)將當(dāng)前寄存器的所有位清零,并還會(huì)把CPUNTFLAG標(biāo)志位清0,所以我們不要鬼這個(gè)寄存器進(jìn)行寫入操作。
野火給出的框圖如下,也是在說明上述意義。
SysTick定時(shí)時(shí)間的計(jì)算:
時(shí)間t 單詞執(zhí)行的時(shí)間,和reload CLK有關(guān);
CLK 9M或72M,由CTRL寄存器配置;
reload值,24位,用戶配置;
所以就有下面的配置:
t = reload * (1 / CLK)
CLK = 72M時(shí),t = (72) * (1 / 72M) = 1us,此時(shí)reload = 72
CLK = 72M時(shí),t = (72000) * (1 / 72M) = 1ms,此時(shí)reload = 72000
注意,這是單次計(jì)數(shù),所以reload = N,就是從N到0,實(shí)際上計(jì)數(shù)N次。而循環(huán)計(jì)數(shù)時(shí),reload要設(shè)置為N-1,因?yàn)閺腘-1到0計(jì)數(shù)N-1次,再從0到N-1計(jì)數(shù)一次,這才是一個(gè)完整的循環(huán)周期。
如果產(chǎn)生中斷的延時(shí)是微妙級(jí)別,那么系統(tǒng)會(huì)頻繁的進(jìn)入中斷,很多事情就做不了了,與系統(tǒng)的時(shí)間相沖突,因此意義不大,通常使用的中斷都是ms級(jí)別。
標(biāo)準(zhǔn)固件庫中對(duì)SysTick有非常詳細(xì)的描述
這個(gè)時(shí)初始化結(jié)構(gòu)體
typedef struct
{
__IO uint32_t CTRL; /*!< Offset: 0x00 SysTick Control and Status Register */
__IO uint32_t LOAD; /*!< Offset: 0x04 SysTick Reload Value Register */
__IO uint32_t VAL; /*!< Offset: 0x08 SysTick Current Value Register */
__I uint32_t CALIB; /*!< Offset: 0x0C SysTick Calibration Register */
} SysTick_Type;
然后看系統(tǒng)默認(rèn)對(duì)SysTick的配置,這里有幾個(gè)值得注意的地方,1 輸入嘀嗒數(shù)不能超過2^24;2 嘀嗒數(shù)就是要定時(shí)的數(shù)N,因?yàn)?a href="http://m.womende.cn/zhuanti/rfXrzD" style="color:#4595e6;" target="_blank">代碼里自動(dòng)實(shí)現(xiàn)了N-1;默認(rèn)將時(shí)鐘配置為AHB時(shí)鐘72M;默認(rèn)中斷優(yōu)先級(jí)位最低優(yōu)先級(jí)15。
/**
* @brief Initialize and start the SysTick counter and its interrupt.
*
* @param ticks number of ticks between two interrupts
* @return 1 = failed, 0 = successful
*
* Initialise the system tick timer and its interrupt and start the
* system tick timer / counter in free running mode to generate
* periodical interrupts.
*/
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
// 設(shè)置SysTick 中斷優(yōu)先級(jí),默認(rèn)為最低的優(yōu)先級(jí)(1 << 4) - 1 = 16 - 1 = 15
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
SysTick->VAL = 0; /* Load the SysTick Counter Value */
// 這里的SysTick_CTRL_CLKSOURCE_Msk = 1 << 2,默認(rèn)會(huì)將時(shí)鐘配置為AHB時(shí)鐘源72M
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
固件庫設(shè)置中斷優(yōu)先級(jí)的標(biāo)準(zhǔn)函數(shù),首先判斷中斷標(biāo)號(hào)<0(內(nèi)核)還是>=0(外設(shè)),如果是外設(shè)的中斷非常簡(jiǎn)單,直接設(shè)置IP寄存器的高4位(priority << 4),如果是內(nèi)核的中斷,不是設(shè)置NVIC_IP寄存器,而是設(shè)置SCB_SHPR寄存器。
/**
* @brief Set the priority for an interrupt
*
* @param IRQn The number of the interrupt for set priority
* @param priority The priority to set
*
* Set the priority for the specified interrupt. The interrupt
* number can be positive to specify an external (device specific)
* interrupt, or negative to specify an internal (core) interrupt.
*
* Note: The priority cannot be set for every core interrupt.
*/
static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{
if(IRQn < 0) {
SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */
else {
NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */
}
當(dāng)SysTick和外設(shè)同時(shí)產(chǎn)生中斷時(shí),根據(jù)4位數(shù)的數(shù)值大小來解析中斷優(yōu)先級(jí)的高低。
上一篇:stm32時(shí)鐘樹以及修改系統(tǒng)時(shí)鐘頻率
下一篇:stm32專題一:GPIO輸出—點(diǎn)亮LED
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- 上汽大眾:汽車網(wǎng)絡(luò)安全漏洞防護(hù)
- 恩智浦推出全新電池控制IC系列 助力新能源解決方案發(fā)展
- 全球首條GWh級(jí)新型固態(tài)電池生產(chǎn)線樣件下線
- 總投資455億元!三大動(dòng)力電池項(xiàng)目齊刷進(jìn)度條
- 現(xiàn)代汽車韓國建氫燃料電池廠,2028年投產(chǎn)
- 6月融資一覽:智能汽車芯片、第三代半導(dǎo)體、機(jī)器人成資本焦點(diǎn)
- 艙駕一體“點(diǎn)燃”新戰(zhàn)事
- 汽車智能化2.0引爆「萬億蛋糕」,誰在改寫游戲規(guī)則?
- 2025研華智能系統(tǒng)產(chǎn)業(yè)伙伴峰會(huì)成功舉辦
- 意法半導(dǎo)體公布2025年第二季度財(cái)報(bào)和電話會(huì)議時(shí)間安排
- “USB 3.1 規(guī)范及重要測(cè)試需考慮的因素”江湖令,一起在吐槽中成長(zhǎng)
- 下資料贏京東卡|泰克“軟硬”兼施 打造超值示波器
- 評(píng)論有禮:用混合信號(hào)示波器探索總線的秘密
- 發(fā)原創(chuàng)討論 贏驚喜大禮
- 安世半導(dǎo)體&世平集團(tuán) 高效能&小型化, Nexperia MOSFET的5G解決方案 觀看、下載 闖關(guān)贏好禮!
- 免費(fèi)樣片體驗(yàn):EEworld邀你一起玩轉(zhuǎn)TI 運(yùn)放新秀-OPA388
- 看視頻贏京東卡 | 泰享實(shí)測(cè)之水哥秘籍第二期
- 【EEWORLD第二十八屆】2011年07月社區(qū)明星人物揭曉!
- 【評(píng)論有禮!】Sleepace RestOn 智能睡眠監(jiān)測(cè)儀拆解
- 直擊CIROS2018:中國機(jī)器人走向2.0時(shí)代
- 應(yīng)用材料公司榮獲計(jì)算機(jī)芯片出貨量桂冠
- 英特爾與百度強(qiáng)強(qiáng)聯(lián)手,助力人工智能
- 攝像頭快速識(shí)別二維碼的秘密
- 總線干擾的原因大科普
- 奔馳發(fā)布《服務(wù)公約》:絕不捆綁銷售、強(qiáng)制消費(fèi)
- 奔馳發(fā)布新的三包報(bào)修政策,”亡羊補(bǔ)牢“有待時(shí)間考驗(yàn)
- 無人機(jī)大疆的美國往事
- 大疆將從2020年開始為無人機(jī)裝配飛機(jī)與直升機(jī)探測(cè)器
- 華南展(IARS)現(xiàn)場(chǎng)直擊:多款機(jī)器人創(chuàng)新方案同場(chǎng)競(jìng)技
- 從焊接角度談畫PCB圖時(shí)應(yīng)注意的問題
- 2410 的存儲(chǔ)器以及有關(guān)啟動(dòng)的問題????????
- 筆記本打開一定角度屏幕就亮是用了什么傳感器
- 用ATMEGA16控制NRF905進(jìn)行簡(jiǎn)單的收發(fā),調(diào)了一周了,希望哪位大俠能幫俺播開云霧??!
- micropython升級(jí)固件遇到困難
- 求insight ME-52單片機(jī)的模擬環(huán)境運(yùn)行軟件
- wince下紅外驅(qū)動(dòng)
- 如何設(shè)計(jì)一款適用于各類電池尺寸、電壓和外形的電池測(cè)試儀
- 基于DS18B20和四位LED的溫度自動(dòng)控制系統(tǒng)
- 英蓓特STM32V100可以SWD調(diào)試了