spear47 发表于 2022-4-1 16:12:57

SPI屏用DMA刷屏问题

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



一定要延时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位了。求解:shutup::hug:

missfox 发表于 2022-4-1 16:20:24

本帖最后由 missfox 于 2022-4-1 16:21 编辑

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

DMA一次只能传输65535个字节, 这里不对,应该加上前缀,DMA位宽是8bit时,是这么多,那么16bit是多少,32bit是多少呢,楼主自己算下。

spear47 发表于 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位再减半,这我知道

caicaptain2 发表于 2022-4-2 08:05:15

spear47 发表于 2022-4-1 19:32
一次刷2048像素是我说错了,应该是一次刷最多刷32768像素,差不多是240*136,但RGB565,240*240的屏的字 ...

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

emwin 发表于 2022-4-2 10:17:40

奢侈啊,双显存设计,增量刷新不行吗?

spear47 发表于 2022-4-2 11:50:58

caicaptain2 发表于 2022-4-2 08:05
DMA的传输次数与数据宽度没有关系的。
不论是字节,还是半字,全字(32bit),都可以达到65536次。

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

* @paramCounter: 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 totalnumber of bytes to be transferred / 4.

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

emwin 发表于 2022-4-2 14:23:21

库函数的描述是准确的,你理解的有偏差。

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

emwin 发表于 2022-4-2 14:29:55

另,软件延时9ms,x11Hz=99ms,每秒占比不大,我感觉它不是主要原因。

spear47 发表于 2022-4-3 22:13:03

emwin 发表于 2022-4-2 14:23
库函数的描述是准确的,你理解的有偏差。

建议:


谢谢我再试试

KAIXIN 发表于 2023-5-15 12:14:56

spear47 发表于 2022-4-3 22:13
谢谢我再试试

成功了吗?我刷1.3240*240没成功

eric2013 发表于 2023-5-16 00:21:57

KAIXIN 发表于 2023-5-15 12:14
成功了吗?我刷1.3240*240没成功

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

livzon 发表于 2023-9-4 09:33:55

eric2013 发表于 2023-5-16 00:21
你刷的ST7789吗,这个我们有例子。

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

eric2013 发表于 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
页: [1]
查看完整版本: SPI屏用DMA刷屏问题