搜索
bottom↓
回复: 24

STM32的I/O口输出翻转速度完全可以达到18M,验证成功

[复制链接]

出0入0汤圆

发表于 2013-5-2 10:23:58 | 显示全部楼层 |阅读模式
本帖最后由 cjwmusic 于 2013-5-2 10:26 编辑

分别用库,寄存器对STM32的I/O口的输出翻转速度进行了测试

       测试环境:
               编译器:IAR 6.4 FOR ARM
               特殊设置:代码高速优化
               芯片:STM32F103C8T6
               时钟:外部8MHz,PLL到72MHz
               示波器:Tektronix   TDS 2004B
1、用库
   (1)代码如下:
           while(1)
           {
                GPIO_SetBits(GPIOB,GPIO_Pin_5);
                GPIO_ResetBits(GPIOB,GPIO_Pin_5);
                ......(中间重复很多句)
                GPIO_SetBits(GPIOB,GPIO_Pin_5);
                GPIO_ResetBits(GPIOB,GPIO_Pin_5);
            }

    (2)测试结果:
           峰值:408mv     频率:2.7MHz      周期:361ns

     ( 3 )波形图:
      
2、用寄存器   GPIOx_ODR
    (1)代码如下:
           while(1)
           {
                GPIOB->ODR = 0xffffffff;
                GPIOB->ODR = 0;
                ......(中间重复很多句)
                GPIOB->ODR = 0xffffffff;
                GPIOB->ODR = 0;
            }
     (2)测试结果:
           峰值:420mv    频率:18MHz     周期:55.55ns
      
     (3)波形图
      

3、用寄存器   GPIOB->BRR和GPIOB->BSRR
     (1)代码如下:
            while(1)
           {
                GPIOB->BRR = GPIO_Pin_5;
                GPIOB->BSRR = GPIO_Pin_5;
                ......(中间重复很多句)
                GPIOB->BRR = GPIO_Pin_5;
                GPIOB->BSRR = GPIO_Pin_5;
            }
     (2)测试结果:
           峰值:380mv    频率:18Mhz     周期:55.55ns
   
     (3)波形图
      

4、总结和疑问
     (1)总结:A: STM32的i/o翻转速度确实能够达到宣称的18MHz
                      B: 库函数的效率确实比较低
                      C: 之前看到有人说GPIOx_ODR要比GPIOx_BSRR慢,因为前者先要读出来,修改了,再写进去,后者直接写入。但实测却没发现有什么快慢差别。
                          也有可能这个实验中看不到他们两个的速度差异吧。

     (2)疑问:为什么峰值只有几百mv呢?

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2013-5-2 10:48:58 | 显示全部楼层
用同样方法对STM8S105S4进行了测试,只能达到4M(写ODR寄存器),,而且是可以高速输出的引脚PD1

出0入0汤圆

发表于 2013-5-2 10:52:01 | 显示全部楼层
"C: 之前看到有人说GPIOx_ODR要比GPIOx_BSRR慢,因为前者先要读出来,修改了,再写进去,后者直接写入。但实测却没发现有什么快慢差别。
                          也有可能这个实验中看不到他们两个的速度差异吧。
"
你在实验中并没有读GIPOx_ODR,因为你是直接赋值,而不是"|="或“&=”,实际使用中如果只想改变某位而保持其它位不变GPIOx_BSRR的优势就体现出来了。

“   (2)疑问:为什么峰值只有几百mv呢? ”
你端口初始化对了么?设为推挽输出了吗?

出0入0汤圆

 楼主| 发表于 2013-5-2 11:01:26 | 显示全部楼层
desertsailor 发表于 2013-5-2 10:52
"C: 之前看到有人说GPIOx_ODR要比GPIOx_BSRR慢,因为前者先要读出来,修改了,再写进去,后者直接写入。但 ...

是推挽输出
void GPIO_Config()
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /*使能GPIOB时钟*/
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //配置5脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //配置为推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度为最大50MHZ
   
    GPIO_Init(GPIOB, &GPIO_InitStructure);   
}

