硬汉嵌入式论坛

 找回密码
 立即注册
查看: 10189|回复: 33
收起左侧

[功能实战] 实现H7-TOOL的IPS屏SPI DMA优化,每秒55帧

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2019-11-29 09:10:27 | 显示全部楼层 |阅读模式
H7-TOOL的240*240的IPS屏性能测试,16位色刷新整个屏
1、模拟SPI方式,一屏时间60多ms
2、硬件SPI,发送16bit数据,40多ms
3、硬件SPI,发送32bit数据,30多ms
4、SPI DMA方式,18ms左右。


视频效果展示
https://weibo.com/tv/v/IipQtCTL1?fid=1034:4443892225870271


1.gif



评分

参与人数 1金币 +10 收起 理由
蚍蜉游记 + 10 赞一个!

查看全部评分

回复

使用道具 举报

7

主题

85

回帖

111

积分

初级会员

积分
111
发表于 2019-11-29 09:54:30 | 显示全部楼层
18ms一屏,也就是达到了55.5HZ了,速度不错了
回复

使用道具 举报

0

主题

36

回帖

36

积分

新手上路

积分
36
发表于 2019-11-29 10:21:29 | 显示全部楼层
简单算了下,就算是SPI无间隔传输,55帧刷新时SCK频率也要超过50MHz了,这么高的频率SPI传输稳定吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-11-29 10:27:01 | 显示全部楼层
小志 发表于 2019-11-29 10:21
简单算了下,就算是SPI无间隔传输,55帧刷新时SCK频率也要超过50MHz了,这么高的频率SPI传输稳定吗

不仅稳定,而且可以跟USB2.0高速虚拟网卡搞的1024*600分辨率显示屏同时刷新。
回复

使用道具 举报

23

主题

1404

回帖

1473

积分

至尊会员

积分
1473
发表于 2019-11-29 10:56:01 | 显示全部楼层
生猛,我的TOOL今天发货喽,哈哈
代码不规范,亲人两行泪!
回复

使用道具 举报

6

主题

76

回帖

94

积分

初级会员

积分
94
发表于 2019-11-29 14:10:24 | 显示全部楼层
missfox 发表于 2019-11-29 10:56
生猛,我的TOOL今天发货喽,哈哈

我的还没有,难不成等到明天(这个月最后一天)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-11-29 15:08:34 | 显示全部楼层
buxinshan 发表于 2019-11-29 14:10
我的还没有,难不成等到明天(这个月最后一天)

还正在发货中,估计2-3天发货完成,已经发了100多个。
回复

使用道具 举报

6

主题

76

回帖

94

积分

初级会员

积分
94
发表于 2019-11-29 16:12:11 | 显示全部楼层
eric2013 发表于 2019-11-29 15:08
还正在发货中,估计2-3天发货完成,已经发了100多个。

淘宝更新状态:15:25已经发货了。耶耶耶!!!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2019-11-29 17:59:28 | 显示全部楼层
buxinshan 发表于 2019-11-29 16:12
淘宝更新状态:15:25已经发货了。耶耶耶!!!

回复

使用道具 举报

2

主题

14

回帖

20

积分

新手上路

积分
20
发表于 2020-5-24 08:39:29 | 显示全部楼层
你好,我买了一个中景园ST7789 1.3寸的单线SPI屏,硬件SPI,刷屏很慢,用的F407的spi跑满了42MHz,请问可能是什么原因,F407有这个屏的快刷方案吗?
回复

使用道具 举报

2

主题

14

回帖

20

积分

新手上路

积分
20
发表于 2020-5-24 08:41:11 | 显示全部楼层
你好,硬汉,F407硬件SPI1 42Mhz刷屏还是明显看到换页,用的也是中景园IPS屏,ST7789 1.3寸 240*240,能帮忙看下哪里错了吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-5-24 08:43:50 | 显示全部楼层
JimmyKudo 发表于 2020-5-24 08:41
你好,硬汉,F407硬件SPI1 42Mhz刷屏还是明显看到换页,用的也是中景园IPS屏,ST7789 1.3寸 240*240,能帮 ...

参考我们H7-TOOL的APP代码:

http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

2

主题

14

回帖

20

积分

新手上路

