這次範例程式 包含 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
下一篇:
0 留言:
張貼留言