搜索
bottom↓
回复: 71

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

  [复制链接]

出0入0汤圆

发表于 2018-11-23 14:45:20 | 显示全部楼层 |阅读模式
如题,由于案子需要用到高速的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的专业能力,翻看了好几天参考手册并尝试修改各种时钟配置,一直没有解决,不知道坛子里有没有遇到同样问题的人,或者有大神给指点迷津。

出0入0汤圆

 楼主| 发表于 2018-11-23 14:47:22 | 显示全部楼层
另外补充一点,我用的开发工具是 MDK 5.21版本,编译器 开到二级优化和不开优化,好像结果没有区别

出0入0汤圆

发表于 2018-11-23 14:48:50 | 显示全部楼层
帮楼主顶一下,希望早日有结论

出0入0汤圆

发表于 2018-11-23 15:05:27 | 显示全部楼层
H750VB实测也是这么多

出110入0汤圆

发表于 2018-11-23 15:11:18 | 显示全部楼层
考虑一下while(1)的消耗时间

出0入0汤圆

 楼主| 发表于 2018-11-23 15:11:33 | 显示全部楼层
qinshi1208 发表于 2018-11-23 15:05
H750VB实测也是这么多

所以,是不是确定,STM32H7 的 IO 口直接程序控制反转就这尿性,还是说,我们都没有 get 到关键的设置点

出0入0汤圆

发表于 2018-11-23 15:13:43 | 显示全部楼层
那可以这样试试:
while(1)
         {
         GPIOB->ODR = 1;
        GPIOB->ODR = 0;
         GPIOB->ODR = 1;
        GPIOB->ODR = 0;
         }
看看宽度是否有变化

出0入0汤圆

 楼主| 发表于 2018-11-23 15:16:33 | 显示全部楼层
本帖最后由 dudududu 于 2018-11-23 15:18 编辑
Flyback 发表于 2018-11-23 15:11
考虑一下while(1)的消耗时间


这个,我也做过实验,把 while 循环里面 的 拉高,拉低,连续复制十二组,然后编译器开二级优化和不开优化,结果都是一样的,在 8MHZ 主频下,IO 反转速度维持 670KHz 不变

  while(1)
      {
                        GPIOB->ODR = 1;
                        GPIOB->ODR = 0;
                        GPIOB->ODR = 1;
                        GPIOB->ODR = 0;
                        GPIOB->ODR = 1;
                        GPIOB->ODR = 0;
                        GPIOB->ODR = 1;
                        GPIOB->ODR = 0;
                        GPIOB->ODR = 1;
                        GPIOB->ODR = 0;
                        GPIOB->ODR = 1;
                        GPIOB->ODR = 0;
                        GPIOB->ODR = 1;
                        GPIOB->ODR = 0;
                        GPIOB->ODR = 1;
                        GPIOB->ODR = 0;
                        GPIOB->ODR = 1;
                        GPIOB->ODR = 0;
                        GPIOB->ODR = 1;
                        GPIOB->ODR = 0;
                        GPIOB->ODR = 1;
                        GPIOB->ODR = 0;
                        GPIOB->ODR = 1;
                        GPIOB->ODR = 0;
                        GPIOB->ODR = 1;
                        GPIOB->ODR = 0;
                        GPIOB->ODR = 1;
                        GPIOB->ODR = 0;
                        GPIOB->ODR = 1;
                        GPIOB->ODR = 0;
                        GPIOB->ODR = 1;
                        GPIOB->ODR = 0;
      }

而且有一点忘记说了,之前那个 while 循环里面只有一组拉高拉低的操作,示波器看到的波形,是占空比50%的标准方波,也就是说, while 本身的跳转,貌似并没有花去额外的时间??

出0入0汤圆

发表于 2018-11-23 15:42:08 | 显示全部楼层
你用PWM试试

出0入4汤圆

发表于 2018-11-23 15:48:30 | 显示全部楼层
如果需要高速,可以用PWM+DMA或者SPI+DMA或者TIM+DMA+GPIO,没必要非要用软件翻转。

出0入42汤圆

发表于 2018-11-23 15:58:51 | 显示全部楼层
用这类寄存器看看,我测试过,好象比GPIOB->ODR = 1快
       GPIOB->BSRR = 0x00000010;
        GPIOB->BSRR = 0x00100000;

出110入0汤圆

