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:21 编辑
从楼主第1句话来看,已经理解错了。
DMA一次只能传输65535个字节, 这里不对,应该加上前缀,DMA位宽是8bit时,是这么多,那么16bit是多少,32bit是多少呢,楼主自己算下。 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位再减半,这我知道 spear47 发表于 2022-4-1 19:32
一次刷2048像素是我说错了,应该是一次刷最多刷32768像素,差不多是240*136,但RGB565,240*240的屏的字 ...
DMA的传输次数与数据宽度没有关系的。
不论是字节,还是半字,全字(32bit),都可以达到65536次。 奢侈啊,双显存设计,增量刷新不行吗? 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.
意思不是传半字传输次数要减半,传全字要再减半吗 库函数的描述是准确的,你理解的有偏差。
建议:
1 如果你不需要释放MCU,等待时选择阻塞接口:HAL_DMA_PollForTransfer
2 新品MCU DMA和查询式发送效率通常差不多,可以选择HAL_SPI_Transmit
另,软件延时9ms,x11Hz=99ms,每秒占比不大,我感觉它不是主要原因。 emwin 发表于 2022-4-2 14:23
库函数的描述是准确的,你理解的有偏差。
建议:
谢谢我再试试 spear47 发表于 2022-4-3 22:13
谢谢我再试试
成功了吗?我刷1.3240*240没成功 KAIXIN 发表于 2023-5-15 12:14
成功了吗?我刷1.3240*240没成功
你刷的ST7789吗,这个我们有例子。 eric2013 发表于 2023-5-16 00:21
你刷的ST7789吗,这个我们有例子。
硬汉哥,没看到,链接发下 livzon 发表于 2023-9-4 09:33
硬汉哥,没看到,链接发下
下载此贴里面APP或者BOOT V1.X的例子,使用的LCD就是ST7789
https://www.armbbs.cn/forum.php?mod=viewthread&tid=95468
页:
[1]