SysCtlDelay(SysCtlClockGet()/3000);是否是1ms
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
SysCtlDelay(SysCtlClockGet()/3000);是否是1ms
你可以在driverlib文件夹下的Sysctl.c文件中,找到SysCtlClockGet()函数的源码,从源码中能看到返回值实际和你的当前系统时钟相关。
之所以有的例程用 SysCtlDelay(SysCtlClockGet()/3000); 来延时1ms,是因为他们使用30k的内部振荡器作为系统时钟。
一个SysCtlDelay里面执行了 3个时钟周期,SysCtlClockGet() 是当前系统运行的时钟速率, 因此这个速度是固定的,就是1ms 可以自己做延时,对一个GPIO口进行翻转,用示波器量下就可以确定了。
SysCtlDelay(SysCtlClockGet()/3000) 这个函数执行的结果就是延时1ms,无论你的系统时钟是多少,当然你的系统时钟是不能低于3K的。
SysCtlClockGet()函数返回的值是系统的频率,也就是1S钟的CLOCK个数,这个个数/1000就是1ms系统时钟的个数,由于SysCtlDelay函数一个循环判断执行需要3个CLOCK时钟,所以系统时钟/3000就表示系统执行1ms的时间。
由此可以看出这个函数执行的结果就是延迟1ms. 在不同的系统时钟下,调用该函数都是延迟1ms.
SysCtlClockSet(SYSCTL_SYSDIV_2 | SYSCTL_USE_PLL | SYSCTL_XTAL_12MHZ | SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2);
while(1)
{
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);//high
SysCtlDelay( (SysCtlClockGet() / 3000) );
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0);//low
SysCtlDelay( (SysCtlClockGet() / 3000) );
}
这边我做了两个尝试。1,改SysCtlDelay( (SysCtlClockGet() / 3000) );为ROM_SysCtlDelay( (SysCtlClockGet() / 3000) );
2改SYSCTL_XTAL_12MHZ;
发现这两个改动都对延时有影响。
所以还是对这个函数有疑惑。新手学习,请多指教
您好,我在用TM4C123GXL 使用如下配置
1、SysCtlClockSetS(SYCTL_SYSDIV_1|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
再用SysCtlClockGet()取频率值的时候是12500000,也就是12.5MHZ,若是改成2分频,返回的就是100000000,即100MHZ,这是为什么啊?
2、还有一个问题是,如果我配置不适用PLL,而是外部晶振16MHZ的话,不分频返回的是16MHZ,这是对的吗?谢谢!!
16MHZ,PLL倍频后就是200MHZ,2分频是后100MHZ应该是对的,至于出现12.5,应该是你16分频后的结果吧,不过TM4C123x系列最大就是80MHZ,你的这个100MHZ只是个单纯的数字,实际应该是80MHZ。至于你说的16MHZ不分频返回的是16,理论上这么算是对的。可是是实际,使用外部晶振的时候,TM4C123x对最小频率好像是有要求的,是20M合适25M来着,这个你具体看看数据手册的说明。