发表于 2018-11-23 16:59:54 | 显示全部楼层
dudududu 发表于 2018-11-23 15:16
这个,我也做过实验,把 while 循环里面 的 拉高,拉低,连续复制十二组,然后编译器开二级优化和不开优 ...

STM32的 GPIO port output speed register (GPIOx_OSPEEDR) 是配置的多少

出0入8汤圆

发表于 2018-11-23 17:17:24 | 显示全部楼层
你到底要多少M的 IO口翻转  你不要指望会有多高。  你哪怕整个1G的 MCU  IO 软件翻转也快不到那里去。

出0入0汤圆

 楼主| 发表于 2018-11-23 19:00:55 | 显示全部楼层
Flyback 发表于 2018-11-23 16:59
STM32的 GPIO port output speed register (GPIOx_OSPEEDR) 是配置的多少

设置的非常高速 11

出0入0汤圆

 楼主| 发表于 2018-11-23 19:01:30 | 显示全部楼层
cocom 发表于 2018-11-23 15:58
用这类寄存器看看,我测试过,好象比GPIOB->ODR = 1快
       GPIOB->BSRR = 0x00000010;
        GPIOB-> ...

这个也试过了,一样的结果

出0入0汤圆

 楼主| 发表于 2018-11-23 19:02:35 | 显示全部楼层
kebaojun305 发表于 2018-11-23 17:17
你到底要多少M的 IO口翻转  你不要指望会有多高。  你哪怕整个1G的 MCU  IO 软件翻转也快不到那里去。 ...

项目需求是一个方面,另一个关键是,在纯程序控制下,STM32H7 不应该 IO翻转速度还赶不上 STM32F4 吧,这就有点扯了。。。。。。。

出0入0汤圆

发表于 2018-11-23 19:05:08 来自手机 | 显示全部楼层
这种定制的接口只能上fpga了

出0入0汤圆

