打印
[STM32F3]

STM32 程序运行比预期慢,什么原因导致程序运行时钟不等于系统时钟?

[复制链接]
4664|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#菜鸟#|  楼主 | 2018-10-18 14:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
8MHZ内部晶振,配置时钟64MHZ(SPI 8分频,SPI_CLK频率7.58MHZ,说明64MHZ是正确的),程序中while(1){不延时,引脚电平翻转},引脚为高速模式(最大可以到50MHZ),但是引脚实际翻转频率只有4MHZ
PA8输出系统时钟,示波器测定为62.5MHZ
HAL_RCC_MCOConfig(RCC_MCO1,RCC_MCO1SOURCE_SYSCLK,RCC_MCODIV_1);
但是
while(1)
{
SPILCD_CS_SET;
SPILCD_CS_RESET;
}输出50%占空比方波,测定高电平296ns----3.38MHZ
沙发
#菜鸟#|  楼主 | 2018-10-18 14:59 | 只看该作者
本帖最后由 #菜鸟# 于 2018-10-18 15:01 编辑

请问stm32f373,一个IO指令需要多少个机器周期?

使用特权

评论回复
板凳
mohanwei| | 2018-10-18 15:53 | 只看该作者
你理解错了。IO翻转本身速率有限

使用特权

评论回复
地板
Diyer2015| | 2018-10-18 16:37 | 只看该作者
典型的嘴巴跟不上大脑的现象!

使用特权

评论回复
5
Diyer2015| | 2018-10-18 16:37 | 只看该作者
大脑转得飞快
嘴巴不利索,不是说相声的!

使用特权

评论回复
6
#菜鸟#|  楼主 | 2018-10-18 16:38 | 只看该作者
本帖最后由 #菜鸟# 于 2018-10-18 16:40 编辑
mohanwei 发表于 2018-10-18 15:53
你理解错了。IO翻转本身速率有限

PIN脚设为高速模式,IO翻转不是最大能达到50MHZ吗?多谢回答,但我还是有些不太懂,虽然大于30MHZ输出波形波形就不是干净的方波了,因为PA8能输出62.5MHZ

使用特权

评论回复
7
#菜鸟#|  楼主 | 2018-10-18 16:47 | 只看该作者
Diyer2015 发表于 2018-10-18 16:37
大脑转得飞快
嘴巴不利索,不是说相声的!

那SPI采用2分频,CLK是能输出30MHZ的波形的,说明IO的速度应该能跟上吧?但是不知道主程序中输出频率为什么就降低了,我想做TFT彩屏的,现在刷新频率很低,刷新1帧差不多要0.5s,我是移植stm32F030的程序,时钟没变,但是刷新1副图片就变慢了

使用特权

评论回复
8
arm86| | 2018-10-18 20:37 | 只看该作者
执行 while(1) 也是需要时间的,要跳转。
里面多放一些:
  SPILCD_CS_SET;
  SPILCD_CS_RESET;
这样大概能够测得 60ns 的周期,合着也就是 16MHz 多点。

使用特权

评论回复
9
#菜鸟#|  楼主 | 2018-10-19 08:47 | 只看该作者
arm86 发表于 2018-10-18 20:37
执行 while(1) 也是需要时间的,要跳转。
里面多放一些:
  SPILCD_CS_SET;

谢谢回复,虽然我也希望是这样,但是,我在循环中加20多条翻转指令(引脚配置为高速输出模式),观察波形,频率变化不大,基本上还是4MHZ,PLL时钟应该是配置正确的,(SPI4分频后CLK引脚有16MHZ波形),但是程序运行感觉像HSI/2=4MHZ ,

使用特权

评论回复
10
#菜鸟#|  楼主 | 2018-10-19 08:49 | 只看该作者
arm86 发表于 2018-10-18 20:37
执行 while(1) 也是需要时间的,要跳转。
里面多放一些:
  SPILCD_CS_SET;

@arm86 有测到过16MHZ波形吗?我不知道我的配置是否存在其他问题

使用特权

评论回复
11
arm86| | 2018-10-19 11:50 | 只看该作者
#菜鸟# 发表于 2018-10-19 08:49
@arm86 有测到过16MHZ波形吗?我不知道我的配置是否存在其他问题

昨天晚上顺手测了一下。
寄存器直接赋值的操作。

使用特权

评论回复
评论
#菜鸟# 2018-10-19 13:15 回复TA
额,谢谢,我用的是STM32CUBEMX生成的初始化化代码,可能有其他的问题,暂时还没找到原因 
12
#菜鸟#|  楼主 | 2018-10-19 16:09 | 只看该作者
arm86 发表于 2018-10-19 11:50
昨天晚上顺手测了一下。
寄存器直接赋值的操作。

多谢提醒,寄存器操作确实能达到18.5MHZ的波形,看来stm32库操作IO确实会牺牲很多速率,用寄存器操作能提高4倍以上的速率,函数调用可能牺牲了大部分时钟

使用特权

评论回复
13
#菜鸟#|  楼主 | 2018-10-19 16:45 | 只看该作者
arm86 发表于 2018-10-19 11:50
昨天晚上顺手测了一下。
寄存器直接赋值的操作。

感谢大佬提醒,彩屏更新速度低的问题算是解决了(通过修改库函数,删除多余的报错和超时,和一堆乱七八糟的指令,刷新频率提高了,画面稍稍流畅了一些,虽然解决方法有点歪门邪道的感觉),库函数效率确实有点低,不太适合高速的场合,再次感谢@arm86 提醒

使用特权

评论回复
14
QuakeGod| | 2018-10-20 19:22 | 只看该作者
有些地方可以不用HAL库,用LL库。

使用特权

评论回复
15
#菜鸟#|  楼主 | 2018-10-22 10:09 | 只看该作者
QuakeGod 发表于 2018-10-20 19:22
有些地方可以不用HAL库,用LL库。

以前只用过标准库,第一次接触HAL库,比较菜,LL库没用过

使用特权

评论回复
16
磨砂| | 2018-10-22 10:58 | 只看该作者
如果你是在仿真条件下 要考虑电脑的影响

使用特权

评论回复
17
晓伍| | 2018-10-22 11:15 | 只看该作者
内部晶振一般不准

使用特权

评论回复
18
八层楼| | 2018-10-22 12:05 | 只看该作者
各种延时吧  io口有延时 本身内部时钟也不是那么准

使用特权

评论回复
19
观海| | 2018-10-22 12:10 | 只看该作者
楼上是仿真的时候看的吗

使用特权

评论回复
20
#菜鸟#|  楼主 | 2018-10-22 12:19 | 只看该作者
观海 发表于 2018-10-22 12:10
楼上是仿真的时候看的吗

不是仿真,示波器看的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

16

帖子

0

粉丝