hongli3154 发表于 2013-1-17 20:20:02

51IO翻转速率最大能到多少?

如果超出了范围会出现什么现象?我的实验是IO处在高电平。请大侠指教指教

NJ8888 发表于 2013-1-17 20:25:37

如何超出?

xinfa190 发表于 2013-1-17 20:46:45

stc 1T 系列,22.1184M晶振,全速翻转,C语言,试过,大约1.2MHz

takashiki 发表于 2013-1-17 21:28:25

xinfa190 发表于 2013-1-17 20:46 static/image/common/back.gif
stc 1T 系列,22.1184M晶振,全速翻转,C语言,试过,大约1.2MHz

这个,这个,和理论计算相差非常巨大啊……

这个程序,估计是使用指令翻转最快的了(不考虑时钟输出和PCA):CY=1;
P1_0 = 0;                  // CLR P1.0,4个时钟周期
P1_0 = CY;                // MOV P1.0, C,3个时钟周期
P1_0 = 0;
P1_1 = CY;
...计算得到22.1184M晶振时翻转速率为22.1184/(4+3) = 3.16MHz,差别巨大啊

PCA高速脉冲输出模式中,f =Fosc / (4 * CCAPnL_Value )
则fmax = 22.1184 / 4 = 5.5296MHz

T0、T1的时钟输出模式中:按1T模式,输出频率 = SysClk / (256 - TH0) / 2
fmax = 22.1184 / 1 / 2 = 11.0592MHz

BTW:以上结果均未经过实际验证,仅仅是理论计算,因为我不用STC。不知道实际和理论之间到底有多少差距。

wx85105157 发表于 2013-1-18 00:01:50

试过40Mhz然后2分频输出。。20Mhz,波形已经失真,输出的低电平达不到0V,在1v那样。   手册上给出的IO最大翻转速度为15Mhz,四分频后输出10Mhz,波形还算ok,但是也不是矩形波了,上升沿和下降沿有点圆滑了。而且带负责能力差,用示波器1:10测的。1:1的时候波形就变成正弦波了。

xinfa190 发表于 2013-1-18 10:03:45

takashiki 发表于 2013-1-17 21:28 static/image/common/back.gif
这个,这个,和理论计算相差非常巨大啊……

这个程序,估计是使用指令翻转最快的了(不考虑时钟输出和PC ...

不知道你的代码是不是最快的,我是这么写的
sbitclk=P1^0;
main()
{
while(1)
{
clk=~clk;
}
}
直接翻转IO就不要想了,stm32系列ARM,72MHz主频,类似上面的代码,不到2.5MHZ

takashiki 发表于 2013-1-18 10:10:19

xinfa190 发表于 2013-1-18 10:03 static/image/common/back.gif
不知道你的代码是不是最快的,我是这么写的
sbitclk=P1^0;
main()


嗯,我知道了,你这个的确不是最快的,看来STC官方手册还是没错的。
因为clk=~clk;并不是占用时间最短的指令(4个周期,clk=~clk, clk=1, clk=0都是4个周期,但是clk=CY只要三个周期),while在这里占用了大量的时间,因为需要进行跳转。
测试最大IO速度时一定不能打断程序固有的流程,否则就人为的降低了速度。

72M的STM32是可以达到18MHz的,我测试过,不管是直接对ODR赋值,还是对BSRR赋值,还是通过位带方式,都是18MHz。

Louis_Bright 发表于 2013-1-18 10:40:04

不妨试试:
P1 ^= 0x01;

oufuqiang 发表于 2013-1-18 11:36:12

CPL BIT
有没试过
填满ROM,不用循环

wx85105157 发表于 2013-1-18 11:37:57

Louis_Bright 发表于 2013-1-18 10:40 static/image/common/back.gif
不妨试试:
P1 ^= 0x01;

这条指令2个字节,在stc10,11,12上是4个时钟周期。


最短的是
while:
CPL P1^0   ;2B4T
SJMP while ;2B3T

一共7个时钟周期。35Mhz晶振的时候 IO翻转就有5M,最高也是5M了。

takashiki 发表于 2013-1-18 13:19:04

wx85105157 发表于 2013-1-18 11:37 static/image/common/back.gif
这条指令2个字节,在stc10,11,12上是4个时钟周期。




算法有误哦。翻过去了还要翻回来才能算作一个周期,因此你的方案是35/7/2=2.5MHz,而我的方案在25M时钟下则是真实的5MHz。SETB C
CLR P1.0            ;翻了一次了,2字节,4周期
MOV P1.0, C       ;再翻一次,2字节,3周期
CLR P1.0
MOV P1.0, C
...

wx85105157 发表于 2013-1-18 13:58:57

takashiki 发表于 2013-1-18 13:19 static/image/common/back.gif
算法有误哦。翻过去了还要翻回来才能算作一个周期,因此你的方案是35/7/2=2.5MHz,而我的方案在25M时钟下 ...

哈哈,我是忘记了,不过你也说错了,应该是在35M的时钟下。

而且你这个没跳转。。


如果只是要输出1~5个脉冲的话,用串口的方式0同步移位输出,选用syckl/2,在35M的情况下,能做到8.75Mhz的翻转。

lyp103 发表于 2013-1-18 18:09:27

试过,STC的I/0翻转最快是13.5MHZ
页: [1]
查看完整版本: 51IO翻转速率最大能到多少?