打印

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

[复制链接]
11082|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kgp0213|  楼主 | 2008-11-12 08:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请香主提供一个GPIO翻转(18M)的例子:
      STM32F的宣传资料上说STM32F103X系列gpio最快反转速度为18M ,我调试了许久都达不到这个速度,只有不到3M的样子,搜索了几个论坛也没看到类似的范例,所以麻烦香主提供一个
----------------------------------------
------------------------------------------
实验总结:
查了以前所有相关的帖子,实现io最快速度要看https://bbs.21ic.com/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应该足够用了。
最后:说得再多,不如自己试一下,想偷懒的话反而更浪费时间。
香主在这个问题上同样也犯了懒,反而浪费了过多口舌。
沙发
香水城| | 2008-11-12 08:41 | 只看该作者

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

请不要使用库函数,需要直接操作I/O寄存器。

使用特权

评论回复
板凳
kgp0213|  楼主 | 2008-11-12 08:57 | 只看该作者

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

我再找找看原来的例子,白头翁,香主很敬业啊

使用特权

评论回复
地板
香水城| | 2008-11-12 09:00 | 只看该作者

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

我们没有具体测过。

使用特权

评论回复
5
pheavecn| | 2008-11-12 09:17 | 只看该作者

IO翻转用BitBand,PIN_xxxx++;

使用特权

评论回复
6
ijk| | 2008-11-12 09:51 | 只看该作者

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

  若用库函数的话,最大速度估计接近1M

使用特权

评论回复
7
kgp0213|  楼主 | 2008-11-12 10:12 | 只看该作者

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

不知有没有其他人可以做得更快?

使用特权

评论回复
8
香水城| | 2008-11-12 10:51 | 只看该作者

请看看这个帖子

使用特权

评论回复
9
boclandc| | 2008-11-12 20:36 | 只看该作者

STM32

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

使用特权

评论回复
10
kgp0213|  楼主 | 2008-11-14 14:09 | 只看该作者

实验总结

详见一楼---------线以下部分

使用特权

评论回复
11
香水城| | 2008-11-14 14:58 | 只看该作者

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

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

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


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

请查查以前关于端口速度的讨论帖,这一点已经很清楚了。

使用特权

评论回复
12
kgp0213|  楼主 | 2008-11-14 15:22 | 只看该作者

香主客气了

那些端口速度的讨论帖都看了也都理解那几个速度的定义,只是当初顽固的认为端口速度设置不正确就会完全不能输出或者输出错乱呢,原来stm32的端口设计兼容性还很强呢
所以,实践出真知,这话一点不错

使用特权

评论回复
13
cnelf| | 2009-9-9 14:08 | 只看该作者
GPIO挂在低速总线上,为36MHz,那么输出一个周期的话,最快也就18MHz了哦。

使用特权

评论回复
14
wengfeiyin| | 2011-10-25 22:52 | 只看该作者
我多次试验了 ,就是达不到18m翻转速度呢。有哪位兄弟实现了,最高18M的翻转速度呢。麻烦分享下程序呢 有的话,麻烦发下到我邮箱664521010@qq.com .不甚感激。

使用特权

评论回复
15
lkl10800139| | 2012-3-23 10:53 | 只看该作者
参考,现在在做dma gpio遇到同样问题。

使用特权

评论回复
16
09电气| | 2012-3-27 18:29 | 只看该作者
模拟时序写LCD的,以前用的固件库操作IO口,看了本帖改用操作寄存器速度果然快多了。

使用特权

评论回复
17
lkl10800139| | 2012-3-27 23:41 | 只看该作者
我在4楼的回答:https://bbs.21ic.com/club/bbs/list.asp?boardid=49&t=2912729
香水城 发表于 2008-11-12 10:51

香主,连接打不开了。提示被删除啦

使用特权

评论回复
18
vipsongyan| | 2013-6-2 20:23 | 只看该作者
香水城 发表于 2008-11-12 10:51
我在4楼的回答:https://bbs.21ic.com/club/bbs/list.asp?boardid=49&t=2912729

    今天加班弄了很久,现在还在弄,我的晶振是8M的,倍到72M,APB1是HCLK_DIV1,IO的翻转直接对寄存器操作,可是用示波器测只在4M左右,请香主帮忙想想还有什么可能引起,今天想弄出来,弄到18M,谢谢。

使用特权

评论回复
19
shiyang800| | 2013-8-10 16:11 | 只看该作者
我用的这个指令组合搞出了18M,

GPIOE->BSRR = 0x200000;
GPIOE->BSRR = GPIO_Pin_5;

楼主那个指令我还真没搞出来,最多就只有6M;条件:72M内核+72M AHB+72M APB2

使用特权

评论回复
20
shiyang800| | 2013-8-10 16:15 | 只看该作者
编译器采用的keil MDK4.22,不知道是否是编译器的原因导致的差异。
另外,MDK下 写不同寄存器的延迟似乎有差异,采用BRR清零的延迟要长。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

71

帖子

0

粉丝