STM32 SysTick 精確延時(shí)(非中斷方式)
SysTick是Cortex-M內(nèi)核自帶的一個(gè)24位定時(shí)器,所以我們可以在core_cm3.h或core_cm4.h頭文件中看到它的寄存器定義和配置函數(shù)SysTick_Config()。SysTick的功能非常簡(jiǎn)單,僅僅提供一個(gè)時(shí)基功能,支持中斷請(qǐng)求,因此它的寄存器寥寥無(wú)幾。
以下是手冊(cè)上對(duì)SysTick寄存器的介紹:
CTRL為控制寄存器:
ENABLE:使能位
TICKINT: 中斷的開(kāi)關(guān),當(dāng)計(jì)數(shù)溢出且TICKINT=1時(shí)SysTick將發(fā)出中斷申請(qǐng)。
CLKSOURCE:時(shí)鐘選擇位,CLKSOURCE=1時(shí)選擇系統(tǒng)時(shí)鐘,如果是M3則為72MHz,M4則為168MHz。否側(cè)選擇外部時(shí)鐘作為時(shí)鐘源。
COUNTFLAG: 溢出標(biāo)志位,計(jì)數(shù)到0時(shí)置1,而且硬件自動(dòng)清零。
LOAD為重載值寄存器:
當(dāng)計(jì)數(shù)到0時(shí)SysTick自動(dòng)將此寄存器的值加載到VAL寄存器中。注意它是24位的,所以最大值為0XFFFFFF。
VAL為當(dāng)前值寄存器:
SysTick是從上往下計(jì)數(shù)的,所以此寄存器的值是遞減的。
那么,了解了SysTick的寄存器之后就可以配置它了。首先將CLKSOURCE位置1,選擇系統(tǒng)時(shí)鐘作為時(shí)鐘源,以M4內(nèi)核為例,就是168MHz。為了讓SysTick每1us溢出一次,就須要把重載值設(shè)置為167(168-1)。當(dāng)需要延時(shí)n(us)時(shí),就將ENABLE位置1,讓SysTick開(kāi)始計(jì)時(shí),然后等待n次COUNTFLAG標(biāo)志之后退出就行了。
下面是示例代碼:
#include "delay.h"
void delay_config(void)
{
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk; //時(shí)鐘源為系統(tǒng)時(shí)鐘168MHz
SysTick->LOAD = 167; //重載值為168-1,每1us溢出一次
}
void delay_ms(vu32 nTime)
{
nTime *= 1000;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能SysTick,開(kāi)始計(jì)數(shù)
while(nTime--){
while((SysTick->CTRL&0X010000) == 0); //等待COUNTFLAG標(biāo)志位置1
}
SysTick->CTRL &= (~SysTick_CTRL_ENABLE_Msk); //失能SysTick,停止計(jì)數(shù)
}
void delay_us(vu32 nTime)
{
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
while(nTime--){
while((SysTick->CTRL&0X010000) == 0);
}
SysTick->CTRL &= (~SysTick_CTRL_ENABLE_Msk);
}
- 富士通數(shù)字退火芯片DAU明年登場(chǎng)[18年05月19日 12:37]
- 高通總裁拜訪OPPO,傳拿下R15S訂單[18年05月19日 12:37]
- 經(jīng)濟(jì)學(xué)人:臺(tái)積電先進(jìn)制程將超越英特爾[18年05月19日 12:36]
- 高通恩智浦并購(gòu)獲批前景樂(lè)觀 恩智浦股價(jià)創(chuàng)本周最大漲幅[18年05月19日 12:35]
- 共建智慧家庭美好未來(lái)!2018中國(guó)智慧家庭高峰論壇精彩盤點(diǎn)[18年05月19日 12:33]
- 樂(lè)鑫ESP32開(kāi)發(fā)板正式通過(guò)Amazon FreeRTOS的驗(yàn)證[18年05月18日 21:30]