1. 程式人生 > >STM32-嵌入式-04-systick系統定時器

STM32-嵌入式-04-systick系統定時器

systick系統定時器

系統定時器存在核心中,是24位的定時器,只能向下遞減,巢狀在NVIC中

 

counter 在時鐘的驅動下 在reload的初值開始向下遞減計時到0,產生中斷置位標誌然後又從reload值開始重新遞減計數,迴圈

定時時間計算

t=reload*(1/clk)

clk=72M時,t=72*(1/72m)=1us

clk=72M時,t=72000*(1/72m)=1ms

clk=72M時,t=72000000*(1/72m)=1s

1s=1000MS =1000 000US=1000 000 000NS

sysTick屬於核心中的外設,他的中斷優先順序和外設的中斷優先順序相比,哪個高?

sysTick中斷優先順序配置的是scb->shprx暫存器

而外設的中斷配置的是NVIC->iprx,有優先順序分組和搶佔優先順序和子優先順序的說法。

中斷優先順序在核心外設同樣適用。

systick的使能函式:

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
//判斷tick的值是否大於2^24,如果大於,不符合規則
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);  
//初始化reload暫存器的值                                                                    
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      
//配置中斷優先順序,配置為15,預設為最低優先順序  
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  
//初始化counter的值為0
  SysTick->VAL   = 0;                                         
//配置systick的時鐘為72M
//使能中斷
//使能systick
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                   SysTick_CTRL_TICKINT_Msk   | 
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}

編寫微秒延時函式

void SysTick_Delay_us(uint32_t us)
{
	uint32_t i;
	SysTick_Config(72);
	
	for(i=0;i<us;i++)
	{
		//當計數器的值時間到了後,CTRL暫存器位16會置1
		while(!((SysTick->CTRL)&(1<<16)));
	}
	SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}

利用中斷來進行延時

void SysTick_Init(void)
{
	if(SysTick_Config(SystemCoreClock/100000))
		while(1);
}
void Delay_ms(__IO u32 nTime)
{
	uint32_t TimingDelay;
	TimingDelay = nTime;
	while(TimingDelay!=0)
		TimingDelay--;
}