OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6553|回复: 21

H750的IO翻转速率问题,标题要满12字

[复制链接]

84

主题

347

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2008
金钱
2008
注册时间
2014-7-1
在线时间
189 小时
发表于 2021-1-16 15:37:59 | 显示全部楼层 |阅读模式
1金钱
H750VB,我测试下了,IO翻转,最快也是周期60ns左右,频率就是16.6666。。。M,这太慢了,大家测试是多少?
  1. #include "sys.h"
  2. int main(void)
  3. {
  4.         Stm32_Clock_Init(160,5,2,4);        //设置时钟,400Mhz
  5.        
  6.         RCC->AHB4ENR |=1<<0;//GPIOA时钟
  7.         GPIO_Set(GPIOA,PIN4,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_HIGH,
  8.                                                 GPIO_PUPD_PU);
  9.         GPIO_Pin_Set(GPIOA,PIN4,0);
  10.        
  11.         while(1)
  12.         {
  13.                 GPIO_Pin_Set(GPIOA,PIN4,0);
  14.                 GPIO_Pin_Set(GPIOA,PIN4,1);
  15.         }
  16. }
复制代码




无标题.png

最佳答案

查看完整内容[请看2#楼]

要想速度高得操作底层,你这还用库函数写,能到16M算是不错了,你试试改成寄存器,最后改成汇编,会发现频率高不少
做一个相信自己的人
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2021-1-16 15:38:00 | 显示全部楼层
要想速度高得操作底层,你这还用库函数写,能到16M算是不错了,你试试改成寄存器,最后改成汇编,会发现频率高不少
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2021-1-17 17:51:13 | 显示全部楼层
本身就是微处理器,术业有专攻,要想翻转快上FPGA岂不是更合适
回复

使用道具 举报

84

主题

347

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2008
金钱
2008
注册时间
2014-7-1
在线时间
189 小时
 楼主| 发表于 2021-1-18 09:16:00 | 显示全部楼层
正点原子 发表于 2021-1-16 15:38
要想速度高得操作底层,你这还用库函数写,能到16M算是不错了,你试试改成寄存器,最后改成汇编,会发现频 ...

这就是寄存器开发方式,参考水星板子程序。
试过直接GPIOA->BSRRL的操作,效果一样。
后来发现网上很多人一样的问题,没找到ST官方给解决办法。

做一个相信自己的人
回复

使用道具 举报

84

主题

347

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2008
金钱
2008
注册时间
2014-7-1
在线时间
189 小时
 楼主| 发表于 2021-1-18 10:36:42 | 显示全部楼层
ricefat 发表于 2021-1-17 17:51
本身就是微处理器,术业有专攻,要想翻转快上FPGA岂不是更合适

需要20M的翻转速度,如果STM32能做到,没必要用FPGA。
做一个相信自己的人
回复

使用道具 举报

0

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2020-5-21
在线时间
58 小时
发表于 2021-1-18 11:11:04 | 显示全部楼层
放弃吧,H7的IO速度是最慢的,内部复杂的总线结构决定的,要快的话,换成F7系列,速度可以到100M以上。
回复

使用道具 举报

84

主题

347

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2008
金钱
2008
注册时间
2014-7-1
在线时间
189 小时
 楼主| 发表于 2021-1-18 13:51:07 | 显示全部楼层
本帖最后由 shenqihao 于 2021-1-18 13:52 编辑
hexenzhou 发表于 2021-1-18 11:11
放弃吧,H7的IO速度是最慢的,内部复杂的总线结构决定的,要快的话,换成F7系列,速度可以到100M以上。

谢谢,刚刚用定时器PWM试了下,也不好,准备用开漏输出方式试试,还不行就只能放弃了
做一个相信自己的人
回复

使用道具 举报

84

主题

347

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2008
金钱
2008
注册时间
2014-7-1
在线时间
189 小时
 楼主| 发表于 2021-1-18 14:16:20 | 显示全部楼层
hexenzhou 发表于 2021-1-18 11:11
放弃吧,H7的IO速度是最慢的,内部复杂的总线结构决定的,要快的话,换成F7系列,速度可以到100M以上。

凉凉,开楼和推挽速度没差别
做一个相信自己的人
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2021-1-18 14:44:24 | 显示全部楼层
从你示波器图上来看,IO边沿超过30ns,这种情况可能是你示波器带宽不够,数字示波器一般需要10~20倍带宽才能还原波形(测100MHz方波需要1GHz带宽的示波器,注意是示波器带宽不是最大采样率)



STM32H7单就IO特性,从数据手册来看跑到100MHz轻松无压力,如果要达到最大的输出速率:
1. 需要设置GPIOx_OSPEEDR相应bit为0b11: Very high speed;
2. IO电源域建议设定为3.3V,否则需要打开HSLV (I/O high-speed at low-voltage);
3. 设置为推挽输出;
4. IO外部等效负载电容小于50pF;

iospd.png


ospeedr.png


另外,测试时建议用定时器输出方波测试,完全由硬件输出不要CPU干预,以免因为CPU处理耗时导致IO速率过低;
如果的确要用CPU去翻转IO,建议使用GPIOx_BSRR直接写寄存器达到set/reset GPIO的目的,免去读/改/写的流程,也可使用bit band方式操作GPIO。
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2021-1-18 14:49:33 | 显示全部楼层
正点原子 发表于 2021-1-16 15:38
要想速度高得操作底层,你这还用库函数写,能到16M算是不错了,你试试改成寄存器,最后改成汇编,会发现频 ...

SPEED默认值00时,IO负载10pF,3.3V电源时最大IO速度就是16MHz

iospeed00.png
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

84

主题

347

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2008
金钱
2008
注册时间
2014-7-1
在线时间
189 小时
 楼主| 发表于 2021-1-18 16:40:20 | 显示全部楼层
本帖最后由 shenqihao 于 2021-1-18 16:46 编辑
xkwy 发表于 2021-1-18 14:44
从你示波器图上来看,IO边沿超过30ns,这种情况可能是你示波器带宽不够,数字示波器一般需要10~20倍带宽才 ...

谢谢,H750VB芯片
按照你列出来的试过,IO空载,只接了示波器接头,实际负载电容不清楚,应该不大。
定时器方式和PWM都试了,还不如主函数里翻转速度快。
换了正点原子的示波器试了下,也是60ns这样。
做一个相信自己的人
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2021-1-18 17:20:19 | 显示全部楼层
刚才试了一下, 20MHz
试一下这个, 用v6的编译器

u32  hh=1;
        u32         ll=1<<16;
        while(1){
                GPIOE->BSRR =hh;
                GPIOE->BSRR =ll;
        }
       
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2021-1-18 17:24:27 | 显示全部楼层
本帖最后由 xkwy 于 2021-1-18 17:33 编辑
shenqihao 发表于 2021-1-18 16:40
谢谢,H750VB芯片
按照你列出来的试过,IO空载,只接了示波器接头,实际负载电容不清楚,应该不大。
定 ...

可能是你选的端口PA4不支持高速,你换个带有_h后缀的高速端口试一下,比如PA3/PA5/PB2
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

84

主题

347

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2008
金钱
2008
注册时间
2014-7-1
在线时间
189 小时
 楼主| 发表于 2021-1-18 17:51:49 | 显示全部楼层
edmund1234 发表于 2021-1-18 17:20
刚才试了一下, 20MHz
试一下这个, 用v6的编译器

是改变ARM Compler吗,V56.06还能编译通过,V6.6编译不过。
结果还是一样的
做一个相信自己的人
回复

使用道具 举报

84

主题

347

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2008
金钱
2008
注册时间
2014-7-1
在线时间
189 小时
 楼主| 发表于 2021-1-18 17:52:53 | 显示全部楼层
xkwy 发表于 2021-1-18 17:24
可能是你选的端口PA4不支持高速,你换个带有_h后缀的高速端口试一下,比如PA3/PA5/PB2

试了下PA3,效果一样的
做一个相信自己的人
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2021-1-18 18:07:47 | 显示全部楼层
shenqihao 发表于 2021-1-18 17:51
是改变ARM Compler吗,V56.06还能编译通过,V6.6编译不过。
结果还是一样的

我的V5编译器都删了,所以试不了V5下的速度, 你试试 Project-->Option for target -->C/C++ --> Optimize for Time 勾上
回复

使用道具 举报

84

主题

347

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2008
金钱
2008
注册时间
2014-7-1
在线时间
189 小时
 楼主| 发表于 2021-1-18 18:20:34 | 显示全部楼层
本帖最后由 shenqihao 于 2021-1-18 18:33 编辑
edmund1234 发表于 2021-1-18 18:07
我的V5编译器都删了,所以试不了V5下的速度, 你试试 Project-->Option for target -->C/C++ --> Optimiz ...

谢谢,试了下,没改善。
我把吃灰的429开发板拿出来,也不行,429近80ns。103RC近360ns。
做一个相信自己的人
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2021-1-19 09:57:33 | 显示全部楼层
shenqihao 发表于 2021-1-18 18:20
谢谢,试了下,没改善。
我把吃灰的429开发板拿出来,也不行,429近80ns。103RC近360ns。

不知道你是怎么测出来的103有360ns,刚好手上有一个STM32F103ZET6,帮你测一下。
PA5设置为2MHz,(实测边沿速度为10.9ns)
PA6为10MHz,(实测边沿速度为5.6ns)
PA7为50MHz,(实测边沿速度为2.850ns)
外部均悬空,推挽输出。ARM主频和APB2频率均为72MHz。

示波器:Tektronix - 泰克 TDS 2022C 200MHz(2GS/s)
探头:GENTEK G1300, 300MHz/6MHz, 10X:600Vpk, 1X:200Vpk, CATII
(探头工作在10X模式下)

如果你测不出这种速度,建议换个示波器或者检查一下你的探头是否有问题,另外格外要注意GND夹子应该尽量靠近待测GPIO信号。

代码:
  1. #include "stm32f10x.h"                  // Device header

  2. int main(void)
  3. {
  4.     RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
  5.    
  6.     GPIOA->CRL &= ~GPIO_CRL_MODE5;
  7.     GPIOA->CRL &= ~GPIO_CRL_MODE6;
  8.     GPIOA->CRL &= ~GPIO_CRL_MODE7;
  9.    
  10.     GPIOA->CRL |= GPIO_CRL_MODE5_1; /* PA5: 0b10=2MHz */
  11.     GPIOA->CRL |= GPIO_CRL_MODE6_0; /* PA6: 0b01=10MHz */
  12.     GPIOA->CRL |= GPIO_CRL_MODE7;   /* PA7: 0b11=50MHz */
  13.    
  14.     GPIOA->CRL &= ~GPIO_CRL_CNF5;
  15.     GPIOA->CRL &= ~GPIO_CRL_CNF6;
  16.     GPIOA->CRL &= ~GPIO_CRL_CNF7;
  17.    
  18.     while (1) {
  19.         GPIOA->BSRR = 0xF0;
  20.         GPIOA->BSRR = 0xF0;
  21.         GPIOA->BSRR = 0xF0<<16;
  22.         GPIOA->BSRR = 0xF0<<16;
  23.     }
  24. }
复制代码




PA5, 10.9ns
PA5.png

PA6, 5.6ns
PA6.png

PA7, 2.850ns
PA7.png
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

84

主题

347

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2008
金钱
2008
注册时间
2014-7-1
在线时间
189 小时
 楼主| 发表于 2021-1-19 14:36:38 | 显示全部楼层
xkwy 发表于 2021-1-19 09:57
不知道你是怎么测出来的103有360ns,刚好手上有一个STM32F103ZET6,帮你测一下。
PA5设置为2MHz,(实测 ...

谢谢,我也测了下103zet6的,240ns左右,波形不正常,示波器250M,2.5G/S
,探头不清楚参数,正点原子的示波器测试也是240ns左右,测的PA2引脚。贴着引脚测试,结果也一样。
你能测出来,不知道我这边问题在哪了,你的程序是没初始化时钟吗,我不初始化时钟,更慢。

  1. #include "sys.h"       


  2. int main(void)
  3. {               
  4.         u32 H=0x0F,L=(0x0F)<<16;
  5.         Stm32_Clock_Init(9);                                                                        //系统时钟设置
  6.        
  7.         RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
  8.         GPIOA->CRL&=0XFFFF00FF;//PA2推挽输出
  9.         GPIOA->CRL|=0X00003300;//PA3上下拉输入
  10.        
  11.         while(1)
  12.         {
  13.                 GPIOA->BSRR=L;
  14.                 GPIOA->BSRR=H;
  15.                
  16.         }         
  17. }

复制代码


无标题.png
做一个相信自己的人
回复

使用道具 举报

84

主题

347

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2008
金钱
2008
注册时间
2014-7-1
在线时间
189 小时
 楼主| 发表于 2021-1-19 17:54:51 | 显示全部楼层
xkwy 发表于 2021-1-19 09:57
不知道你是怎么测出来的103有360ns,刚好手上有一个STM32F103ZET6,帮你测一下。
PA5设置为2MHz,(实测 ...

找了个示波器,带宽1GHZ,采样5GS/s
还是240ns,等会我把正点原子开发板挖出来试试。
无标题.png
做一个相信自己的人
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2021-1-20 08:41:05 | 显示全部楼层
shenqihao 发表于 2021-1-19 17:54
找了个示波器,带宽1GHZ,采样5GS/s
还是240ns,等会我把正点原子开发板挖出来试试。

有可能是你的代码的问题,不知道你的#include "sys.h"、Stm32_Clock_Init(9);这两个是从哪来的,路子有点儿不对。

我用的是keil5,标准CMSIS寄存器开发流程,在Run-Time Environment对话框中只需要勾选CMSIS->CORE和Device->Startup两个就可以了,然后直接写main函数。
系统启动阶段调用流程是 Reset_Handler -> SystemInit() -> SetSysClock() -> SetSysClockTo72() -> __main() -> main()

rte.png

其中比较影响代码运行速度的可能就是SetSysClockTo72里面有设置FLASH预取和等待操作吧,作用是开启了FLASH执行CACHE加速。
如果你的Stm32_Clock_Init是自己写的,建议参考一下官方的,以免损失性能。
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

84

主题

347

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2008
金钱
2008
注册时间
2014-7-1
在线时间
189 小时
 楼主| 发表于 2021-1-21 11:29:41 | 显示全部楼层
xkwy 发表于 2021-1-20 08:41
有可能是你的代码的问题,不知道你的#include "sys.h"、Stm32_Clock_Init(9);这两个是从哪来的,路子有点 ...

感谢,详细的解答。时钟初始化用的正点原子的。
IO翻转率我认知有错误,比如100MHZ,以为能输出50MHZ的方波,仔细看了你的示波器截图,原来指的是上升沿。
还是老老实实fpga了。
做一个相信自己的人
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-8 11:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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