1. 程式人生 > >ok6410的定時器0 測試程式

ok6410的定時器0 測試程式

1 #include "def.h"
  2 #include "gpio.h"
  3 #include "library.h"
  4 #include "system.h"
  5 #include "timer.h"
  6 #include "intc.h"
  7 #include "sfr6410.h"
  8 
  9 /*
 10 
 11     此函式的功能僅僅在於測試TIMER0的定時功能,以最簡單的形式展示 “初始化定時器以及相關中斷”
 12     上述標頭檔案在國嵌資料中有提供。
 13     
 14     
 15     實現效果是:定時地在 LED1, LED2 , LED3之間輪轉:
16 */ 17 #define GPIO ((volatile oGPIO_REGS*)GPIO_BASE) 18 19 extern void SYSC_GetClkInform(void); 20 void LedInit(void); 21 void LedPlay(u8 l_num); 22 void Delay(int time); 23 void TimerInit(u8 t_num, int ms); 24 25 26 int main(void) 27 { 28 //使能中斷向量控制器: 29
SYSTEM_EnableVIC(); 30 //使能IRQ模式中斷: 31 SYSTEM_EnableIRQ(); 32 //得到g_PCLK時鐘: 33 SYSC_GetClkInform(); 34 //初始化中斷: 35 INTC_Init(); 36 //定時器初始化: 37 TimerInit(0 , 500); 38 //Led初始化: 39 LedInit(); 40 41 while(1); 42 } 43 //定時器服務例程 44 void __irq Isr_Timer(void
) 45 { 46 // 1. 清除對應的未決位: 47 u32 uConValue; 48 uConValue = Inp32(rTINT_CSTAT); 49 uConValue |= (0x1<<(5 + 1)); 50 Outp32(rTINT_CSTAT,uConValue); 51 // 2. 需要處理的東西/////////////////// 52 LedPlay(1); 53 Delay(100); 54 LedPlay(2); 55 Delay(100); 56 LedPlay(3); 57 58 // 3. 必須清除中斷服務執行地址,為下次中斷準備: 59 Outp32(rVIC0ADDR,0); 60 61 } 62 63 //定時器初始化; 64 void TimerInit(u8 t_num, int ms) 65 { 66 u32 uConValue; 67 // 1. 對中斷進行配置前最好先關閉定時器: 68 Outp32(rTCON,0); 69 // 2. 對定時器配置定時器所採用的頻率,最後得到2048的分頻: 70 71 //第一步:配置precaler0為127分頻: 72 uConValue = Inp32(rTCFG0); 73 uConValue &= ~0xff; 74 uConValue |= 0x7f; 75 Outp32(rTCFG0, uConValue); 76 //第二步:配置二級分頻為16;共分頻2048: 77 uConValue = Inp32(rTCFG1); 78 uConValue &= ~0xf; 79 uConValue |= 0x4; 80 Outp32(rTCFG1,uConValue); 81 // 3. 設定定時器所需要的計算值: 82 83 // 可以算得1微秒的 計數值 為g_PCLK/2048/1000 設為500毫秒計算值: 84 if(t_num == 1) 85 Outp32(rTCNTB1,((g_PCLK>>11)/1000) * ms); 86 else if(t_num == 0) 87 Outp32(rTCNTB0,((g_PCLK>>11)/1000) * ms ); 88 // 4. 對狀態位寫1,清除當前的未決中斷: 89 uConValue = Inp32(rTINT_CSTAT); 90 uConValue |= (0x1<<(5+ t_num)); 91 Outp32(rTINT_CSTAT,uConValue); 92 93 94 95 // 5. 註冊安裝定時器的中斷函式: 每個暫存器存有4個位元組的地址所以乘以4 96 if(t_num == 0) 97 Outp32(rVIC0VECTADDR+4*NUM_TIMER0, (u32)Isr_Timer); 98 else if(t_num == 1) 99 Outp32(rVIC0VECTADDR+4*NUM_TIMER1, (u32)Isr_Timer); 100 // 6. 使能定時器的中斷使能位: 101 uConValue = Inp32(rVIC0INTENABLE); 102 uConValue |= (0x1 << NUM_TIMER0) | (0x1 << NUM_TIMER1); 103 Outp32(rVIC0INTENABLE,uConValue); 104 105 106 // 7. 設定使得定時器可以發生中斷: 107 uConValue = Inp32(rTINT_CSTAT); 108 uConValue |= 0x1 << (t_num); 109 Outp32(rTINT_CSTAT,uConValue); 110 111 // 8. 最後使定時器開始計數, 112 uConValue = Inp32(rTCON); 113 //第一步:設定手動裝入定時器的計算緩衝器; 114 uConValue &= ~(0x1f << t_num*8); 115 uConValue |= 0x2 << (t_num * 8); 116 Outp32(rTCON,uConValue); 117 118 //第二步:設定自動裝入,並開啟定時器: 119 uConValue = Inp32(rTCON); 120 uConValue &= ~(0x1f << t_num * 8); 121 uConValue |= 0x9 << (t_num *8); 122 Outp32(rTCON,uConValue); 123 124 } 125 126 //延時函式; 127 void Delay(int time) 128 { 129 int i; 130 for(; time > 0; time--) 131 for(i=0; i < 3000; i++); 132 } 133 134 //led初始化; 135 void LedInit(void) 136 { 137 u32 uConValue; 138 139 uConValue = GPIO->rGPIOMCON; 140 uConValue &= ~(0xf | (0xf<<4) | (0xf<<8) | (0xf<<12)); 141 uConValue |= (0x1 | (0x1 << 4) | (0x1 << 8) | (0x1 << 12)); 142 GPIO->rGPIOMCON = uConValue; 143 144 } 145 //led工作,l_num為什麼值就點著對應的led燈: 146 void LedPlay(u8 l_num) 147 { 148 u32 tmp; 149 tmp = GPIO->rGPIOMDAT; 150 tmp |= 0x1f; 151 tmp &= (~ (1 << (l_num - 1))); 152 GPIO->rGPIOMDAT = tmp; 153 }