积分
20
发表于 2020-5-24 08:45:38 | 显示全部楼层
你好,硬汉哥,我用F407的SPI1刷这个中景园240*240屏很慢,能明显看到换页,请问是哪里需要优化?麻烦看一下可以吗
  1. //这是SPI1的初始化  42MHz
  2. void MX_SPI1_Init(void)
  3. {

  4.   hspi1.Instance = SPI1;
  5.   hspi1.Init.Mode = SPI_MODE_MASTER;
  6.   hspi1.Init.Direction = SPI_DIRECTION_1LINE;
  7.   hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  8.   hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
  9.   hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  10.   hspi1.Init.NSS = SPI_NSS_SOFT;
  11.   hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
  12.   hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  13.   hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  14.   hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  15.   hspi1.Init.CRCPolynomial = 10;
  16.   if (HAL_SPI_Init(&hspi1) != HAL_OK)
  17.   {
  18.     Error_Handler();
  19.   }

  20. }
  21. //这个是SPI快发
  22. static void ST7789_SendByteQuick(uint8_t data)
  23. {
  24.         HAL_SPI_Transmit(&hspi1,&data,1,1);
  25. }
复制代码
回复

使用道具 举报

2

主题

14

回帖

20

积分

新手上路

积分
20
发表于 2020-5-24 08:47:45 | 显示全部楼层
eric2013 发表于 2020-5-24 08:43
参考我们H7-TOOL的APP代码:

http://www.armbbs.cn/forum.php?mod=viewthread&tid=95468&extra=page%3 ...

H7和F407是有区别的吧,请问硬汉哥,硬件SPI刷屏跑的多少Mhz
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-5-24 09:02:24 | 显示全部楼层
JimmyKudo 发表于 2020-5-24 08:47
H7和F407是有区别的吧,请问硬汉哥,硬件SPI刷屏跑的多少Mhz

我们H7-TOOL的实现是这样的,硬件SPI DMA方式,速度是100MHz,然后开了一个240*240*2的缓存区,DMA就是刷新这个缓存区数据到显示屏,DMA循环或者单次均可。用户要更新数据,仅需往这个缓存区添加数据即可。
回复

使用道具 举报

2

主题

14

回帖

20

积分

新手上路

积分
20
发表于 2020-5-24 11:06:41 | 显示全部楼层
eric2013 发表于 2020-5-24 09:02
我们H7-TOOL的实现是这样的,硬件SPI DMA方式,速度是100MHz,然后开了一个240*240*2的缓存区,DMA就是刷 ...

感谢白总的讲解,HAL库直接刷屏确实要慢好多。。。。。。大概优化了下,目前刷屏快很多,
  1. void SPI_FAST_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData)
  2. {
  3.   hspi->State       = HAL_SPI_STATE_BUSY_TX;
  4.   hspi->ErrorCode   = HAL_SPI_ERROR_NONE;
  5.   hspi->pTxBuffPtr  = (uint8_t *)pData;
  6.   hspi->TxXferSize  = 1;
  7.   hspi->TxXferCount = 1;

  8.   SPI_1LINE_TX(hspi);
  9.   __HAL_SPI_ENABLE(hspi);

  10.   *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr);
  11.   hspi->pTxBuffPtr += sizeof(uint8_t);
  12.   hspi->TxXferCount--;

  13.   hspi->State = HAL_SPI_STATE_READY;
  14. }
复制代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2020-5-25 11:13:12 | 显示全部楼层
JimmyKudo 发表于 2020-5-24 11:06
感谢白总的讲解,HAL库直接刷屏确实要慢好多。。。。。。大概优化了下,目前刷屏快很多,

你可以把DMA整上,效果更好。
回复

使用道具 举报

2

主题

14

回帖

20

积分

新手上路

积分
20
发表于 2020-5-25 20:25:02 | 显示全部楼层
eric2013 发表于 2020-5-25 11:13
你可以把DMA整上,效果更好。

嗯,DMA配合显存比较好,我这个ram不太够
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2020-6-4 15:57:05 | 显示全部楼层
JimmyKudo 发表于 2020-5-24 08:45
你好,硬汉哥,我用F407的SPI1刷这个中景园240*240屏很慢,能明显看到换页,请问是哪里需要优化?麻烦看一 ...

刷屏慢是因为HAL的库函数只适合刷大数组,在函数里发送数据之前有大量的检查是否符合发送条件的代码,你用这个函数发单个数据会很慢。可以参考HAL的库函数自己另外写一个,去掉前面各种检查,提出出它核心的部分就行。
回复

使用道具 举报

3

主题

73