出0入0汤圆

发表于 2013-5-2 11:49:45 | 显示全部楼层
你的这个测试引脚外接负载了吗?

出0入0汤圆

发表于 2013-5-2 12:04:22 | 显示全部楼层
测试引脚外接负载了吗?

出0入0汤圆

发表于 2013-5-2 12:11:03 | 显示全部楼层
楼主有图有真相,顶你了

出0入0汤圆

发表于 2013-5-2 12:18:04 | 显示全部楼层
表笔在X10档,示波器设置的X1档吧?

出0入0汤圆

发表于 2013-5-2 12:20:24 | 显示全部楼层
还是慢!!!
当年AVR 16MHZ主频 ,IO 8MHZ

出0入0汤圆

发表于 2013-5-2 12:25:53 | 显示全部楼层
没啥实际意义啊,只要一用for()、while()这类跳转功能,反转速率一下就降下来了

出0入0汤圆

发表于 2013-5-2 13:28:13 | 显示全部楼层
这个跟负载也有关系。

出0入0汤圆

 楼主| 发表于 2013-5-2 14:41:19 | 显示全部楼层
wangguanfu 发表于 2013-5-2 12:20
还是慢!!!
当年AVR 16MHZ主频 ,IO 8MHZ

avr这么强悍啊

出0入0汤圆

发表于 2013-5-2 15:14:32 | 显示全部楼层
高电平只有四百多毫伏,这不科学啊

出0入0汤圆

 楼主| 发表于 2013-5-2 15:35:19 | 显示全部楼层
yangliu212 发表于 2013-5-2 12:04
测试引脚外接负载了吗?

没有接负载

出0入0汤圆

 楼主| 发表于 2013-5-2 15:36:16 | 显示全部楼层
Clinging 发表于 2013-5-2 12:18
表笔在X10档,示波器设置的X1档吧?

果然是,调整之后,波形很差劲,几乎是三角波,峰值2点多伏

出0入0汤圆

 楼主| 发表于 2013-5-2 15:36:32 | 显示全部楼层
ludims 发表于 2013-5-2 15:14
高电平只有四百多毫伏,这不科学啊

是示波器表笔没有调好

出0入0汤圆

 楼主| 发表于 2013-5-2 15:37:21 | 显示全部楼层
yangliu212 发表于 2013-5-2 12:04
测试引脚外接负载了吗?

谢谢了,对STM32还是蛮有信息的

出0入0汤圆

 楼主| 发表于 2013-5-2 15:37:45 | 显示全部楼层
oped001 发表于 2013-5-2 12:25
没啥实际意义啊,只要一用for()、while()这类跳转功能,反转速率一下就降下来了 ...

是啊,难道非得用汇编才能搞的很精确

出0入0汤圆

发表于 2013-5-2 16:04:17 | 显示全部楼层
这个跟汇编没关系,CM3跳转指令要占用多个时钟周期,时间就在这被耗掉了

出0入0汤圆

发表于 2013-5-2 16:29:24 | 显示全部楼层
很好,不知道F4的io口速度快到什么程序

出0入0汤圆

 楼主| 发表于 2013-5-2 20:52:10 | 显示全部楼层
苹果520 发表于 2013-5-2 16:29
很好,不知道F4的io口速度快到什么程序

明天测一下,告诉你

出0入0汤圆

发表于 2013-5-2 23:59:16 | 显示全部楼层
cjwmusic 发表于 2013-5-2 20:52
明天测一下,告诉你

谢谢了,可以交个朋友吗?

出0入0汤圆

发表于 2013-5-23 19:12:04 | 显示全部楼层
oped001 发表于 2013-5-2 12:25
没啥实际意义啊,只要一用for()、while()这类跳转功能,反转速率一下就降下来了 ...

  是因为代码效率的原因,还是其他?   比如用IO模拟SPI,就需要用for();, 有没有办法提高代码执行速度?

出0入0汤圆

发表于 2013-5-23 19:17:41 | 显示全部楼层
还是看实际应用场合。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-7 11:25

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

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