这两天搞时钟,一直没懂系统时钟频率是怎么算出来的,

想给板子写个秒,毫秒,微妙的延时函数,但写出来误差太大,不知如何得到精准延时!!!

请看看这个程序问题在哪里!!!

时钟设置如下:

void clockInit(void)

{

SysCtlLDOSleepSet(SYSCTL_LDO_1_20V);         // 配置PLL前须将LDO设为1.20V

TheSysClock=SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | // 外接25MHz晶振

SYSCTL_OSC_MAIN | // 主振荡器

SYSCTL_USE_PLL | // 系统时钟设置,采用PLL

SYSCTL_CFG_VCO_480), 100000000); // 分频结果为100MHz

 

//TheSysClock = SysCtlClockGet( );            //获取当前的系统时钟频率,该函数只有TM4C123中调用有效,

//在TM4C129中蜸ysCtlClockFreqSet()函数的返回值

 

}

 

/****************************************************************************/

//延时nms

//注意nms的范围

//SysTick->LOAD为24位寄存器为:

//SYSCLK单位为Hz,nms单位为ms

/**************************实现函数********************************************

*函数原型: void delay_ms(u16 nms)

*功  能: 毫秒级延时  延时nms  

*******************************************************************************/

void delay_ms(uint32_t nms)

{        

uint32_t i;

uint32_t temp=0;

for(i=0;i<=nms;i++)

{

SysTickPeriodSet(1000000); 

SysTickEnable();

temp=SysTickValueGet();

if(temp==0)

SysTickDisable();

}

}   

 

//延时nus

//nus为要延时的us.

/**************************实现函数********************************************

*函数原型: void delay_us(u32 nus)

*功  能: 微秒级延时  延时nus  

*******************************************************************************/         

void delay_us(uint32_t nus)

{

uint32_t i;

uint32_t temp=0;

for(i=0;i<=nus;i++)

{

SysTickPeriodSet(1000); 

SysTickEnable();

temp=SysTickValueGet();

if(temp==0)

SysTickDisable();

}

}

/**************************实现函数********************************************

*函数原型: void delay_ns(u32 ns)

*功  能: 秒级延时  延时ns  

*******************************************************************************/

void delay_ns(uint32_t ns)

{

uint32_t i,j;

uint32_t temp=0;

for(i=0;i<=ns;i++)

{

for(j=0;j<=1000;j++)

{

SysTickPeriodSet(1000000); 

SysTickEnable();

temp=SysTickValueGet();

if(temp==0)

SysTickDisable();

}

}

}

//------------------End of File----------------------------

为主函数:

int main(void)

{

jtagWait();

clockInit();

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION );

GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_0|GPIO_PIN_1);

for(;;)

{

GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0, 0xff);

GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_1, 0x00);

delay_ns(1);//延时1s

//SysCtlDelay(TheSysClock/4 );

GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0, 0x00);

GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_1, 0xff);

delay_ns(1);//延时1s

//SysCtlDelay(TheSysClock/4 );

 

}

}