色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > LM3S9b96 系統(tǒng)延時和計數(shù)延時

          LM3S9b96 系統(tǒng)延時和計數(shù)延時

          作者: 時間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
          使用9b96芯片,免不了用到延遲,例如:讓LED閃爍。于是,出現(xiàn)延時時間的問題。
          下面是兩種常見的延時方式:
          1. 系統(tǒng)延時:這是9b96芯片的固有的,用其API函數(shù)即可搞定,并且定時時間比較精確。

          函數(shù)原型:
          void SysCtlDelay (unsigned long ulCount)
          參數(shù):
          ulCount 是要執(zhí)行的延時循環(huán)反復(fù)的次數(shù)。
          描述:
          該函數(shù)提供了一個產(chǎn)生恒定長度延時的方法。它是用用匯編寫的,以保持跨越工具鏈的
          延時一致,從而避免了在應(yīng)用上依據(jù)工具鏈來調(diào)節(jié)延時的要求。
          循環(huán)占用3個周期/循環(huán)。
          返回:
          無。

          本文引用地址:http://cafeforensic.com/article/201611/317005.htm2. 計數(shù)延時:粗略延時方法

          void Delay(unsigned long nCount)
          {
          for(; nCount != 0; nCount--);
          }

          下面是一個LED閃爍的例子:

          #include "inc/hw_memmap.h"
          #include "inc/hw_types.h"
          #include "driverlib/gpio.h"
          #include "driverlib/sysctl.h"

          /* 用于調(diào)試 PF1 <-> LED -----------------------------------------------------*/
          #define LED_PERIPH SYSCTL_PERIPH_GPIOF
          #define LED_PORT GPIO_PORTF_BASE
          #define LED_PIN GPIO_PIN_1
          #define LED_OFF 1 << 1
          #define LED_ON ~(1 << 1) // 低電平點亮LED


          void Delay(unsigned long nCount)
          {
          for(; nCount != 0; nCount--);
          }


          int main(void)
          {
          // Set the clocking to run directly from the crystal.
          SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);

          SysCtlPeripheralEnable(LED_PERIPH); // 使能LED所在的GPIO端口

          GPIOPinTypeGPIOOutput(LED_PORT, LED_PIN); // 設(shè)置LED所在管腳為輸出

          while (1)
          {
          GPIOPinWrite(LED_PORT, LED_PIN, LED_ON); // 點亮LED
          Delay(0xfff); // 實驗測得延時2.5ms
          GPIOPinWrite(LED_PORT, LED_PIN, LED_OFF); // 熄滅LED
          Delay(0xfff); // 實驗測得延時2.5ms

          /*
          GPIOPinWrite(LED_PORT, LED_PIN, LED_ON); // 點亮LED
          SysCtlDelay(SysCtlClockGet() / 3000); // 精確延時1ms
          GPIOPinWrite(LED_PORT, LED_PIN, LED_OFF); // 熄滅LED
          SysCtlDelay(SysCtlClockGet() / 3000); // 精確延時1ms
          */
          }
          }

          系統(tǒng)時鐘設(shè)置為16M,用示波器測得兩種延時方法的時間:
          提示:在系統(tǒng)時鐘為16M的情況下,大家可以直接使用下面延時時間。
          1) SysCtlDelay(SysCtlClockGet() / 3); // 精確延時1000ms
          2) SysCtlDelay(SysCtlClockGet() / 30); // 精確延時100ms
          3) SysCtlDelay(SysCtlClockGet() / 300); // 精確延時10ms
          4) SysCtlDelay(SysCtlClockGet() / 3000); // 精確延時1ms
          5) SysCtlDelay((SysCtlClockGet() / 3000) * 2); // 精確延時2ms
          6) Delay(0xf); // 實驗測得延時11us
          7) Delay(0xff); // 實驗測得延時160.7us
          8) Delay(0xfff); // 實驗測得延時2.5ms
          9) Delay(0xffff); // 實驗測得延時40.94ms
          a) Delay(0xfffff); // 實驗測得延時657.4ms
          b) Delay(0xffffff); // 實驗測得延時10.49s
          重點:1) 計數(shù)延時時間與系統(tǒng)時鐘頻率有關(guān),如果用PLL將系統(tǒng)時鐘設(shè)置成50M,其延時時間變短。
          2)系統(tǒng)延時時間與系統(tǒng)時鐘頻率無關(guān),即使將用PLL將系統(tǒng)時鐘設(shè)置成50M,其延時時間不變。
          系統(tǒng)時鐘16M50M
          計數(shù)延時:Delay(0xfff);2.5ms819us
          系統(tǒng)延時:SysCtlDelay(SysCtlClockGet() / 3000);1ms1ms

          推薦:系統(tǒng)延時方法更方便些,我們可以將其封裝成一個帶參函數(shù)。

          //*****************************************************************************
          //
          // 精確延時nms
          //
          //*****************************************************************************

          void Delay(DWORD nms)
          {
          SysCtlDelay((SysCtlClockGet() / 3000) * nms);
          }




          評論


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

          關(guān)閉