请教一个 STM32H7 IO 翻转速度的问题

2019-12-12 18:15发布

如题,由于案子需要用到高速的IO通信,还是特殊协议的那种,担心STM32F1和STM32F4 端口速度以及数据处理速度跟不上,就买了个STM32H7 的开发板,想试一下看看H7 的 IO 翻转速度有多快。
但结果有点出乎意料,用正点原子的例程,STM32H7 主频设置到400MHz,主循环里面就下面这样:
  while(1)
         {
         GPIOB->ODR = 1;
        GPIOB->ODR = 0;
         }
IO 口示波器实测速度才 16.7MHz 左右;

然后,为了避免其他因素的干扰,我又尝试,直接把 HSI 8分频,也就是64MHz/8 = 8MHz 作为系统时钟,各路总线都不再分频,跑起来,IO 的翻转速度才670KHz 左右;
相对于 400MHz 的时候,HCLK 是系统时钟 二分频了的,也就是说总线时钟 200MHz,200MHz/8MHz * 670KHz = 16.75MHz,这个和之前的测试结果基本吻合。

网上一查,发现也有人和我遇到同样的问题,或者说是现象,但却没有寻找到有效的提高 IO 翻转速度的方法。
那么问题来了,STM32H7 这样的 IO 翻转速度表现,甚至远低于 STM23F4 的水准,这显然应该是不可能的,这里面肯定有哪里没有配置正确吧,我猜;
但是我用自己贫瘠的英语水平以及比较low的专业能力,翻看了好几天参考手册并尝试修改各种时钟配置,一直没有解决,不知道坛子里有没有遇到同样问题的人,或者有大神给指点迷津。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
64条回答
laoshuhunya
1楼-- · 2019-12-16 22:20
本帖最后由 laoshuhunya 于 2018-11-24 16:54 编辑
mowin 发表于 2018-11-24 16:25
http://forum.armfly.com/forum.php?mod=viewthread&tid=85980
27楼


这是你以上的链接第32楼的:

32.PNG (475.93 KB, 下载次数: 0)

下载附件

32

2018-11-24 16:37 上传


  
不过,如果使用端口置位/复位寄存器操作的话,我认为H753软件翻转I/O口的速度可以达到25MHz,因为省掉MOVS两条指令的2个周期。
  
编辑原因:红 {MOD}字体笔误。
  
mowin
2楼-- · 2019-12-16 23:42
 精彩回答 2  元偷偷看……
laoshuhunya
3楼-- · 2019-12-17 04:09
mowin 发表于 2018-11-24 16:52
I've tried running out of SRAM and the output is the same. Additionally, I tried the same code on  ...

看来有空我也测试下F7
  
laoshuhunya
4楼-- · 2019-12-17 08:04
mowin 发表于 2018-11-24 16:52
I've tried running out of SRAM and the output is the same. Additionally, I tried the same code on  ...

如果是单周期的I/O口,通过软件翻转端口的极限速度可以达到系统时钟的1/4
200 ÷ 4 = 50MHz,没毛病
  
F7最大时钟216MHz,所以软件翻转I/O口的极限速度是216 ÷ 4 = 54MHz,108MHz貌似不科学(这是ARM指令的限制)
  
modbus
5楼-- · 2019-12-17 12:51
dudududu 发表于 2018-11-24 09:55
这位大哥说饿有理,汇编代码我也装摸做样的看了一下,水平有限,不咋明白

从汇编看,以及单 ...

红框里的C程序编译后的效率太低了,应该这样:
MOVS  R0,#0
MOVS  R2,#1
STR  R2,[R1,#0]
STR  R0,[R1,#0]
STR  R2,[R1,#0]
STR  R0,[R1,#0]
STR  R2,[R1,#0]
STR  R0,[R1,#0]
STR  R2,[R1,#0]
STR  R0,[R1,#0]
modbus
6楼-- · 2019-12-17 18:13
laoshuhunya 发表于 2018-11-24 15:45
端口置1:
MOVS  R0, #0x01                1个时钟周期
STR     R0, [R1, #0x00]        2个时钟周期

H7的STR指令也要2个时钟周期吗?

一周热门 更多>