[讨论] 关于TM4C123GXL的时钟

longrejoy   2014-10-11 21:13 楼主
我在用TI的EK-TM4C123GXL时候发现,datasheet等一切官方资料显示的都是在
SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
语句后系统时钟被配置成50MHz,此时用函数SysCtlClockGet()返回的值也是50M。
但是我使用函数SysCtlDelay(SysCtlClockGet()),从理论上说应该是延时3s,但是我用示波器测下来延时了3.34s
利用延时公式反推得到的时钟为45MHz。我又试了SysCtlDelay(50000000),还是一样的情况。
请问有人知道这是什么情况造成的?是TI的疏忽吗?
我测了SYSCTL_SYSDIV_4,实际45M,不符合声明
SYSCTL_SYSDIV_5,实际是40M,符合声明
SYSCTL_SYSDIV_3,实际是60M,不符合声明

回复评论 (10)

你可以改用ROM_SysCtlDelay()會比較準確些. 這並不是System Clock的問題.而是ROM存取可以在一個Clock完成. flash則需要好幾個Clock.所以直接使用TI存放在ROM裡面的Library, 可以避掉這個問題.
但是如果你需要精確的Delay time. 建議使用SysTick或是Timer.
点赞  2014-10-12 20:44
引用: Mikehuang822 发表于 2014-10-12 20:44
你可以改用ROM_SysCtlDelay()會比較準確些. 這並不是System Clock的問題.而是ROM存取可以在一個Clock完成.  ...

ROM_SysCtlDelay()我试过了,问题一样,所以我现在改用SYSCTL_SYSDIV_5,保证一致,也能保证延时的准确性。
我现在就是很好奇,芯片工作的系统时钟是什么,比如SYSCTL_SYSDIV_4时候是它声称的50MHz呢?还是实测的45MHz呢?这有什么办法测试吗?
点赞  2014-10-13 07:43
就像 2 楼所说的,延时要精确的话还是用定时器比较好。这个问题我之前也有遇到过,当时不需要太精确的延时,也就没有深究下去。一般来讲 CLK 的时钟应该是设置的 50Mhz,你测试延时用的应该是 IO 翻转的方法,可能会有指令执行的情况没有考虑进去。
点赞  2014-10-13 11:06
就像 2 楼所说的,延时要精确的话还是用定时器比较好。这个问题我之前也有遇到过,当时不需要太精确的延时,也就没有深究下去。一般来讲 CLK 的时钟应该是设置的 50Mhz,你测试延时用的应该是 IO 翻转的方法,可能会有指令执行的情况没有考虑进去。
点赞  2014-10-13 11:07
你的延时是怎么测试的?我在使用过程中没有遇到你所描述的这么大的误差,基本上还是比较准确的
点赞  2014-10-14 23:49
引用: Study_Stellaris 发表于 2014-10-13 11:06
就像 2 楼所说的,延时要精确的话还是用定时器比较好。这个问题我之前也有遇到过,当时不需要太精确的延时 ...

我确实用的IO翻转,但是一条翻转指令淹没在3.33s的延时里应该能忽略不计吧?而且同样的办法测试SYSCTL_SYSDIV_5,实际是40M,符合声明啊
点赞  2014-10-15 14:10
引用: azhiking 发表于 2014-10-14 23:49
你的延时是怎么测试的?我在使用过程中没有遇到你所描述的这么大的误差,基本上还是比较准确的

IO翻转加延时
点赞  2014-10-15 14:10
你可以參考一下TI網站論壇關於這個問題的描述 : 我想看完後你大概就能了解誤差大是因為flash的影響.

http://e2e.ti.com/support/microc ... f/908/t/256106.aspx

如果想測試 Launchpad 的System Clock, 也可以採用你的測試方法, 只不過改用SysTick(計數一次是一個Clock), 假設我設定System clock為 80MHz. 那麼SysTick 計數一次為12.5ns, 使用IO翻轉測試, 不過考慮IO翻轉時間的影響, 加長SysTick delay的時間. 例如500ms. 再用 LA 量測 IO端口是否為500ms翻轉一次, 如此就可以推算System clock是否為 80MHz了.
点赞  2014-10-15 22:05
你可以參考一下TI的論壇 :
http://e2e.ti.com/support/microc ... f/908/t/256106.aspx
看完後我想你應該就瞭解這是Flash的影響.

想測試System Clock, 還是可以用你的方法, 只不過改為SysTick來做Delay, 假設System clock是80MHz,那麼SysTick一個計數是12.5ns, 但是考慮IO翻轉的影響, 把SysTick延時加長,例如設為500ms, 再測量IO口, 就可推算出來了.

改用SysTick是因為我們能確定SysTick計數一次是一個Clock, 而用SysCtlDelay()則無法確定.
点赞  2014-10-15 22:23
你可以參考一下TI的論壇 :
http://e2e.ti.com/support/microc ... f/908/t/256106.aspx
看完後我想你應該就瞭解這是Flash的影響.

想測試System Clock, 還是可以用你的方法, 只不過改為SysTick來做Delay, 假設System clock是80MHz,那麼SysTick一個計數是12.5ns, 但是考慮IO翻轉的影響, 把SysTick延時加長,例如設為500ms, 再測量IO口, 就可推算出來了.

改用SysTick是因為我們能確定SysTick計數一次是一個Clock, 而用SysCtlDelay()則無法確定.  

点赞  2014-10-15 22:24
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复