2011年4月9日 星期六

SYSTEM Tick , WDT OSC , Clock Out (1/2)SYSTEM Tick


這次範例程式 包含 System Tick Timer設定, WDT osc設定以及 clock out 設定

這篇先提 System tick.

簡言之 System tick timer 是一個24bits 的 counter,
其參考 clock 為 system clock 或是 1/2 system clock (由SYST_CSR Bit2 設定)
每一個參考 clock 會讓 SYST_CVR 減 1,  SYST_CVR為0時 可由 SYST_CSR Bit.1 TICKINT決定是否要產生中斷.(亦可polling方式檢查 SYST_CSR Bit.16是否為1).
當SYST_CVR為0時的下一個clock edge會自動重載 SYST_RVR到 SYST_CVR中,並繼續參考每一個clock count遞減. 如此重複運作.


SYSTEM TICK

中斷程式,


void SysTick_Handler(void)
{
  TimeTick++;
}




設定system tick 產生中斷以及中斷發生間隔


static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
                                                              
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}




上圖 SYST_CSR Bit.2 CLKSOURCE 決定 system tick timer clock 來源.
假設你現在系統system clock 為48MHz , 
上面 SysTick_Config 中



#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */
#define SysTick_CTRL_CLKSOURCE_Msk (1ul << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */

SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk; 



所以 system tick timer clock = system clock = 48MHz,
以這個sample 中,
 SysTick_Config( SysTick->CALIB + 1 ); 傳入值為 480000 (count數)

所以中斷進入間隔為    480000個clock count時間
= 480000x clock(48MHz)
= 480000/48M
= 1/100
= 10 ms

因此每10ms 進入 SysTick_Handler 中斷程式中一次.
每次   TimeTick++; 就表示10ms

你需要的 time range ,可抓取 TimeTick差來判定



void delaySysTick(uint32_t tick)
{
uint32_t timetick;

timetick = TimeTick;
while ((TimeTick - timetick) < tick) __WFI();
}






for system tick timer,wdt osc. , clock out 參考範例請至此下載  Download

下一篇:

SYSTEM Tick , WDT OSC , Clock Out (2/2)Clock out,WDT OSC

0 留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...