STM32 SysTick 精確延時(非中斷方式)

SysTick是Cortex-M內核自帶的一個24位定時器,所以我們可以在core_cm3.h或core_cm4.h頭文件中看到它的寄存器定義和配置函數SysTick_Config()。SysTick的功能非常簡單,僅僅提供一個時基功能,支持中斷請求,因此它的寄存器寥寥無幾。

以下是手冊上對SysTick寄存器的介紹:


CTRL爲控制寄存器:

ENABLE:使能位

TICKINT: 中斷的開關,當計數溢出且TICKINT=1時SysTick將發出中斷申請。

CLKSOURCE:時鐘選擇位,CLKSOURCE=1時選擇系統時鐘,如果是M3則爲72MHz,M4則爲168MHz。否側選擇外部時鐘作爲時鐘源。

COUNTFLAG: 溢出標誌位,計數到0時置1,而且硬件自動清零。

LOAD爲重載值寄存器:

當計數到0時SysTick自動將此寄存器的值加載到VAL寄存器中。注意它是24位的,所以最大值爲0XFFFFFF。

VAL爲當前值寄存器:

SysTick是從上往下計數的,所以此寄存器的值是遞減的。

那麼,瞭解了SysTick的寄存器之後就可以配置它了。首先將CLKSOURCE位置1,選擇系統時鐘作爲時鐘源,以M4內核爲例,就是168MHz。爲了讓SysTick每1us溢出一次,就須要把重載值設置爲167(168-1)。當需要延時n(us)時,就將ENABLE位置1,讓SysTick開始計時,然後等待n次COUNTFLAG標誌之後退出就行了。

下面是示例代碼:

#include "delay.h"

void delay_config(void)
{
	SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;		//時鐘源爲系統時鐘168MHz
	SysTick->LOAD = 167;					//重載值爲168-1,每1us溢出一次
}

void delay_ms(vu32 nTime)
{
	nTime *= 1000;
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;		//使能SysTick,開始計數
	while(nTime--){
		while((SysTick->CTRL&0X010000) == 0);		//等待COUNTFLAG標誌位置1
	}
	SysTick->CTRL &= (~SysTick_CTRL_ENABLE_Msk);		//失能SysTick,停止計數
}

void delay_us(vu32 nTime)
{
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
	while(nTime--){
		while((SysTick->CTRL&0X010000) == 0);
	}
	SysTick->CTRL &= (~SysTick_CTRL_ENABLE_Msk);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章