请教一个 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-17 19:51
 精彩回答 2  元偷偷看……
laoshuhunya
2楼-- · 2019-12-17 22:56
本帖最后由 laoshuhunya 于 2018-11-24 23:56 编辑
laoshuhunya 发表于 2018-11-24 16:55
看来有空我也测试下F7


出乎意料之外,STM32F767ZIT6实测结果如下:
系统时钟使用片内RC振荡器(16MHz)倍频到168MHz,使用附件中的嵌入式汇编代码,实测I/O口输出脉冲周期约11.84nS,频率84.45MHz,MCO(SYSCLK/5)输出频率为33.78MHz。
看来结果不仅得益于Cortex-M7的超标量6级流水线内核,还与总线架构有关。如果系统时钟是216MHz,软件翻转I/O口的速度可以达到108MHz。
  
软件运行于片内TCM Flash(地址0x00200000)。
时钟配置如下:
    Delay(DelayTime);
    RCC->PLLCFGR = 0x2700348AuL;    // PLLCLK配置为168MHz
    SET_BIT(RCC->CR, RCC_CR_PLLON);    // 开启PLL
   
    FLASH->ACR = 0x00000306uL;    // 闪存访问等待周期6
    RCC->CFGR = 0x38009400uL;    // SYSCLK为PLLCLK/1,FAHB为SYSCLK/1,FAPB2为FAHB/2,FAPB1为FAHB/4,MCO2为SYSCLK/5
   
    Delay(DelayTime);
    while (!READ_BIT(RCC->CR, RCC_CR_PLLRDY));    // 等待PLL时钟锁定
    Delay(DelayTime);
    SET_BIT(RCC->CFGR, RCC_CFGR_SW_PLL);    // 切换到PLL时钟
    Delay(DelayTime);
    while (((RCC->CFGR >> 2) & 0x03uL) != 0x02uL);    // 等待PLL时钟切换完成
  
软件翻转IO口的嵌入式汇编代码:
嵌入式汇编-软件翻转IO口.rar (510 Bytes, 下载次数: 6) 2018-11-24 23:26 上传 点击文件名下载附件
嵌入式汇编-软件翻转IO口

  
手上没有STM32H系列的板,无法确认H系列的情况,有STM32F7和STM32H7的大神也可以确认下。
funnynypd
3楼-- · 2019-12-18 03:09
>实测I/O口输出脉冲周期约11.84nS
normally you shall give the I/O more than 20ns for some safety margin.
laoshuhunya
4楼-- · 2019-12-18 05:42
funnynypd 发表于 2018-11-25 07:02
>实测I/O口输出脉冲周期约11.84nS
normally you shall give the I/O more than 20ns for some safety margi ...

此话出处?可有典故?
  
funnynypd
5楼-- · 2019-12-18 06:40
本帖最后由 funnynypd 于 2018-11-25 10:55 编辑

Check the MCU user manual, the following is an example.

MCU_IO_RiseTimeAndFallTIme.PNG (217.55 KB, 下载次数: 0)

下载附件

2018-11-25 10:51 上传

funnynypd
6楼-- · 2019-12-18 11:29
 精彩回答 2  元偷偷看……

一周热门 更多>