×
单片机 > 单片机程序设计 > 详情

LM3S9b96 系统延时和计数延时

发布时间:2020-06-20 发布时间:
|
使用9b96芯片,免不了用到延迟,例如:让LED闪烁。于是,出现延时时间的问题。
下面是两种常见的延时方式:
1. 系统延时:这是9b96芯片的固有的,用其API函数即可搞定,并且定时时间比较精确。

函数原型:
void SysCtlDelay (unsigned long ulCount)
参数:
ulCount 是要执行的延时循环反复的次数。
描述:
该函数提供了一个产生恒定长度延时的方法。它是用用汇编写的,以保持跨越工具链的
延时一致,从而避免了在应用上依据工具链来调节延时的要求。
循环占用3个周期/循环。
返回:
无。

2. 计数延时:粗略延时方法。

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,其延时时间不变。 
 
 系统时钟  16M  50M
 计数延时: Delay(0xfff);  2.5ms  819us
 系统延时: SysCtlDelay(SysCtlClockGet() / 3000);  1ms 1ms 

推荐:系统延时方法更方便些,我们可以将其封装成一个带参函数。

//*****************************************************************************
//
// 精确延时nms
//
//*****************************************************************************

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

 

关键字:LM3S9b96  系统延时  计数延时 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
TQ210天嵌开发板S5PV210 LED闪烁程序C语言代码记录