回帖

82

积分

初级会员

积分
82
发表于 2021-1-18 20:31:40 | 显示全部楼层
eric2013 发表于 2020-5-24 09:02
我们H7-TOOL的实现是这样的,硬件SPI DMA方式,速度是100MHz,然后开了一个240*240*2的缓存区,DMA就是刷 ...

我没那么大缓存。。。。就普通M0。基本废了。。。。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2021-1-19 07:58:52 | 显示全部楼层
lifeng5478 发表于 2021-1-18 20:31
我没那么大缓存。。。。就普通M0。基本废了。。。。。

可以考虑实现分段式。
回复

使用道具 举报

3

主题

73

回帖

82

积分

初级会员

积分
82
发表于 2021-1-22 10:20:40 | 显示全部楼层
eric2013 发表于 2021-1-19 07:58
可以考虑实现分段式。

分段式是啥意思?我的RAM只能用15K给到显示器,我有个0.96的TFT,需要大概25KRAM,怎么做分段?汉哥
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2021-1-22 17:04:42 | 显示全部楼层
lifeng5478 发表于 2021-1-22 10:20
分段式是啥意思?我的RAM只能用15K给到显示器,我有个0.96的TFT,需要大概25KRAM,怎么做分段?汉哥

比如将界面整体分为10段,每段都整体刷新。
回复

使用道具 举报

3

主题

73

回帖

82

积分

初级会员

积分
82
发表于 2021-1-24 16:52:05 | 显示全部楼层
eric2013 发表于 2021-1-22 17:04
比如将界面整体分为10段,每段都整体刷新。

哇,你好像点醒了我,就是用SWITCH做个状态机去刷每一段,切换状态机用每一段的位置去做切换
回复

使用道具 举报

3

主题

73

回帖

82

积分

初级会员

积分
82
发表于 2021-1-24 17:36:37 | 显示全部楼层
eric2013 发表于 2021-1-22 17:04
比如将界面整体分为10段,每段都整体刷新。

倒是的确可以显示,但是效果不太理想,RAM需要重用,必须刷一段显示一段,清空后再刷第二段。不能一直刷
回复

使用道具 举报

3

主题

90

回帖

99

积分

初级会员

积分
99
发表于 2021-7-13 09:19:27 | 显示全部楼层
lifeng5478 发表于 2021-1-24 17:36
倒是的确可以显示,但是效果不太理想,RAM需要重用,必须刷一段显示一段,清空后再刷第二段。不能一直刷

看你是显示什么内容了,如果是文字,只刷新变化的那一行的。其他的就跳过。
回复

使用道具 举报

3

主题

90

回帖

99

积分

初级会员

积分
99
发表于 2021-7-13 15:01:10 | 显示全部楼层
1、模拟SPI方式,一屏时间60多ms
回复

使用道具 举报

3

主题

90

回帖

99

积分

初级会员

积分
99
发表于 2021-7-13 15:02:14 | 显示全部楼层
1、模拟SPI方式,一屏时间60多ms,我用STM32F103,只能做到1秒8帧,240*240
回复

使用道具 举报

3

主题

90

回帖

99

积分

初级会员

积分
99
发表于 2021-7-13 15:43:11 | 显示全部楼层
C:\Users\28000313\Desktop
回复

使用道具 举报

3

主题

90

回帖

99

积分

初级会员

积分
99
发表于 2021-7-13 15:44:53 | 显示全部楼层
SPI时序,CS操作有600ns。有没有办法提高速度

SPI时序

SPI时序
回复

使用道具 举报

3

主题

90

回帖

99

积分

初级会员

积分
99
发表于 2021-7-13 15:50:37 | 显示全部楼层
lib钱 发表于 2021-7-13 15:44
SPI时序,CS操作有600ns。有没有办法提高速度

芯片是STM32F103
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2021-7-13 16:13:56 | 显示全部楼层

你现在没有上DMA方式吗,可以上DMA,然后SPI开最高时钟速度
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2021-8-9 17:41:55 | 显示全部楼层
我在STM32L431@80Mhz,没开DMA,SPI速率开到最大,刷到了24ms
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
 楼主| 发表于 2021-8-10 08:49:49 | 显示全部楼层
mculover666 发表于 2021-8-9 17:41
我在STM32L431@80Mhz,没开DMA,SPI速率开到最大,刷到了24ms

速度不错。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 20:08 , Processed in 0.351847 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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