針對對象:STM32F407ZGT6
簡介:
CM3與CM4包含一個系統計數器SysTick,是一個24位倒計數定時器,當計數到0 時,將從RELOAD寄存器中自動重裝載定時初值,只要把它在SysTick->CTRL中的使能位清楚,則一直存在。
寄存器介紹:
對應代碼位於core_cm4.h中
typedef struct
{
__IO uint32_t CTRL;
__IO uint32_t LOAD;
__IO uint32_t VAL;
__IO uint32_t CALIB;
}SysTick_Type
SysTick控制及狀態寄存器(0xE000_E010):
該寄存器第0位:表示SysTick使能位,0表示關;1表示開;SysTick_CTRL_ENABLE_Mask;
第1位:表示SysTIck中斷使能位,0,表示關閉中斷;1表示打開中斷;SysTick_CTRL_TICKINT_Mask
第2位:表示時鐘源選擇位,0,表示HCLK/8;1表示HCLK作爲時鐘源;SysTick_CTRL_SOURCE_Mask;
第16位:表示計數比較標誌,如果上次讀取本寄存器,計算到了0,則該位置1,如果讀取該位,該位將自動清零。
SysTick的LOAD寄存器:
爲遞減計數,是24位寄存器,最大值爲0xFFFFFF;
SysTick的VAL寄存器:
24位寄存器,讀取時返回當前計數值,寫它則使其清零,同時會清零CTRL寄存器中的COUNTFLAG標誌。
實例程序:
#define SYSCLK 168
void delay_us(uint32_t nus) //用於延時微妙級時間
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
static u8 fac_us = SYSCLK/8;
uint32_t midtime;
SysTick->LOAD = nus*fac_us; //時間加載
SysTick->VAL = 0x00; //清空計數器
do
{
midtime = SysTick->CTRL;
}
while((midtime&0x01)&&!(midtime&(1<<16)));
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Mask;
SysTick->VAL = 0x00;
}