GPIO翻转(18M)的讨论,更新:增加实验结果

jscaptain   2008-11-12 08:21 楼主
请香主提供一个GPIO翻转(18M)的例子:
      STM32F的宣传资料上说STM32F103X系列gpio最快反转速度为18M ,我调试了许久都达不到这个速度,只有不到3M的样子,搜索了几个论坛也没看到类似的范例,所以麻烦香主提供一个
----------------------------------------
------------------------------------------
实验总结:
查了以前所有相关的帖子,实现io最快速度要看https://bbs.eeworld.com.cn/club/bbs/list.asp?boardid=49&t=2912729帖子四楼部分,
但是,以实验结果来看不用写成具体到寄存器地址的形式,比如
“要在GPIOA.0产生翻转输出:"
   *(vu32 *)0x40010810 = 0x0001;
   *(vu32 *)0x40010814 = 0x0001"”
直接写成:
GPIOx->BRR = GPIO_Pin;
GPIOx->BSRR = GPIO_Pin;即可,例如:
While(1){
GPIOA->BRR = GPIO_Pin_8; GPIOA->BSRR = GPIO_Pin_8;
GPIOA->BRR = GPIO_Pin_8; GPIOA->BSRR = GPIO_Pin_8;
GPIOA->BRR = GPIO_Pin_8; GPIOA->BSRR = GPIO_Pin_8;
GPIOA->BRR = GPIO_Pin_8; GPIOA->BSRR = GPIO_Pin_8;
GPIOA->BRR = GPIO_Pin_8; GPIOA->BSRR = GPIO_Pin_8;
}
上述程序即可以使PA.8的反转频率达到约18M。
以上在STM32F103C8T6+iar 4.42 +jlink v6下验证通过。
另外非常疑问的一点如下:
无论GPIO_Init时候,无论GPIOA 端口速度被初始化成50M,或10M,或2M,上述程序均可输出18M的波形,只是初始化成2M时,波形较难看(飘在空中的正弦波),10M和50M的波形非常相近(近似正弦波),换句话说,一般的应用端口初始化成10M应该足够用了。
最后:说得再多,不如自己试一下,想偷懒的话反而更浪费时间。
香主在这个问题上同样也犯了懒,反而浪费了过多口舌。

回复评论 (13)

本论坛中早有人讨论过,也有例子

                                 请不要使用库函数,需要直接操作I/O寄存器。
点赞  2008-11-12 08:41

那若用库函数的话,最大速度为多少?

                                 我再找找看原来的例子,白头翁,香主很敬业啊
点赞  2008-11-12 08:57

使用库函数时的最大速度为多少? 我没有感念

                                 我们没有具体测过。
点赞  2008-11-12 09:00

IO翻转用BitBand,PIN_xxxx++;

                                  
点赞  2008-11-12 09:17

若用库函数的话,最大速度

                                   若用库函数的话,最大速度估计接近1M
点赞  2008-11-12 09:51

估计你没有优化,我的可以达到约2.7M的样子

                                 不知有没有其他人可以做得更快?
点赞  2008-11-12 10:12

请看看这个帖子

我在4楼的回答:https://bbs.eeworld.com.cn/club/bbs/list.asp?boardid=49&t=2912729
点赞  2008-11-12 10:51

re:

把ST32 超频!

如果是72MHZ , 位带要4条指令。则

72MHZ/4=18MHZ 估计这是最快的了。

LZ 可以把把ST32 超频!
超到100MHZ看看,可不可以到25 MHZ !
点赞  2008-11-12 11:16

STM32

                                 在STM32里面实现高速的IO很困难,受FLAHS读取速度的限制.在内部SRAM有所改善.如果要实现18M的IO,如果你需要少量快速IO,你可以用SPI的MOSI去完成.
点赞  2008-11-12 20:36

实验总结

                                 详见一楼---------线以下部分
点赞  2008-11-14 14:09

谢谢kgp0213的批评,但我这不是偷懒,我是逼你自己做实验

我曾经做过7年老师,我认为教师的职责是传授能力的,不是简单地灌输知识的。我的原则是不管结论多么简单,一般我不会直接告诉学生这个简单的结论,我宁可多费口舌绕着圈说,也要让学生自己用自己的话把答案说出来,因为只有这样学生们才能真正地学到东西,学到的东西才能变成自己的而不是别人给的。

因此,我最不喜欢的就是动不动就找我要答案,要代码的学生。


关于你的另一个发现“无论GPIO_Init时候,无论GPIOA端口速度被初始化成50M,或10M,或2M,上述程序均可输出18M的波形,只是初始化成2M时,波形较难看(飘在空中的正弦波),10M和50M的波形非常相近(近似正弦波)”,恰恰印证了以前很多人问过的问题:GPIO端口速度的设置是用于选择输出驱动电路的,高频驱动电路能够较少失真地输出高频信号,高频信号通过低驱动电路时失真就会变大。

请查查以前关于端口速度的讨论帖,这一点已经很清楚了。
点赞  2008-11-14 14:58

香主客气了

那些端口速度的讨论帖都看了也都理解那几个速度的定义,只是当初顽固的认为端口速度设置不正确就会完全不能输出或者输出错乱呢,原来stm32的端口设计兼容性还很强呢
所以,实践出真知,这话一点不错
点赞  2008-11-14 15:22
                                 GPIO挂在低速总线上,为36MHz,那么输出一个周期的话,最快也就18MHz了哦。
点赞  2009-9-9 14:08
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复