久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > LM3S9b96 系統延時和計數延時

LM3S9b96 系統延時和計數延時

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

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

本文引用地址:http://cqxgywz.com/article/201611/317005.htm2. 計數延時:粗略延時方法

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"

/* 用于調試 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); // 設置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
*/
}
}

系統時鐘設置為16M,用示波器測得兩種延時方法的時間:
提示:在系統時鐘為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) 計數延時時間與系統時鐘頻率有關,如果用PLL將系統時鐘設置成50M,其延時時間變短。
2)系統延時時間與系統時鐘頻率無關,即使將用PLL將系統時鐘設置成50M,其延時時間不變。
系統時鐘16M50M
計數延時:Delay(0xfff);2.5ms819us
系統延時:SysCtlDelay(SysCtlClockGet() / 3000);1ms1ms

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

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

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




評論


技術專區

關閉