发表于 2018-11-23 19:15:16 来自手机 | 显示全部楼层
dudududu 发表于 2018-11-23 15:11
所以,是不是确定,STM32H7 的 IO 口直接程序控制反转就这尿性,还是说,我们都没有 get 到关键的设置点{ ...

关注下。。

出10入46汤圆

发表于 2018-11-23 21:15:46 | 显示全部楼层
测试反转速度,看汇编代码啊!
你这样测试永远测试不出来结果

出0入0汤圆

发表于 2018-11-23 22:09:51 | 显示全部楼层
要高速还是上fpga吧,io上到10m级别如果再加上些条件判断,不现实

出0入0汤圆

发表于 2018-11-23 22:13:07 来自手机 | 显示全部楼层
m0+核,io翻转速度可以达到1/2系统时钟。h7应该不至于这么差劲

出0入0汤圆

 楼主| 发表于 2018-11-24 09:55:00 | 显示全部楼层
gonboy 发表于 2018-11-23 21:15
测试反转速度,看汇编代码啊!
你这样测试永远测试不出来结果

这位大哥说饿有理,汇编代码我也装摸做样的看了一下,水平有限,不咋明白

从汇编看,以及单步仿真,貌似也没啥问题,最多跑四步就该高低一个循环,按理说,在8MHZ 主时钟下,这IO翻转速度也应该距离 2MHZ 不远才对,但实际上就是670KHZ。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2018-11-24 10:05:16 | 显示全部楼层
用 MCO 输出了 SYS_CLK ,示波器实测 8MHz

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入85汤圆

发表于 2018-11-24 10:38:04 | 显示全部楼层
关注下

出0入0汤圆

发表于 2018-11-24 10:48:19 | 显示全部楼层
ST32F0/F1/F3系列,都可以做到I/O翻转频率为主频HCLK的1/4。

出0入0汤圆

 楼主| 发表于 2018-11-24 10:55:50 | 显示全部楼层
sme 发表于 2018-11-24 10:48
ST32F0/F1/F3系列,都可以做到I/O翻转频率为主频HCLK的1/4。

对,所以,STM32H7 不可能IO翻转只能这么低速度,我现在甚至怀疑,特么核心工作频率是不是都没有设置的8MHz,那个sys_clk 后面的一坨东西是个啥,用户手册里面也没有特别详细的说明,也没有相关的寄存器来搞它

出0入0汤圆

发表于 2018-11-24 14:01:03 | 显示全部楼层
dudududu 发表于 2018-11-24 10:55
对,所以,STM32H7 不可能IO翻转只能这么低速度,我现在甚至怀疑,特么核心工作频率是不是都没有设置的8M ...

F7速度会快很多,优化等级2

出0入20汤圆

发表于 2018-11-24 14:39:25 | 显示全部楼层
用STM32CUBE 半个小时内就能解决的问题。。。

出0入0汤圆

 楼主| 发表于 2018-11-24 15:08:07 | 显示全部楼层
Error.Dan 发表于 2018-11-24 14:39
用STM32CUBE 半个小时内就能解决的问题。。。

不好意思的告诉你,我用 STM32Cube_FW_H7_V1.3.0 里面给的官方例程也试过了,然并卵,400MHz 主频,IO 翻转速度 依然是 16.7MHz,不知道你说的可是这个意思

出0入20汤圆

发表于 2018-11-24 15:25:29 | 显示全部楼层
dudududu 发表于 2018-11-24 15:08
不好意思的告诉你,我用 STM32Cube_FW_H7_V1.3.0 里面给的官方例程也试过了,然并卵,400MHz 主频,IO 翻 ...

嗯,既然这样,那只能放狗了,不过你肯定不是唯一一个遇到这个问题的,比如这位,当然也不是没有办法比如这位,不过最后也是瞎折腾的。而且看起来是ST的员工~果然还是官方的锅~

出0入0汤圆

发表于 2018-11-24 15:45:11 | 显示全部楼层
本帖最后由 laoshuhunya 于 2018-11-24 15:46 编辑
dudududu 发表于 2018-11-24 09:55
这位大哥说饿有理,汇编代码我也装摸做样的看了一下,水平有限,不咋明白

从汇编看,以及单 ...


端口置1:
MOVS  R0, #0x01                1个时钟周期
STR     R0, [R1, #0x00]        2个时钟周期
  
端口置0:
MOVS  R0, #0x00                1个时钟周期
STR     R0, [R1, #0x00]        2个时钟周期
  
以上软件要翻转一次端口需要6个时钟周期
  
硬件翻转一次端口需要2个时钟周期
  
  
所以,通过软件翻转一次端口至少需要 6 × 2 = 12 个时钟周期。
  
最后结果: 8MHz ÷ 12 ≈ 666.7kHz
这样看来貌似没有问题。
  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-11-24 15:50:42 | 显示全部楼层
dudududu 发表于 2018-11-24 15:08
不好意思的告诉你,我用 STM32Cube_FW_H7_V1.3.0 里面给的官方例程也试过了,然并卵,400MHz 主频,IO 翻 ...

400 ÷ 2 ÷ 12 ≈ 16.7MHz
  

出0入0汤圆

发表于 2018-11-24 15:52:22 来自手机 | 显示全部楼层
网上好多案例了。看来无解

出0入0汤圆

发表于 2018-11-24 15:57:03 | 显示全部楼层
mowin 发表于 2018-11-24 15:52
网上好多案例了。看来无解

这是指令和端口硬件限制,当然无解。不过,NXP貌似有单周期的I/O口,速度可以翻倍。
  

出0入0汤圆

发表于 2018-11-24 16:04:59 | 显示全部楼层
laoshuhunya 发表于 2018-11-24 15:57
这是指令和端口硬件限制,当然无解。不过,NXP貌似有单周期的I/O口,速度可以翻倍。
  
...

人家测试F7的IO翻转能达到108MHz,这个H7就只有16.7MHz。据说跟H7的复杂总线矩阵有关系

出0入0汤圆

发表于 2018-11-24 16:21:01 | 显示全部楼层
mowin 发表于 2018-11-24 16:04
人家测试F7的IO翻转能达到108MHz,这个H7就只有16.7MHz。据说跟H7的复杂总线矩阵有关系 ...

STM32H753端口可以输出220MHz,但这是硬件输出的速度(比如MCO之类的)。
按道理说跟STM32F7比不会差别如此之大,确定STM32F7的108MHz是软件输出?

出0入0汤圆

发表于 2018-11-24 16:25:59 | 显示全部楼层
laoshuhunya 发表于 2018-11-24 16:21
STM32H753端口可以输出220MHz,但这是硬件输出的速度(比如MCO之类的)。
按道理说跟STM32F7比不会差别如 ...

http://forum.armfly.com/forum.php?mod=viewthread&tid=85980
27楼

http://www.stmcu.org.cn/module/forum/thread-617791-1-1.html这个给楼主参考

出0入0汤圆

发表于 2018-11-24 16:45:41 | 显示全部楼层
本帖最后由 laoshuhunya 于 2018-11-24 16:54 编辑


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

  
不过,如果使用端口置位/复位寄存器操作的话,我认为H753软件翻转I/O口的速度可以达到25MHz,因为省掉MOVS两条指令的2个周期。
  
编辑原因:红色字体笔误。
  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-11-24 16:52:23 | 显示全部楼层
laoshuhunya 发表于 2018-11-24 16:45
这是你以上的链接第32楼的:

  

I've tried running out of SRAM and the output is the same. Additionally, I tried the same code on an STM32F7 (which is also a Cortex-M7) dev kit I have, but with the processor at 200MHz, instead of 400MHz. My IO on the F7 toggles at 50Mhz (2*5nS clock cycles) which is exactly what I'd expect. – Jotux Aug 8 at 16:50

这是另外一个人测试的,F7,200MHz CPU时钟IO能翻转到50MHz

出0入0汤圆

发表于 2018-11-24 16:55:53 | 显示全部楼层
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
  

出0入0汤圆

发表于 2018-11-24 17:10:29 | 显示全部楼层
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指令的限制)
  

出0入0汤圆

发表于 2018-11-24 18:09:22 | 显示全部楼层
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]

出0入0汤圆

发表于 2018-11-24 18:10:58 | 显示全部楼层
laoshuhunya 发表于 2018-11-24 15:45
端口置1:
MOVS  R0, #0x01                1个时钟周期
STR     R0, [R1, #0x00]        2个时钟周期

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

出0入0汤圆

发表于 2018-11-24 18:32:19 | 显示全部楼层
本帖最后由 laoshuhunya 于 2018-11-24 18:43 编辑
modbus 发表于 2018-11-24 18:10
H7的STR指令也要2个时钟周期吗?


如果我没记错的话,Cortex-M7和Cortex-M4的指令集二进制兼容。STR指令至少2个周期,而翻转一次I/O至少需要2条STR指令,所以软件翻转I/O的理论速度是系统时钟的1/4
Cortex-M7是6级流水线,每个时钟周期可以执行两条指令,但这是对前后两条指令没有副作用来说的,比如两个没有直接关联的运算,对于硬件I/O这种互斥对象,不大可能也用这种操作。这个只有ST知道了,假如真是这样,那么软件翻转I/O的最大速度是系统时钟的1/2。
  
编辑愿因:补上图片

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-11-24 23:54:25 | 显示全部楼层
本帖最后由 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口的嵌入式汇编代码:

  
手上没有STM32H系列的板,无法确认H系列的情况,有STM32F7和STM32H7的大神也可以确认下。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-11-25 07:02:30 | 显示全部楼层
>实测I/O口输出脉冲周期约11.84nS
normally you shall give the I/O more than 20ns for some safety margin.

出0入0汤圆

发表于 2018-11-25 07:27:25 | 显示全部楼层
funnynypd 发表于 2018-11-25 07:02
>实测I/O口输出脉冲周期约11.84nS
normally you shall give the I/O more than 20ns for some safety margi ...

此话出处?可有典故?
  

出0入0汤圆

发表于 2018-11-25 10:51:53 | 显示全部楼层
本帖最后由 funnynypd 于 2018-11-25 10:55 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-11-25 10:55:09 | 显示全部楼层
Mosfet on and off will need time.
If you work on most of the SMPS IC, you will find they are normally in the 100ns range.
MCU maybe faster, but 10~25ns are some good starting point.

出0入0汤圆

发表于 2018-11-25 12:16:05 | 显示全部楼层
funnynypd 发表于 2018-11-25 10:51
Check the MCU user manual, the following is an example.



  
此表摘自STM32F767数据手册:

  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-11-25 13:31:33 | 显示全部楼层
F4我记得测过是单时钟周期翻转

出100入101汤圆

发表于 2018-11-25 15:35:03 | 显示全部楼层
看翻转速度,用pwm测试

出0入0汤圆

发表于 2018-11-26 06:02:35 | 显示全部楼层
I believe it has been labeled very well on the document:
for capacitor load <=10PF, the maximum TioR and TioF is 2.5ns, which represent 200MHz maximum, which close to the "180MHz" you have highlighted.
However, how to control the output capacitor load <=10PF, will be a challenge for PCB layout.

出0入0汤圆

 楼主| 发表于 2018-11-29 14:28:29 | 显示全部楼层
laoshuhunya 发表于 2018-11-24 15:45
端口置1:
MOVS  R0, #0x01                1个时钟周期
STR     R0, [R1, #0x00]        2个时钟周期

这位大神,为啥软件翻转一次需要6周期,硬件需要2周期,最终算出来是6*2=12周期??为啥是相乘的关系,我没搞太明白

出0入0汤圆

发表于 2018-11-29 15:03:01 | 显示全部楼层
这个我搞过,STM32是精简指令集,翻转IO需要多条指令执行,而不是复杂指令集的一条指令就能搞定。我做过时许严格的项目使用汇编翻转IO。
另外跑在400M主频上速度达不到那么高是因为Flash达不到那么高的速度。flash需要等待。

出0入0汤圆

发表于 2018-11-29 15:18:28 | 显示全部楼层
dudududu 发表于 2018-11-29 14:28
这位大神,为啥软件翻转一次需要6周期,硬件需要2周期,最终算出来是6*2=12周期??为啥是相乘的关系,我 ...

对此我也有疑惑。如果数据手册上“翻转一次I/O口需要两个周期”这句话表达的意思是硬件限制,那么对你上面示出的汇编代码来说确实是 6*2 = 12个周期。如果那句话表达的意思是“I/O翻转速度最高可达系统时钟的1/2”,那结论完全不同。
根据我这几天的实际测试,STM32F1软件翻转I/O口的速度最高可达系统时钟的1/4,STM32F4和STM32F7软件翻转I/O口的速度都能达到系统时钟的1/2,但我手上没有STM32H系列的测试板,无法确认它的具体情况。不过我个人认为STM32H7应该和F7系列一样。你也可以用前面我的帖子中附件那个嵌入式汇编测试下,结果就非常明确了。

出0入0汤圆

发表于 2018-11-29 15:42:04 | 显示全部楼层
参考这个帖子,翻转速率主要受总线速度影响。
https://www.amobbs.com/forum.php ... &authorid=99882

出0入0汤圆

发表于 2018-12-15 00:12:04 | 显示全部楼层
今天拿到一块STM32H743评估板,略略翻了相关文档,把锁相环PLL1设置为800MHz,系统时钟设置为400MHz,I/O口总线(AHB4)时钟设置为200MHz,果然不负众望,I/O输出硬件翻转速度达到了数据手册的200MHz,也符合参考手册上说的系统时钟1/2
  
但是,软件翻转I/O口的速度也达到了惊人的16.7MHz,比11年前的STM32F103还差?STM32F103软件翻转I/O口的速度可以达到18MHz
  
重新检查设置,把能开的全开了,该关的都关了,软件翻转I/O口的速度始终是稳稳的16.7MHz
  
在输出指令中插入NOP,也没有增加翻转周期,说明是总线矩阵阻碍了软件翻转I/O的速度。
  
时钟配置如下:
  1. //-------------------------------------------------------------
  2.     HWREG32(0x51043100uL) = 0x0000000FuL;    // CM7_Read_QOS = 0xF(最高优先权)
  3.     HWREG32(0x51043104uL) = 0x0000000FuL;    // CM7_Write_QOS = 0xF(最高优先权)
  4.    
  5.     SET_BIT(PWR->CR2, 0x00000001uL);    // 使能备份调压器
  6.     SET_BIT(PWR->CR3, 0x02000100uL);    // 使能USB调压器,使能VBAT电池充电
  7.     Delay(DelayTime);
  8.     SET_BIT(PWR->D3CR, 0x0000C000uL);    // VOS = 1
  9.     Delay(DelayTime);
  10.     while (!READ_BIT(PWR->CSR1, 0x00002000uL));    // 等待VOS电压稳定
  11.    
  12.     RCC->PLLCKSELR = 0x01010100uL;    // DIVM = HSI/16
  13.     RCC->PLLCFGR = 0x01FF0888uL;    // PLL1/PLL2/PLL3配置为VCOH(192 MHz 到 836 MHz)
  14.     RCC->PLL1DIVR = 0x010102C7uL;    // PLL1倍频200,VCO1配置为800MHz
  15.     RCC->PLL2DIVR = 0x01010263uL;    // PLL2倍频100,VCO2配置为400MHz
  16.     RCC->PLL3DIVR = 0x01010263uL;    // PLL3倍频100,VCO3配置为400MHz
  17.     SET_BIT(RCC->CR, 0x15000000uL);    // 开启PLL1/PLL2/PLL3
  18.    
  19.     FLASH->ACR = 0x00000022uL;    // 闪存访问等待周期2
  20.     SET_BIT(RCC->CFGR, 0x04000000uL);    // MCO2 = sys_ck/2
  21.     RCC->D1CFGR = 0x00000048uL;    // sys_d1cpre_ck = sys_ck/1,rcc_hclk3 = sys_d1cpre_ck/2,rcc_pclk3 = rcc_hclk3/2
  22.     RCC->D2CFGR = 0x00000440uL;    // rcc_pclk2 = rcc_hclk2/2,rcc_pclk1 = rcc_hclk1/2
  23.     RCC->D3CFGR = 0x00000040uL;    // rcc_pclk4 = rcc_hclk4/2
  24.    
  25.     Delay(DelayTime);
  26.     while (READ_BIT(RCC->CR, 0x3F000000uL) != 0x3F000000uL);    // 等待PLL时钟锁定
  27.     Delay(DelayTime);
  28.     SET_BIT(RCC->CFGR, 0x00000003uL);    // 切换到PLL时钟
  29.     Delay(DelayTime);
  30.     while (READ_BIT(RCC->CFGR, 0x00000038uL) != 0x00000018uL);    // 等待PLL时钟切换完成
  31. //-------------------------------------------------------------
复制代码

  
SCT文件如下,把需要加速的函数放到DTCM:
  1. LR_IROM1 0x08000000 0x00200000  {    ; load region size_region
  2.   ER_IROM1 0x08000000 0x00200000  {  ; load address = execution address
  3.    *.o (RESET, +First)
  4.    *(InRoot$Sections)
  5.    .ANY (+RO)
  6.    .ANY (+XO)
  7.   }
  8.   RW_IRAM1 0x20000000 0x00020000  {  ; RW data
  9.    _bgrtss_smapi_cm3_012_001.o (+RW +ZI)
  10.    _bgrtsystemservice_cm3_012_001.o
  11.    _bgrtscheduler_cm3_012_001.o (+RW +ZI)
  12.    _bgrtswitcher_cm4f_012_001.o
  13.    
  14.    startup_bgrtss_armcm4_rvmdk.o (+RW +ZI)
  15.    blinky.o (+RW +ZI)
  16.    io_atomicaccess_hdi_001_000.o
  17.    pid_hdp_api_003_012.o
  18.    io_atomicaccess_master1.o (+RW +ZI)
  19.    task4.o (+RW +ZI)
  20.   }
  21.   RW_IRAM2 0x24000000 0x00080000  {
  22.    .ANY (+RW +ZI)
  23.   }
  24. }
复制代码

  
CPU访问I/O口需要经过两级总线矩阵,慢是有道理的,看来H系列只能这样了:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-12-15 08:59:45 | 显示全部楼层
laoshuhunya 发表于 2018-12-15 00:12
今天拿到一块STM32H743评估板,略略翻了相关文档,把锁相环PLL1设置为800MHz,系统时钟设置为400MHz,I/O口 ...

主频几百M, 软件翻转只有16M   所有脉冲都改成定时器操作估计还快些了。

出0入0汤圆

发表于 2018-12-15 10:39:47 | 显示全部楼层
huangqi412 发表于 2018-12-15 08:59
主频几百M, 软件翻转只有16M   所有脉冲都改成定时器操作估计还快些了。

用软件模拟通讯接口基本上就I2C,而I2C速率很慢,速率较高的SPI和其他通讯接口就少有用软件模拟了。开关量输出的话16.7MHz也基本够用。
所以实际应用问题不大,估计这也是ST的设计思路。

出0入4汤圆

发表于 2018-12-15 16:39:08 来自手机 | 显示全部楼层
laoshuhunya 发表于 2018-11-25 12:16
此表摘自STM32F767数据手册:

最差20Mhz,一般50Mhz ,看典型值,不要只关注最大值

出0入0汤圆

发表于 2018-12-15 22:01:20 | 显示全部楼层
把程序放在RAM运行应该还能快点

出0入0汤圆

发表于 2018-12-18 10:31:24 | 显示全部楼层
我也测了一下F7可达100M翻转,谁个解释下   
49:         {
0x080016A8 4805      LDR           r0,[pc,#20]  ; @0x080016C0
0x080016AA 4669      MOV           r1,sp
0x080016AC F7FEFE8E  BL.W          HAL_GPIO_Init (0x080003CC)
    50:                 GPIOC->BSRR = 0x00000008U;
0x080016B0 4803      LDR           r0,[pc,#12]  ; @0x080016C0
0x080016B2 3018      ADDS          r0,r0,#0x18
    51:                 GPIOC->BSRR = 0x00080000U;
0x080016B4 0421      LSLS          r1,r4,#16
0x080016B6 6004      STR           r4,[r0,#0x00]
0x080016B8 6001      STR           r1,[r0,#0x00]
    48:         while (1)
0x080016BA E7FC      B             0x080016B6
0x080016BC 3830      DCW           0x3830
0x080016BE 4002      DCW           0x4002
0x080016C0 0800      DCW           0x0800
0x080016C2 4002      DCW           0x4002
0x080016C4 F04F7040  MOV           r0,#0x3000000
0x080016C8 EEE10A10  VMSR           FPSCR, r0
0x080016CC 4770      BX            lr
0x080016CE 0000      DCW           0x0000

出0入0汤圆

 楼主| 发表于 2018-12-20 16:44:11 | 显示全部楼层
laoshuhunya 发表于 2018-12-15 00:12
今天拿到一块STM32H743评估板,略略翻了相关文档,把锁相环PLL1设置为800MHz,系统时钟设置为400MHz,I/O口 ...

大神啊,我感觉,你这个解释很合理,看起来,H7真的就这样了,IO口软件来跑很吃亏

出0入0汤圆

发表于 2019-3-25 15:04:54 | 显示全部楼层
dudududu 发表于 2018-12-20 16:44
大神啊,我感觉,你这个解释很合理,看起来,H7真的就这样了,IO口软件来跑很吃亏  ...

测了一下,H743 IO 真的只有 16.7M  而 F767 能达到 108M

出0入0汤圆

发表于 2020-4-30 13:45:50 | 显示全部楼层
laoshuhunya 发表于 2018-12-15 00:12
今天拿到一块STM32H743评估板,略略翻了相关文档,把锁相环PLL1设置为800MHz,系统时钟设置为400MHz,I/O口 ...

今天测试双核的H7,通过GPIO-BSRR寄存器翻转IO;
系统时钟,M7是400M,M4是200M;


M7只能达到16.67MHz;
但是M4,能达到100MHZ;

真实奇怪,M4也走了一个总线桥,但是还是能达到100MHZ。  

只能解释为AXI转AHB桥的要比AHB转AHB的要慢很多。

出0入4汤圆

发表于 2020-8-7 10:24:15 | 显示全部楼层
laoshuhunya 发表于 2018-11-24 15:45
端口置1:
MOVS  R0, #0x01                1个时钟周期
STR     R0, [R1, #0x00]        2个时钟周期

请问,F7的汇编也会占据时钟周期

那么为什么实验证明F7是能够软件翻转达到108MHZ的波形呢?
手册里确实也有写。

最后一个疑问,每个汇编指令消耗的时钟周期是固定的吗,还是具体芯片具体规定?(不好意思,在手册里没找到)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

发表于 2020-8-7 10:26:33 | 显示全部楼层
laoshuhunya 发表于 2018-11-24 15:45
端口置1:
MOVS  R0, #0x01                1个时钟周期
STR     R0, [R1, #0x00]        2个时钟周期

F767的汇编指令:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2020-8-7 20:10:44 来自手机 | 显示全部楼层
測試過,480兆h750,高低高低io是25ns改變狀態,推算一次io要12個時鐘完成

出0入0汤圆

 楼主| 发表于 2020-8-13 10:17:01 | 显示全部楼层
4317mjh 发表于 2020-4-30 13:45
今天测试双核的H7,通过GPIO-BSRR寄存器翻转IO;
系统时钟,M7是400M,M4是200M;

是不是就因为这个,出了个双核,另一个就是给你们HLHLHLHL的

出0入0汤圆

发表于 2020-8-13 18:40:03 来自手机 | 显示全部楼层
4317mjh 发表于 2020-4-30 13:45
今天测试双核的H7,通过GPIO-BSRR寄存器翻转IO;
系统时钟,M7是400M,M4是200M;


专门给你用来翻转的

出0入18汤圆

发表于 2020-8-13 19:38:06 | 显示全部楼层
去瞅瞅  NXP 的芯片 ,有能串并 转换 并且自定义的 硬件,很适合特殊接口。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 00:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表