SysTick_Init()函數(shù)
SysTick_Init 函數(shù)代碼如下:
/*************************************************************************
* 函 數(shù) 名 : SysTick_Init
* 函數(shù)功能 : SysTick 初始化,SYSTICK 的時(shí)鐘固定為 AHB 時(shí)鐘的 1/8
* 輸 入 : SYSCLK:系統(tǒng)時(shí)鐘頻率
* 輸 出 : 無(wú)
**************************************************************************/
void SysTick_Init(u8 SYSCLK)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
fac_us=SYSCLK/8; //SYSCLK的8分頻 保存1us所需的計(jì)數(shù)次數(shù)
fac_ms=(u16)fac_us*1000; //每個(gè) ms 需要的 systick 時(shí)鐘數(shù)
}
SysTick_Init 函數(shù)形參 SYSCLK 表示的系統(tǒng)時(shí)鐘大小,默認(rèn)配置我們使用的系統(tǒng)時(shí)鐘是 72M,所以調(diào)用這個(gè)函數(shù)時(shí),形參值即為 72。函數(shù)內(nèi)部調(diào)用了一個(gè)庫(kù)函數(shù) SysTick_CLKSourceConfig,此函數(shù)用來(lái)對(duì) SysTick 定時(shí)器時(shí)鐘的選擇,我們使用的SysTick定時(shí)器時(shí)鐘是系統(tǒng)時(shí)鐘的8 頻 ,所以參數(shù)是SysTick_CLKSource_HCLK_Div8。如果使用系統(tǒng)時(shí)鐘作為 SysTick 定時(shí)器時(shí)鐘,那么參數(shù)即為 SysTick_CLKSource_HCLK。這個(gè)函數(shù)在 misc.c 庫(kù)文件內(nèi),如何查找我們前面介紹過(guò)方法。
下面的兩條語(yǔ)句是用來(lái)求取SysTick定時(shí)器在1us時(shí)間內(nèi)和1ms時(shí)間內(nèi)的計(jì)數(shù)次數(shù)。
delay_us()函數(shù)
delay_us 函數(shù)代碼如下:
/**********************************************************************
* 函 數(shù) 名 : delay_us
* 函數(shù)功能 : us 延時(shí),
* 輸 入 : nus:要延時(shí)的 us 數(shù)
注 意 :nus 的 值 , 不 要 大 于 798915us( 最 大 值 即
2^24/fac_us@fac_us=21)
* 輸 出 : 無(wú)
**********************************************************************/
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //時(shí)間加載
SysTick->VAL=0x00; //清空計(jì)數(shù)器
SysTick->CTRL|=0x01 ; //開(kāi)始倒數(shù)
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待時(shí)間到達(dá)
SysTick->CTRL&=~0x01; //關(guān)閉計(jì)數(shù)器
SysTick->VAL =0X00; //清空計(jì)數(shù)器
}
①將需要延時(shí)多少 us 的計(jì)數(shù)值加載到 SysTick 的 LOAD 寄存器中,fac_us值是延時(shí) 1us 所需的計(jì)數(shù)值。
②清空當(dāng)前計(jì)數(shù)值寄存器 VAL。
③打開(kāi) SysTick 定時(shí)器,定時(shí)器開(kāi)始向下遞減計(jì)數(shù)。
④CTRL 寄存器的第 16 位是 SysTick 遞減到 0 的標(biāo)志位,如果遞減到 0,此為置 1,通過(guò)讀取該位來(lái)判斷延時(shí)是否完成,從而退出 while 循環(huán)。
⑤關(guān)閉 SysTick 定時(shí)器。
⑥清空當(dāng)前計(jì)數(shù)值寄存器 VAL。
delay_ms()函數(shù)
delay_ms 函數(shù)代碼如下:
/*************************************************************
* 函 數(shù) 名 : delay_ms
* 函數(shù)功能 : ms 延時(shí),
* 輸 入 : nms:要延時(shí)的 ms 數(shù)
注意:nms 的值,SysTick->LOAD 為 24 位寄存器,
不要大于 0xffffff*8*1000/SYSCLK
對(duì) 72M 條件下,nms<=1864ms
* 輸 出 : 無(wú)
**************************************************************/
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms; // 時(shí) 間 加 載
(SysTick->LOAD 為 24bit)
SysTick->VAL =0x00; //清空計(jì)數(shù)器
SysTick->CTRL|=0x01 ; //開(kāi)始倒數(shù)
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待時(shí)間到達(dá)
SysTick->CTRL&=~0x01; //關(guān)閉計(jì)數(shù)器
SysTick->VAL =0X00; //清空計(jì)數(shù)器
}
此函數(shù)功能與 delay_us 基本一樣,只不過(guò)這里是延時(shí) ms。要注意的是,SysTick 定 時(shí) 器 是 24 位 的 , 其 計(jì) 數(shù) 最 大 值 為 0xffffff , 時(shí) 間 為nms<=0xffffff*8*1000/SYSCLK,SYSCLK 是系統(tǒng)時(shí)鐘為 72M,所以最大延時(shí)為1864ms。如果需要延時(shí)大于 1.864S,可以調(diào)用多個(gè) delay_ms 函數(shù)即可。
主函數(shù)
在 main.c 文件中前面引入了工程中所需的頭文件,可以打開(kāi)工程查看,這里我們主要看下 main 函數(shù),代碼如下:
/**************************************************************
* 函 數(shù) 名 : main
* 函數(shù)功能 : 主函數(shù)
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
***************************************************************/
int main()
{
SysTick_Init(72);
LED_Init();
while(1)
{
led1=0;
led2=1;
delay_ms(500); //精確延時(shí) 500ms
led1=1;
led2=0;
delay_ms(500); //精確延時(shí) 500ms
}
}
主函數(shù)實(shí)現(xiàn)的功能比較簡(jiǎn)單,首先對(duì) SysTick 定時(shí)器進(jìn)行初始化配置,選擇系統(tǒng)時(shí)鐘 8 分頻作為 SysTick 的時(shí)鐘,然后初始化 LED,這個(gè)初始化過(guò)程前面已經(jīng)介紹過(guò),大家也可以進(jìn)入這個(gè)函數(shù)內(nèi)查看。最后進(jìn)入 while 循環(huán)語(yǔ)句,對(duì) PC0和 PC1 管腳進(jìn)行位操作,里面也調(diào)用了 delay_ms 延時(shí)函數(shù),這時(shí)候的延時(shí)是非常精確的。
將工程程序編譯下載到開(kāi)發(fā)板內(nèi), 可以看到 LED 模塊的 2 個(gè)指示燈實(shí)現(xiàn)了流水燈效果。
-
led
+關(guān)注
關(guān)注
242文章
23141瀏覽量
658527 -
流水燈
+關(guān)注
關(guān)注
21文章
432瀏覽量
59637 -
Systick
+關(guān)注
關(guān)注
0文章
62瀏覽量
13045
原文標(biāo)題:STM32實(shí)例-SysTick實(shí)現(xiàn)2個(gè)LED流水燈效果
文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論