新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM9基礎教程lessen2—定時器

        ARM9基礎教程lessen2—定時器

        作者: 時間:2016-11-24 來源:網絡 收藏


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

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

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

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

        ♥ 實驗內容
        使用定時器延時方式控制YX-AIO嵌入式綜合創新設計平臺上的蜂鳴器報警。

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

        源代碼:
        1. voidDelayMS(U32dly)
        2. {
        3. U32 time_val;
        4. rTCFG0 = 3; //配置定時器0,1的預分頻值
        5. rTCFG1 = 0<<4; //配置定時器1分頻值
        6. time_val = PCLK/ (3+1) / 2 / 1000 - 1; // 1ms = PCLK / prescaler / divider / 1000
        7. rTCNTB1 = time_val; //計數緩存寄存器
        8. rTCMPB1 = time_val>>1; // 50%
        9. rTCON &= ~(0xf<<8); //手動更新位且配置反相器位(開/關)
        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 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 莫力| 武城县| 无极县| 五常市| 浙江省| 容城县| 临高县| 新乡市| 平定县| 广东省| 昭觉县| 精河县| 黄浦区| 会同县| 卢氏县| 瑞安市| 云梦县| 仙桃市| 梅河口市| 红安县| 金沙县| 大埔县| 江西省| 富裕县| 三台县| 大同县| 乌海市| 邵阳市| 呼和浩特市| 玉环县| 大关县| 北票市| 温宿县| 界首市| 云林县| 阿城市| 丹江口市| 拉孜县| 将乐县| 布拖县| 秦安县|