请选择 进入手机版 | 继续访问电脑版

硬汉嵌入式论坛

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

[有问必答] SPI屏用DMA刷屏问题

[复制链接]

10

主题

18

回帖

48

积分

新手上路

积分
48
发表于 2022-4-1 16:12:57 | 显示全部楼层 |阅读模式
手里有块ST7789驱动的240*240分辨率LCD屏,spi时钟42M,也就是说理论最大刷屏速度有40多帧,不用DMA刷屏太慢了,只有11帧左右,然而DMA一次只能传输65535个字节,整个屏16色一共有240*240*16=115200字节,得分两次刷,也就是说一次最多刷2048个RGB565的像素,问题是,发现每次DMA传完数据后,必须要延时几毫秒才能开始下一次传输,检测完成标志位,死等spi传输完成中断都设了都不行,一定要延时比如我这里
image.png


一定要延时9ms,少1ms都不行,要不然就算触发传输完成中断或者检测到完成标志位,剩下色块也刷不出来,是我这里检测的标志位不对吗?我测了一下,DMA刷屏差不多能达到37帧。st7789最高SPI频率最高有80M,我用ESP32刷屏能达到78帧的速度,应该不是屏幕的问题吧。


正好一直有个疑惑,hal库给的SPI库函数,cubemx里明明能配置一次传输16字节的,hal库函数给的变量只有uint8_t*这样的
HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)

如果我要传一个16位数据,比如这里是color_buf1写成这样
HAL_SPI_Transmit_DMA(&hspi1,(uint8_t*)color_buf1,s);
强制转换后会影响结果么,比如说16位传成8位了。求解
回复

使用道具 举报

23

主题

1401

回帖

1470

积分

至尊会员

积分
1470
发表于 2022-4-1 16:20:24 | 显示全部楼层
本帖最后由 missfox 于 2022-4-1 16:21 编辑

从楼主第1句话来看,已经理解错了。

DMA一次只能传输65535个字节, 这里不对,应该加上前缀,DMA位宽是8bit时,是这么多,那么16bit是多少,32bit是多少呢,楼主自己算下。
代码不规范,亲人两行泪!
回复

使用道具 举报

10

主题

18

回帖

48

积分

新手上路

积分
48
 楼主| 发表于 2022-4-1 19:32:19 | 显示全部楼层
missfox 发表于 2022-4-1 16:20
从楼主第1句话来看,已经理解错了。

DMA一次只能传输65535个字节, 这里不对,应该加上前缀,DMA位宽是8 ...

一次刷2048像素是我说错了,应该是一次刷最多刷32768像素,差不多是240*136,但RGB565,240*240的屏的字节数是115200字节没错呀,dma一次上限65536字节,就是要分两次刷吧,DMA设置8位能传65536次,16位就是32768,32位再减半,这我知道
回复

使用道具 举报

330

主题

2022

回帖

3017

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3017
发表于 2022-4-2 08:05:15 | 显示全部楼层
spear47 发表于 2022-4-1 19:32
一次刷2048像素是我说错了,应该是一次刷最多刷32768像素,差不多是240*136,但RGB565,240*240的屏的字 ...

DMA的传输次数与数据宽度没有关系的。
不论是字节,还是半字,全字(32bit),都可以达到65536次。
回复

使用道具 举报

207

主题

1033

回帖

1664

积分

至尊会员

More we do, more we can do.

积分
1664
发表于 2022-4-2 10:17:40 | 显示全部楼层
奢侈啊,双显存设计,增量刷新不行吗?
回复

使用道具 举报

10

主题

18

回帖

48

积分

新手上路

积分
48
 楼主| 发表于 2022-4-2 11:50:58 | 显示全部楼层
caicaptain2 发表于 2022-4-2 08:05
DMA的传输次数与数据宽度没有关系的。
不论是字节,还是半字,全字(32bit),都可以达到65536次。

是我理解错了吗,官方库函数里有一段对dma传输次数的描述

  * @param  Counter: Number of data units to be transferred (from 0 to 65535)
  *          Number of data items depends only on the Peripheral data format.
  *            
  * @note   If Peripheral data format is Bytes: number of data units is equal
  *         to total number of bytes to be transferred.
  *           
  * @note   If Peripheral data format is Half-Word: number of data units is  
  *         equal to total number of bytes to be transferred / 2.
  *           
  * @note   If Peripheral data format is Word: number of data units is equal
  *         to total  number of bytes to be transferred / 4.

意思不是传半字传输次数要减半,传全字要再减半吗
回复

使用道具 举报

207

主题

1033

回帖

1664

积分

至尊会员

More we do, more we can do.

积分
1664
发表于 2022-4-2 14:23:21 | 显示全部楼层
库函数的描述是准确的,你理解的有偏差。

建议:
1 如果你不需要释放MCU,等待时选择阻塞接口:HAL_DMA_PollForTransfer
2 新品MCU DMA和查询式发送效率通常差不多,可以选择HAL_SPI_Transmit
回复

使用道具 举报

207

主题

1033

回帖

1664

积分

至尊会员

More we do, more we can do.

积分
1664
发表于 2022-4-2 14:29:55 | 显示全部楼层
另,软件延时9ms,x11Hz=99ms,每秒占比不大,我感觉它不是主要原因。
回复

使用道具 举报

10

主题

18

回帖

48

积分

新手上路

积分
48
 楼主| 发表于 2022-4-3 22:13:03 | 显示全部楼层
emwin 发表于 2022-4-2 14:23
库函数的描述是准确的,你理解的有偏差。

建议:

谢谢我再试试
回复

使用道具 举报

7

主题

48

回帖

69

积分

初级会员

积分
69
发表于 2023-5-15 12:14:56 | 显示全部楼层

成功了吗?我刷1.3  240*240没成功
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105914
QQ
发表于 2023-5-16 00:21:57 | 显示全部楼层
KAIXIN 发表于 2023-5-15 12:14
成功了吗?我刷1.3  240*240没成功

你刷的ST7789吗,这个我们有例子。
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2023-9-4 09:33:55 | 显示全部楼层
eric2013 发表于 2023-5-16 00:21
你刷的ST7789吗,这个我们有例子。

硬汉哥,没看到,链接发下
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
105914
QQ
发表于 2023-9-4 11:42:54 | 显示全部楼层
livzon 发表于 2023-9-4 09:33
硬汉哥,没看到,链接发下

下载此贴里面APP或者BOOT V1.X的例子,使用的LCD就是ST7789
https://www.armbbs.cn/forum.php?mod=viewthread&tid=95468
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 20:05 , Processed in 0.246091 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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