这两天搞时钟,一直没懂系统时钟频率是怎么算出来的,
想给板子写个秒,毫秒,微妙的延时函数,但写出来误差太大,不知如何得到精准延时!!!
请看看这个程序问题在哪里!!!
时钟设置如下:
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 );
}
}