STM32学习笔记(七)---SysTick
STM32學(xué)習(xí)筆記(七)—SysTick
文章目錄
- STM32學(xué)習(xí)筆記(七)---SysTick
- 一、SysTick簡介
- 二、SysTick功能框圖
- 三、SysTick寄存器
- 四、SYSTICK使用
- 1.中斷方式使用
- 2.輪詢方式使用
- 五、參考資料:
- 五、參考資料:
一、SysTick簡介
SysTick屬于CM4內(nèi)核中的一個(gè)外設(shè),內(nèi)嵌在NVIC中,有關(guān)寄存器的定義和部分庫函數(shù)都在core_cm4.h頭文件中實(shí)現(xiàn)。
SysTick(系統(tǒng)滴答定時(shí)器)是一個(gè)24bit的向下遞減的計(jì)數(shù)器,計(jì)數(shù)器每計(jì)數(shù)一次的時(shí)間為1/SYSCLK。
當(dāng)重裝載初值寄存器的值減到0的時(shí)候,系統(tǒng)定時(shí)器就產(chǎn)生一次中斷,一次循環(huán)往復(fù)。
系統(tǒng)定時(shí)器一般用于操作系統(tǒng),用于產(chǎn)生時(shí)基,維持操作系統(tǒng)心跳。
二、SysTick功能框圖
三、SysTick寄存器
| CTRL | 控制及狀態(tài)寄存器 |
| LOAD | 重裝載數(shù)值寄存器 |
| VAL | 當(dāng)前數(shù)值寄存器 |
| CALIB | 校準(zhǔn)數(shù)值寄存器 |
SysTick控制和狀態(tài)寄存器
| 16 | COUNTFLAG | RO | 0 | 當(dāng)SysTick定時(shí)器計(jì)數(shù)到0時(shí),該位變?yōu)?,讀取寄存器或清除計(jì)數(shù)器當(dāng)前值會(huì)被清零 |
| 2 | CLKSOURCE | R/W | 0 | 時(shí)鐘選擇位:0=SYSCLK/8, 1=SYSCLK |
| 1 | TICKINT | R/W | 0 | 1 = SYSTICK定時(shí)器計(jì)數(shù)減至0時(shí)產(chǎn)生異常 0 = 不產(chǎn)生異常 |
| 0 | ENABLE | R/W | 0 | SYSTICK定時(shí)器使能 |
SysTick重裝載值寄存器
| 23:0 | RELOAD | R/W | 未定義 | 定時(shí)器計(jì)數(shù)為0時(shí)的重裝載值 |
SysTick當(dāng)前值寄存器
| 23:0 | CURRENT | R/Wc | 0 | 讀出值為SYSTICK定時(shí)器的當(dāng)前值。寫入任何值都會(huì)清除寄存器,SYSTICK控制和狀態(tài)寄存器中的COUNTFLAG也會(huì)清零 |
四、SYSTICK使用
1.中斷方式使用
可以直接通過庫函數(shù)SysTick_Config(uint32_t ticks)來配置,該函數(shù)位于core_m4.h文件中
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) {/* 重裝載初值超出范圍 */if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); } /* 設(shè)置重裝載初值 */SysTick->LOAD = (uint32_t)(ticks - 1UL); /* 設(shè)置SysTick定時(shí)器中斷優(yōu)先級,這里將SysTick的優(yōu)先級設(shè)置位15(0-15),為系統(tǒng)最低 */NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* 設(shè)置當(dāng)前數(shù)值寄存器 */SysTick->VAL = 0UL;/* 設(shè)置時(shí)鐘源的選擇:SYSCLK=168M * 使能系統(tǒng)定時(shí)器中斷* 使能定時(shí)器*/SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |SysTick_CTRL_TICKINT_Msk |SysTick_CTRL_ENABLE_Msk; return (0UL); } /* SystemCoreClock / 1000 1ms中斷一次* SystemCoreClock / 1000000 1us中斷一次*/ Systick_Config(SystemCoreClock / 1000);注意:這里的tick值最大為2^24 = 16,777,216?,不能超過此值。因此上面函數(shù)不能夠配置1s中斷(1s中斷tick值為:168000000>16777216)。
void SysTick_Handler(void) {/* 根據(jù)自己的實(shí)際需求來寫 */ }2.輪詢方式使用
若要在輪詢模式中使用SysTick定時(shí)器,則需要通過上述寄存器來配置。可以利用SysTick控制和狀態(tài)寄存器的(SysTick->CTRL)中的計(jì)數(shù)標(biāo)志來確定定時(shí)器何時(shí)變?yōu)?。
Systick->CTRL = 0; //禁止SysTick SysTick->LOAD = 0xFF; //計(jì)數(shù)范圍255-0(256個(gè)周期) SysTick->VAL = 0; //清除當(dāng)前值和計(jì)數(shù)標(biāo)記 SysTick->CTRL = 5; //使能SysTick定時(shí)器并使用處理器時(shí)鐘 while((SysTick->CRTL & 0x00010000) == 0); //等待計(jì)數(shù)標(biāo)志置位 SysTick->CTRL = 0; //禁止SysTick上面這段代碼便實(shí)現(xiàn)了延時(shí)265個(gè)時(shí)鐘周期的延時(shí)功能,具體的延時(shí)函數(shù)可以參考正點(diǎn)原子的延時(shí)函數(shù)。
上述兩種實(shí)現(xiàn)方法都是在裸機(jī)條件下的使用方法,在實(shí)際應(yīng)用時(shí)可以根據(jù)需求做選擇。
五、參考資料:
1.《零死角玩轉(zhuǎn)STM32-F407霸天虎》(SysTick)
2.《STM32F4xx標(biāo)準(zhǔn)外設(shè)庫源碼》(core_cm4.h)
五、參考資料:
1.《零死角玩轉(zhuǎn)STM32-F407霸天虎》(SysTick)
2.《STM32F4xx標(biāo)準(zhǔn)外設(shè)庫源碼》(core_cm4.h)
3.《ARM Cortex-M3與Cortex-M4權(quán)威指南》(9.5 SysTick定時(shí)器)
總結(jié)
以上是生活随笔為你收集整理的STM32学习笔记(七)---SysTick的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想K29笔记本主板图片
- 下一篇: 在博客和论坛发外链还有用吗?