在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 1個(gè)定時(shí)器多處復(fù)用的問(wèn)題

            1個(gè)定時(shí)器多處復(fù)用的問(wèn)題

            作者: 時(shí)間:2016-11-10 來(lái)源:網(wǎng)絡(luò) 收藏

            問(wèn)題: 在一個(gè)工程中往往需要用到多個(gè)定時(shí),然而我們采用的CPU一般也只有2,3個(gè)定時(shí)器。顯然是不夠用的,那么應(yīng)該怎么辦呢?

            我想如果使用過(guò)系統(tǒng)的人都會(huì)知道,在系統(tǒng)中有個(gè)時(shí)鐘節(jié)拍,而多個(gè)任務(wù)都是共同使用這個(gè)時(shí)鐘節(jié)拍進(jìn)行延時(shí)或任務(wù)切換。那么我們是否可以借鑒一下呢?

            本文引用地址:http://www.biyoush.com/article/201611/317373.htm

            下面我們LPC2131舉例說(shuō)明:

            ①.宏定義:

            #define T0_CLOCK_TICK (100)// 1S中計(jì)數(shù)次數(shù)

            #define T0_TASK_NUM (3) // 3個(gè)定時(shí)

            ②. 進(jìn)行定義一個(gè)定時(shí)數(shù)組:

            uint32 T0_Counter[T0_TASK_NUM] ={0};// NUM 為需要使用的定時(shí)個(gè)數(shù)

            ③. 在相應(yīng)的定義一個(gè)數(shù)組來(lái)存儲(chǔ)標(biāo)志位:

            uint8 T0_Mark[T0_TASK_NUM]= {0};// 標(biāo)志位為1表示定時(shí)時(shí)間到

            ④. 編寫(xiě)定時(shí)器初始化函數(shù):

            /**************************************************************************************
            * FunctionName : Timer0Init()
            * Description : 初始化定時(shí)器0
            * EntryParameter : NO
            * ReturnValue : NO
            **************************************************************************************/
            void Timer0Init(void)
            {
            /*Fcclk = Fosc x 4 = 11.0592MHz x 4 = 44.2368MHz
            Fpclk = Fcclk / 4 = 44.2368MHz / 4 = 11.0592MHz*/

            T0TC = 0; // 定時(shí)器設(shè)置為0
            T0PR = 0; // 設(shè)置定時(shí)器0分頻為1分頻
            T0MCR = 0x03;// 匹配通道0匹配中斷并復(fù)位T0TC
            T0MR0 = Fpclk/T0_CLOCK_TICK;// 比較值(1/T0_CLOCK_TICK s定時(shí)值)
            T0TCR = 0x00;// 關(guān)閉定時(shí)器0
            T0Open();// 開(kāi)定時(shí)器

            /* 設(shè)置定時(shí)器0中斷IRQ*/
            VICIntSelect = 0x00; // 所有中斷通道設(shè)置為IRQ中斷
            VICVectCntl4 = 0x20|0x04;// 定時(shí)器0中斷通道分配最高優(yōu)先級(jí)
            VICVectAddr4 = (uint32)IRQ_Time0;// 設(shè)置中斷服務(wù)程序地址向量
            VICIntEnable = 1 << 0x04;// 使能定時(shí)器0中斷
            }

            ⑤. 編寫(xiě)中斷服務(wù)函數(shù):

            /**************************************************************************************
            * FunctionName : IRQ_Time0()
            * Description : 定時(shí)器0中斷服務(wù)
            * EntryParameter : NO
            * ReturnValue : NO
            **************************************************************************************/

            void __irq IRQ_Time0(void) // 中斷服務(wù)函數(shù)

            {

            uint8 i;

            for (i=0; i {
            if (T0_Counter[i] != 0)
            {
            T0_Counter[i]--;// 計(jì)數(shù)值減1
            if (T0_Counter[i] == 0)
            {
            T0_SetMark(i);// 相應(yīng)標(biāo)志位置1
            }
            }
            }

            T0IR = 0x01;// 清除中斷標(biāo)志
            VICVectAddr = 0x00;// 通知VIC中斷處理結(jié)束

            }

            ⑥. 編寫(xiě)標(biāo)志位置位函數(shù):

            /**************************************************************************************
            * FunctionName : T0_SetMark()
            * Description : 設(shè)置相應(yīng)標(biāo)準(zhǔn)位
            * EntryParameter : NO
            * ReturnValue : NO
            **************************************************************************************/
            void T0_SetMark(uint8 num)
            {
            switch (num)
            {
            case 0: T0_Mark[0] = 1; break;// 標(biāo)志位置位
            case 1: T0_Mark[1] = 1; break;//
            case 2: T0_Mark[2] = 1; break;//

            default: break;
            }
            }

            ⑦. 編寫(xiě)相應(yīng)的函數(shù),在需要使用的函數(shù)中設(shè)定計(jì)數(shù)時(shí)間:

            voidFunction1(void)

            {

            T0_Mark[0] = 0; // 清除標(biāo)志位

            T0_Counter[0] = 100;// 1s計(jì)數(shù)器100次

            while (1)

            {

            if (T0_Mark[0] == 1)// 判斷時(shí)間是否到

            {

            T0_Mark[0] = 0;// 清除標(biāo)志

            ...

            }

            }

            }

            ⑧. 編寫(xiě)其他函數(shù),按照以上方法。

            注意事項(xiàng):

            ①. 可以根據(jù)具體需要更改計(jì)數(shù)個(gè)數(shù)。

            ②. 定時(shí)器計(jì)數(shù)1S的此時(shí)可以根據(jù)具體需要設(shè)定,如果設(shè)定計(jì)數(shù)此時(shí)太多,CPU的效率會(huì)降低,但是精確度會(huì)高一下;反正精確度低,但是CUP效率會(huì)高一些。



            關(guān)鍵詞: 定時(shí)器多處復(fù)

            評(píng)論


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

            關(guān)閉