新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ARM9基礎(chǔ)教程lessen2—定時器

ARM9基礎(chǔ)教程lessen2—定時器

作者: 時間:2016-11-24 來源:網(wǎng)絡(luò) 收藏


♥ 定時器計數(shù)觀察計數(shù)器(TCNTOn)
定時器計數(shù)觀察計數(shù)器保存定時器計數(shù)器值(只讀)。

? S3C2440定時器操作
定時器啟動后,TCNTn開始減一計數(shù),當(dāng)TCNTn 等于TCMPn時,TOUTn 反轉(zhuǎn),TCNTn繼續(xù)減數(shù)。當(dāng)TCNTn= 0 時,TOUTn 再次反轉(zhuǎn),并觸發(fā)中斷(中斷已經(jīng)使能)。若TCON 設(shè)為自動加載,TNCTn/TCMPNn 的值被重裝。

圖中步驟如下:
1、使能自動重載功能。設(shè)置TCNTBn為160,TCMPBn為110。設(shè)置手動更新位且配置反相器位(開/關(guān))。手動更行位將TCNTBn和TCMPBn的值分別給TCNTn和TCMPn寄存器,然后設(shè)置TCNTBn=80和TCMPBn=40,決定下一個重載值;
2、設(shè)置開始位,手動更新位為0,手動更新關(guān)閉且自動重載開啟,定時器開始倒數(shù)計數(shù);
3、當(dāng)TCNTn的值和TCMPn的值相同,TOUTn的邏輯電平從低變高;
4、當(dāng)TCNTn為0,中斷請求生成且TCNTBn的值裝載到一個臨時寄存器中。在下一個定時器周期,TCNTn會用該臨時寄存器的值重載;
5、在中斷服務(wù)程序中,TCNTBn和TCMPBn為下一個周期分別設(shè)置為80和60;
6、當(dāng)TCNTn的值和TCMPn的值相同,TOUTn的邏輯電平從低變高;
7、當(dāng)TCNTn為0,TCNTn用TCNTBn的值自動重載,并觸發(fā)中斷請求;
8、在中斷服務(wù)程序中,自動重載和自動請求被設(shè)無效以停止定時器;
10、就算TCNTn為0,因為自動重載被設(shè)為無效,TCNTn不再重載且定時器停止;
11、沒有其他的自動請求生成。

? S3C2440定時器初始化
以定時器0為例,啟動定時器操作步驟大致如下:
1、設(shè)置TCMPB0和TCNTB0寄存器;
2、設(shè)置TCON寄存器,計數(shù)值進行裝載;
3、啟動定時器;
4、計數(shù)器重新被裝載。
  1. void Timer0_init()
  2. {
  3. TCFG0 = 119; //配置定時器0,1的預(yù)分頻值
  4. TCFG1 = 0x03; //配置定時器0分頻值
  5. TCNTB0 = 3125; //計數(shù)緩存寄存器
  6. TCMPB0 = 0; //比較緩存寄存器
  7. TCON |= (1<<1); //手動更新位且配置反相器位(開/關(guān))(手動更行位將TCNTBn和TCMPBn的值分別給TCNTn和TCMPn寄存器)
  8. TCON = 0x09; //定時器使能并自動重載
  9. }
復(fù)制代碼
? 定時器報警實驗
♥ 實驗設(shè)備
硬件: PC機 一臺
YX-AIO嵌入式綜合創(chuàng)新設(shè)計平臺 一臺
ARM9核心板 一塊
軟件: Windows操作系統(tǒng),ADS1.2集成開發(fā)環(huán)境,H-JTAG下載環(huán)境

♥ 實驗內(nèi)容
使用定時器延時方式控制YX-AIO嵌入式綜合創(chuàng)新設(shè)計平臺上的蜂鳴器報警。

♥ 實驗步驟
① 在ADS開發(fā)環(huán)境中使用ARM9_S3C2440工程模版創(chuàng)建一個工程,并將程序代碼添加到該工程;
② 在ADS開發(fā)環(huán)境中編譯鏈接并生成目標文件;
③ 將JTAG下載器連接YX-AIO嵌入式綜合創(chuàng)新設(shè)計平臺,并將該平臺通電;
④ 開啟H-JTAG軟件檢測處理器與NOR-Flash;
⑤ 使用H-JTAG軟件將目標文件(.bin)下載到Y(jié)X-AIO嵌入式綜合創(chuàng)新設(shè)計平臺上;
⑥ 復(fù)位平臺。

源代碼:
  1. voidDelayMS(U32dly)
  2. {
  3. U32 time_val;
  4. rTCFG0 = 3; //配置定時器0,1的預(yù)分頻值
  5. rTCFG1 = 0<<4; //配置定時器1分頻值
  6. time_val = PCLK/ (3+1) / 2 / 1000 - 1; // 1ms = PCLK / prescaler / divider / 1000
  7. rTCNTB1 = time_val; //計數(shù)緩存寄存器
  8. rTCMPB1 = time_val>>1; // 50%
  9. rTCON &= ~(0xf<<8); //手動更新位且配置反相器位(開/關(guān))
  10. rTCON |= 0xb<<8; //定時器使能并自動重載
  11. rTCON &= ~(2<<8); //clear manual update bit
  12. while(dly--)
  13. {
  14. while(rTCNTO1>=time_val>>1);
  15. while(rTCNTO1>1);
  16. }
  17. }
  18. void Main(void)
  19. {
  20. //----------------添加自己的代碼-------------------
  21. rGPACON &= ~(1<<16);
  22. while (1)
  23. {
  24. rGPADAT |= (1<<16);
  25. DelayMS(1000);
  26. rGPADAT &= ~(1<<16);
  27. DelayMS(500);
  28. }
  29. }


上一頁 1 2 下一頁

關(guān)鍵詞: ARM9基礎(chǔ)教程l定時

評論


技術(shù)專區(qū)

關(guān)閉