TI中文支持网
TI专业的中文技术问题搜集分享网站

关于SysCtlDelay函数的问题

我使用的板子是TIVA TM4C123GH6PM。

SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);这是时钟频率的配置,80MHZ。

然后我要实现延时,SysCtlDelay(20000000/3);   我计算的延时时间应该是(3*20000000/3)/80000000=0.25s,可是实际测量却是0.5s。

然后我将时钟频率改成了40MHZ.     SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);

SysCtlDelay(20000000/3);  发现延时是0.5s这个结果是对的。请问这是什么原因呢,我猜测会不会是因为,芯片内部Flash的读取频率最大只能达到40MHZ,当工作频率大于40MHz时,通过预取两个字的指令来达到80MHZ的运行主频。但是,当遇到SysCtlDelay函数这种短跳转时这个特性并不能很好的工作,每次都需要读取指令,所以时间就延长了

请问大家是这样吗?

xyz549040622:

实际测试了一下,超过40Mhz的话,还真和楼主说的一样,一直没注意这个问题。原因也大概同意楼主的。

xyz549040622:

SysCtlDelay这个函数以前用过,测试是没有问题的,可是用最新的库版本测试,和楼主的结果一模一样。果断抛弃驱动库,用ROM_SysCtlDelay测试,是没有问题的,倾向于最新的驱动库的问题,或者其他配置问题。

xyz549040622:

以前旧版本的库中测试,SysCtlDelay()是没有问题的,在这个库中经网友测试,主频超过40MHZ的话,实际延时是理论的2倍,用ROM_SysCtlDelay()正常。

SysCtlDelay(SysCtlClockGet()/3)正好是1s钟要想延时1/10s,也就是100ms,参数是SysCtlDelay(SysCtlClockGet()/10/3)要想延时1/100s,也就是10ms,参数是SysCtlDelay(SysCtlClockGet()/100/3)最新的库TivaWare_C_Series-2.1.4.178中,主频超过40MHZ的话,用驱动库,实际延时是理论的2倍,用ROM_SysCtlDelay()是没有任何问题的。

user5935664:

回复 xyz549040622:

那看来大概是库的问题了,谢谢解答!

赞(0)
未经允许不得转载:TI中文支持网 » 关于SysCtlDelay函数的问题
分享到: 更多 (0)