在嵌入式開發中,時常會遇到延時函數的調用,比如在協議的制定時需考慮到各個節點之間的數據交互沖突情況。對於51系列單片機由於每條指令執行所耗費的時間可知,因此精確延時較為容易實現。在ARM7系列的處理器中由於指令的執行采用流水線技術,加上應用層程序的編寫方面編譯器所解析的機器周期未知,因此難以實現精確延時。一般應用中往往使用定時器解決此類問題。ARM7處理器中除定時器模塊之外,還有周期性間隔定時器模塊。周期性間隔定時器一般為操作系統的調度程序提供時間間隔中斷,PIT的設計提供了程序時間管理上的精確度。圖示為周期性間隔定時器的方框圖。 PIT有一個可編程的溢出計數器,它具有溢出後自動復位的特性。PIT基於兩個計數器:一個20位的CPIV計數器及一個12位的PICNT計數器。兩個計數器的時鐘都是主時鐘的1/16。通過PIT_MR模式寄存器的PITIEN位設置中斷使能後,CPIV計數器從0開始計數,一直到模式寄存器PIT_MR的PIV域所定義的溢出數值為止。CPIV計數器溢出後立即復位為0,同時PICNT寄存器累加,狀態寄存器PIT_SR的PITS被置位從而觸發中斷。 通過讀取周期性間隔數值寄存器PIT_PIVR獲得CPIV和PICNT的數值後,溢出計數器(PICNT)復位,PITS清零,從而確認中斷。繼而使得周期性間隔定時器中斷模式繼續進行。周期性間隔定時器的使能與關閉通過寄存器PIT_MR的PITEN位實現。注意,只有在CPIV為0時對PITEN的操作才有效。 以下為使用周期性間隔定時器模塊產生定時中斷函數。 [html] www.2cto.com void ClockHandler(void) __irq { Display_Received++; *AT91C_AIC_EOICR = *AT91C_PITC_PIVR; //Acknowledge Interrupt void PIT_Init(void) { *AT91C_PITC_PIMR = AT91C_PITC_PITIEN | AT91C_PITC_PITEN | 784741;<span style="white-space:pre"> </span>//PIT使能及定時周期配置 AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_SYS,1,AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE,(void (*)())ClockHandler);//中斷觸發方式及函數入口地址 AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_SYS); //Enable Interrupt }