打印
[应用相关]

STM32H743IIT6 驱动ST7796S 4寸屏幕很慢。

[复制链接]
5297|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 千樱硕 于 2020-4-26 10:04 编辑

我在使用STM32H7的SPI2驱动一个320*480分辨率的4寸屏幕。发现速度非常慢。刷全屏一秒只能3到4次。所以我研究了一下ST7796S的手册。但是有些地方不明白。想问一下。
1. 传输速度
下面是ST7796S的4线SPI电特性图

我对其中的T_scycw 很不理解。这个时间他给出的出的66ns。但是下面的T_shw 和 T_slw 加起来30ns。
正常使用应该按照哪个为准呢? 如果按照T_scycw为准,那不是4线SPI推荐频率只有15Mh多一点?
2.实际使用频率。
我为STM32H7的SPI2设备设置的频率是400M输入,SPI2配置为8分频。最终SPI2的通信速度是50MBits/s. 也能正常通信。
不过就像开头说的,通信速度和显示的速度完全不匹配。我使用的16Bit颜色。这样的话
480*320*16 = ‭2,457,600‬。 也就是说我只是用同一种颜色刷屏的话。50Mbps 的速度足够刷20次了。
但是速度还是很慢。我使用STM32CubeMX配置的SPI2。配置如下

总结来说就是50MBps,8Bit数据大小,禁用FIFO,使能了端口保持
最终我用HAL库的HAL_SPI_TransmitReceive 函数每次传输1Byte数据。
最终是直接驱动LCD刷屏每秒只能刷3次左右,配置了STemWin后,进行了
画线和画矩形(DrawHline,DrawVLine,FillRect)的优化后GUI_Clear()刷屏
只有美妙2次左右。请论坛的各位熟练操作LCD屏幕的朋友帮帮我找出性能瓶颈在哪里?
3. 50MBps的通信速度有几率让画面失真。但是降到25MBps就完全没出现过这样的情况。
另外我发现很奇怪的地方,在是用50MBps的时候连续传输颜色数据,每传输16Bit就让CS端跳变两次,
就能在50MBps下正常工作。这是为什么呢? 数据手册上颜色数据是可以连续传输的。不需要CS跳变
但是刷屏的速度已经很慢了,再让速度慢一倍的话,简直不能忍受了。

使用特权

评论回复
沙发
zchong| | 2020-4-26 10:56 | 只看该作者
按照手册,写的时候,你的SPI时钟周期不应小于66ns。每次数据读写间隔要看你的程序是如何处理的,软件可能导致并不能连续访问。时钟再快,也架不住你中间休息一会儿。

使用特权

评论回复
评论
千樱硕 2020-4-26 18:54 回复TA
没有任何停顿,就是将相同的一个16颜色数据连续调用480*320次 HAL_SPI_TransmitReceive。 我去看一下HAL_SPI_TransmitReceive 的或者将FIFO打开试试,说不定是这个HAL库函数实现回导致暂时的停顿。 
板凳
caoenq| | 2020-4-26 16:55 | 只看该作者
SPI能跑到50M么?

使用特权

评论回复
评论
千樱硕 2020-4-26 18:56 回复TA
我觉得可能是楼上说的那个问题,配置成50MBps能够保证的只是在SPI在通信是速度够快。但是可能我每次调用HAL_SPI_TransmitReceive 这个函数的会花费更多的代价。周一的时候我尝试调试一下,是是打开FIFO能不能提高SPI整体的效率。 
地板
千樱硕|  楼主 | 2020-4-26 19:00 | 只看该作者
zchong 发表于 2020-4-26 10:56
按照手册,写的时候,你的SPI时钟周期不应小于66ns。每次数据读写间隔要看你的程序是如何处理的,软件可能 ...

实际上我刷屏的时候就是在for循环中调用这个自己封装的函数。

使用特权

评论回复
5
千樱硕|  楼主 | 2020-4-27 16:16 | 只看该作者
本帖最后由 千樱硕 于 2020-4-27 16:47 编辑

