久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 淺談STM32F10X芯片SysTick系統時鐘定時器

淺談STM32F10X芯片SysTick系統時鐘定時器

作者: 時間:2016-11-11 來源:網絡 收藏
如題,正文如下:

1、介紹

實現Cortex-M3系統定時器SysTick的配置,需要具備以下知識:Cortex-M3系統定時器默認頻率是HCLK的8分頻(如下圖所示),因此需要會RCC時鐘的配置;然后配置SysTick系統定時器;編寫SysTick中斷處理函數。

本文引用地址:http://cqxgywz.com/article/201611/316904.htm

系統時鐘及系統定時器時鐘(詳見手冊)

2、寄存器描述

lSysTick控制及狀態寄存器STK_CTRL

lSysTick重裝載數值寄存器STK_LOAD

lSysTick當前數值寄存器STK_VAL

lSysTick校準數值寄存器STK_CALIB

與SysTick相關的固件庫函數有以下幾個:

l配置SysTick系統時鐘:SysTick_CLKSourceConfig();

l設置SysTick重裝值:SysTick_SetReload();

l使能或除能SysTick定時器:SysTick_CounterCmd();

l使能或除能SysTick定時器中斷:SysTick_ITConfig();

l獲取SysTick時鐘當前值:SysTick_GetCounter();

l檢測SysTick標志位是否設置:SysTICK_GetFlagStatus();

3、SysTick配置流程

?首先配置RCC:選擇系統時鐘、配置總線時鐘、使能外圍設備時鐘等;

?配置NVIC:選擇中斷優先級組,設置SysTick中斷優先級,使能SysTick中斷通道;

?編寫SysTick中斷處理函數;

?配置SysTick時鐘:

n設置SysTick時鐘源(不需要,默認選擇HCLK的8分頻作為SysTick系統定時器的時鐘源):調用SysTick_CLKSourceConfig()函數;

n設置SysTick時鐘重裝值:調用SysTick_SetReload();

n使能SysTick時鐘中斷(根據具體應用需要):調用SysTick_ITConfig()函數;

?使能SysTick時鐘:調用SysTick_CounterCmd()函數;

然后還可以調用SysTick_GetCounter()函數獲取SysTick系統時鐘計數器的當前值;也可以調用SysTick_GetFlagStatus()函數檢查指定的SysTick標志位是否設置(沒有開啟中斷,通過軟件查詢方式檢查系統定時器是否計數到0)。

SysTick系統定時器的中斷標志位在系統時鐘節拍控制與狀態寄存器CTRL的COUNTFLAG位,該位由定時器計數到0置1,讀取時清零。因此可以調用函數SysTick_GetFlagStatus(SysTick_FLAG_COUNT)來清除COUNTFLAG標志位。

經過測試:不調用SysTick_GetFlagStatus(SysTick_FLAG_COUNT)函數來清除標志位,在每次系統時鐘節拍SysTick在計數為0時,也都能進入中斷處理函數。但程序的嚴密性考慮,最好還是調用該函數。

4、SysTick系統定時器例子

例子1:

/*主函數中配置,這里沒有選擇SysTick的時鐘源,是因為c8芯片已經將該時鐘固化成HCLK的8分頻了*/

SysTick_SetReload(9000);

SysTick_ITConfig(ENABLE);

SysTick_CounterCmd(SysTick_Counter_Enable);

/*中斷處理函數*/

void SysTick_Handler(void)/* 1ms中斷一次*/

{

if(SET == SysTick_GetFlagStatus(SysTick_FLAG_COUNT))/*讀標志位,同時清除標志位*/

{

SysCount++;

if(500 == SysCount)

{

SysCount = 0;

count++;

}

}

}

例子2:

/*主函數配置*/

SysTick_SetReload(9000);

SysTick_ITConfig(ENABLE);

/*延時函數,延時nms */

void Delay(u32 nTime)

{

//開啟SysTick計數器

SysTick_CounterCmd(SysTick_Counter_Enable);

TimingDelay = nTime;

while(TimingDelay != 0);//死等待

//關閉系統滴答

SysTick_CounterCmd(SysTick_Counter_Disable);

//清除SysTick計數器

SysTick_CounterCmd(SysTick_Counter_Clear);

}

/*中斷處理函數*/

void SysTick_Handler(void)

{/*沒有清除標志位,在計數為0時,同樣可以進入中斷處理函數實現TimingDelay自減工作*/

if (TimingDelay != 0x00)

{

TimingDelay--;

}

}



評論


技術專區

關閉