OpenEdv-开源电子网

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

【(STM32F7】求助:STM32F746IG的IO翻转速度最大不到15MHz?

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-10-1
在线时间
3 小时
发表于 2017-10-5 16:17:32 | 显示全部楼层 |阅读模式
1金钱
硬件:秉火(还是*火)的STM32F746核心板(两个双排针+W25Q128+SDRAM_IS42S16400J-7TLI),有一个小蓝LED和一个红色电源指示LED
软件:IAR7.5+JLINK V9 SWD
代码:一段简单的测试GPIO翻转的小程序:

int main(void)
{
        /* 1. Enable the CPU Cache */
        CPU_CACHE_Enable();

        /* This sample code shows how to use GPIO HAL API to toggle GPIOA-GPIO_PIN_5 IO
            in an infinite loop. It is possible to connect a LED between GPIOA-GPIO_PIN_5
            output and ground via a 330ohm resistor to see this external LED blink.
            Otherwise an oscilloscope can be used to see the output GPIO signal */

        /* 2. STM32F7xx HAL library initialization:
       - Configure the Flash ART accelerator
       - Systick timer is configured by default as source of time base, but user
         can eventually implement his proper time base source (a general purpose
         timer for example or other time source), keeping in mind that Time base
         duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
         handled in milliseconds basis.
       - Set NVIC Group Priority to 4
       - Low Level Initialization
        */
        HAL_Init();

        /* 3. Configure the system clock to 216 MHz */
        SystemClock_Config();

        /* 4. Enable GPIO Clock (to be able to program the configuration registers) */
        __HAL_RCC_GPIOA_CLK_ENABLE();

        /* 5. Configure IO in output push-pull mode to drive external LEDs */
        GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull  = GPIO_PULLUP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

        GPIO_InitStruct.Pin = GPIO_PIN_5;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

        /* 6. Toggle IO in an infinite loop */
        while (1)
        {
                GPIOA->BSRR = GPIO_PIN_5;
                (void)GPIOA->BSRR;
                GPIOA->BSRR = ((uint32_t)GPIO_PIN_5 << 16);
                (void)GPIOA->BSRR;
                /* 中间有很多这样的翻转语句 */
                GPIOA->BSRR = GPIO_PIN_5;
                (void)GPIOA->BSRR;
                GPIOA->BSRR = ((uint32_t)GPIO_PIN_5 << 16);
                (void)GPIOA->BSRR;
        }
}


用示波器看到,只有不到15MHz的翻转频率。

如果去掉       
(void)GPIOA->BSRR;
就比较奇怪,大部分处于1.5V左右的中间电平状态,偶尔蹦出一个高电平或低电平来。

有谁知道是怎么回事吗?

最佳答案

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

重复贴,论坛搜索找答案
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-10-5 16:17:33 | 显示全部楼层
重复贴,论坛搜索找答案
回复

使用道具 举报

5

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2015-3-2
在线时间
36 小时
发表于 2017-10-5 21:46:34 | 显示全部楼层
不知道你这个GPIO有没有接外设,如果有外设的话可能是外设引起的,你可以用一个悬空的GPIO直接接示波器观察
回复

使用道具 举报

头像被屏蔽

106

主题

157

帖子

0

精华

禁止访问

积分
1263
金钱
1263
注册时间
2014-3-7
在线时间
90 小时
发表于 2017-10-6 09:19:51 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-10-1
在线时间
3 小时
 楼主| 发表于 2017-10-6 10:06:51 | 显示全部楼层
飞羽无痕 发表于 2017-10-5 21:46
不知道你这个GPIO有没有接外设,如果有外设的话可能是外设引起的,你可以用一个悬空的GPIO直接接示波器观察

没有接外设,就是用作单纯的GPIO。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-10-1
在线时间
3 小时
 楼主| 发表于 2017-10-6 10:13:58 | 显示全部楼层
liu1028tao 发表于 2017-10-6 09:19
(void)GPIOA->BSRR; 这句是不是做延时用的呀,感觉它什么实际作用的样子

这个“(void)GPIOA->BSRR;”的作用是仅仅读一下GPIOA的寄存器,但不做任何处理。就像USART口清除接收中断一样,读一下USARTx->SR,形式就是(void)USARTx->SR;

在这里,如果不读一下GPIO的寄存器,它的输出好像还没来得及完全开通IO口的上下MOS管就又关闭了,导致其波形在1.5V左右的电平上下波动。但如果读一下,就能完全打开上下MOS管,从而输出正常的高低电平。
回复

使用道具 举报

4

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2017-3-11
在线时间
78 小时
发表于 2017-10-6 10:51:15 | 显示全部楼层
100mHZ
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-10-1
在线时间
3 小时
 楼主| 发表于 2017-10-6 11:34:37 | 显示全部楼层

大侠,你能达到100MHz吗?

有别的什么设置,或者硬件上有什么要求我没达到吗?
回复

使用道具 举报

4

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2017-3-11
在线时间
78 小时
发表于 2017-10-6 17:24:24 | 显示全部楼层
你猜 啊啊啊啊啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-10-8 19:42:28 | 显示全部楼层
IO反转速度都不快的。
要快用PWM,或者FMC,或者DCMI之类的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
849
金钱
849
注册时间
2017-6-18
在线时间
166 小时
发表于 2017-10-9 06:10:30 来自手机 | 显示全部楼层
扯蛋,M3模拟SPI都能有30M以上。没什么好说的,代码效率低,IO要绝对杜绝,各种等效电阻,电容,电感效应,示波器表笔也用银线的,否则25M以上的测量,都会很扯蛋
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-10-1
在线时间
3 小时
 楼主| 发表于 2017-10-9 09:32:23 | 显示全部楼层
wlq19911021 发表于 2017-10-9 06:10
扯蛋,M3模拟SPI都能有30M以上。没什么好说的,代码效率低,IO要绝对杜绝,各种等效电阻,电容,电感效应, ...

要照您这么说的话,那么用普通示波器是无法测量出IO口高于25MHz的输出频率的。实际上用PWM输出,可以直接测量到36MHz的波形,只不过波形不是方波而已。
回复

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
849
金钱
849
注册时间
2017-6-18
在线时间
166 小时
发表于 2017-10-10 07:31:52 来自手机 | 显示全部楼层
xzrsh 发表于 2017-10-9 09:32
要照您这么说的话,那么用普通示波器是无法测量出IO口高于25MHz的输出频率的。实际上用PWM输出,可以直接 ...

51都能10几M的波
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-18 17:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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