问题终结。
正如zchong说的,程序在用spi发送数据的时候歇了一会儿。所以单纯的追求用SPI接口的刷屏速度的话可以用DMA+FIFO,并将数据帧改为32bit一帧。
基本属于STM32H7 SPI2的最紧凑的SPI外设工作情况了。
我实验中只是在传送颜色数据的时候临时讲SPI2的数据帧改为32bit,就已经让刷屏速度提升很多。
不过最后没有解决我的困难。为什么呢? 因为STM32H7的内存不够呀。
知道是SPI外设工作不够紧凑后,我想到提高显示速度的方法就是在emwin创建整块屏幕大小的两个页面的时候临时先将颜色数据写到一块
320*480 的内存中,然后由SPI2 连续的将这些颜色数据传给LCD。
不过写完后发现STM32H7 并没有这么多内存给我用,所以只能给emwin优化一下划线函数草草了事了。emwin倒是没什么瓶颈,调用GUI_Clear()函数刷屏基本和直接刷屏速度没什么区别。
所以,最后我决定还是不自己搞显示屏了,我原本计划用一个几块钱的MCU当做CAN和SPI之间的转换,来远端驱动一个LCD。考虑到10米以上CAN只有1MBps,估计刷新速度会非常慢,还是用个串口工控屏算或者用STMF4系列中跑emwin加驱动LCD,然后和后端做采样的MCU用can通信好了。最后测试刷屏的代码

使用特权

评论回复
6
xu13402957450| | 2020-10-6 11:49 | 只看该作者
楼主你好,我最近也在看这个屏幕的驱动,也是用HAL库,我想参考下您的例程,你看方便的话,Davy_xu@outlook.com,这是我的邮箱,您要是看见了,希望您能跟我联系下,麻烦了

使用特权

评论回复
7
小灵通2018| | 2020-10-6 14:31 | 只看该作者
频率太低,还是方法问题?S

使用特权

评论回复
8
dalarang| | 2020-10-6 15:34 | 只看该作者
千樱硕 发表于 2020-4-27 16:16
问题终结。
正如zchong说的,程序在用spi发送数据的时候歇了一会儿。所以单纯的追求用SPI接口的刷屏速度的 ...

如果想把屏幕放到几米外,只能选择串口屏这类预设图形指令显示的方式。

从开始就跑偏了,SPI才多少速率啊,一秒钟能刷几帧已经很不错了。
如果距离近,倒是还可以考虑下RGB+LVDS方式

使用特权

评论回复
9
mj234556373| | 2023-8-2 11:43 | 只看该作者
支持下

使用特权

评论回复
10
Wordsworth| | 2023-12-29 07:29 | 只看该作者

模块电源选购灌封材料的时候,需要注意导热系数要能达到电子部件散热的需求,不过粘接能力不太强

使用特权

评论回复
11
Clyde011| | 2023-12-29 08:32 | 只看该作者

A、B组分先分别用手动或机械进行充分搅拌,让A、B灌封料充分融合

使用特权

评论回复
12
公羊子丹| | 2023-12-29 09:25 | 只看该作者

可能击穿开关器件,

使用特权

评论回复
13
万图| | 2023-12-29 10:28 | 只看该作者

如果想要让它正常工作且不会损坏

使用特权

评论回复
14
Uriah| | 2023-12-29 11:31 | 只看该作者

前模块电源灌封时用的最多的是加成型有机灌封硅胶

使用特权

评论回复
15
帛灿灿| | 2023-12-29 13:27 | 只看该作者

电阻属于一个普通的元件

使用特权

评论回复
16
Bblythe| | 2023-12-29 14:30 | 只看该作者

并且考虑到TVS相同的尺寸

使用特权

评论回复
17
周半梅| | 2023-12-29 16:26 | 只看该作者

当异常过压消失,恢复至高阻态

使用特权

评论回复
18
Pulitzer| | 2023-12-29 17:29 | 只看该作者

微控制器、数字信号控制器和处理器都具有内部的ESD钳位二极管

使用特权

评论回复
19
童雨竹| | 2023-12-29 19:25 | 只看该作者

ESD电压一般超过导通电压

使用特权

评论回复
20
way2888| | 2024-6-8 07:25 | 只看该作者
用STM32H7跑240MHZ,没使用DMA的情况下驱动ST7796S 3.5寸480x320能刷1帧时间在40mS,理论1秒起码20帧是没问题的

使用特权

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

本版积分规则

4

主题

21

帖子

0

粉丝