<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          1個定時器多處復(fù)用的問題

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

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

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

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

          下面我們LPC2131舉例說明:

          ①.宏定義:

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

          #define T0_TASK_NUM (3) // 3個定時

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

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

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

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

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

          /**************************************************************************************
          * FunctionName : Timer0Init()
          * Description : 初始化定時器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è)置為0
          T0PR = 0; // 設(shè)置定時器0分頻為1分頻
          T0MCR = 0x03;// 匹配通道0匹配中斷并復(fù)位T0TC
          T0MR0 = Fpclk/T0_CLOCK_TICK;// 比較值(1/T0_CLOCK_TICK s定時值)
          T0TCR = 0x00;// 關(guān)閉定時器0
          T0Open();// 開定時器

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

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

          /**************************************************************************************
          * FunctionName : IRQ_Time0()
          * Description : 定時器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]--;// 計數(shù)值減1
          if (T0_Counter[i] == 0)
          {
          T0_SetMark(i);// 相應(yīng)標(biāo)志位置1
          }
          }
          }

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

          }

          ⑥. 編寫標(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;
          }
          }

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

          voidFunction1(void)

          {

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

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

          while (1)

          {

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

          {

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

          ...

          }

          }

          }

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

          注意事項:

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

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



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

          評論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();