任何将绘图缓冲到 CY8CKIT-028-TFT 的方法

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

我正在尝试使用 CY8CKIT-028-TFT 来显示移动图像。 我举了一个图形化的 Hello World 例子(好吧,严格来说"我感觉不错!",不是"你好世界!")来自 modusToolBox 101 第 2 章,我已经使用了它并对 emWin 界面有了基本的了解来让动画正常工作。

我的问题是,我画的所有内容都会立即发送到屏幕上,显示所有中间步骤,这既效率低下又分散注意力。 有没有办法(无论是在TFT的硬件中,还是在emWin库中的软件中)来缓存/缓冲绘图,这样只有在完成一帧的绘图时才会将内容发送到TFT屏幕? 还是想要移动方块的客户如果想最大限度地减少闪烁,则负责擦除后缘并绘制前缘?

0 点赞
6 回复数
Translation_Bot
Community Manager
Community Manager
Community Manager

嗨 @KeithS_76

这个问题主要是由于显示接口的帧速率低。 有几种方法可以解决这个问题。 以下是我对提高性能的解释。

PSOC 6 没有用于连接 TFT 显示屏的专用接口。 但是显示器 CAN 接口使用 GPIO 位敲击方法,有时也使用 TCPWM。 CY8CKIT-028-TFT 具有 240x320 分辨率的 TFT 面板,可通过并行接口连接到任何微控制器。 显示引脚连接到 Arduino 兼容接头,如 图 1 中用绿色标记的那样。

 

Bhamy_0-1691659893632.png

 

1 CY8CKIT-028-TFT Arduino 针座引脚排列

一些PSOC 6评估套件的设计方式是,屏蔽 CAN 直接插入EVK,显示器 CAN 通过在软件中实现驱动功能来驱动。 CY8CKIT-062-WIFI-BT 具有Arduino兼容接头  CAN 连接到TFT屏蔽 板,如图2所示, 引脚连接如 表1所示

1 CY8CKIT-028-TFT 和 CY8CKIT-062-WIFI-BT 显示连接详细信息

 

CY8CKIT-028-TFT

CY8CKIT-062-WIFI-BT

重置

TFT_DISP_RST_L

P12_2

数据/命令

TFT_DISP_D/C

P12_1

写入启用

TFT_DISP_WR_L

P12_0

读取启用

TFT_DISP_RD_L

P12_3

Data 15

TFT_DISP_DB15

P13_1

Data 14

TFT_DISP_DB14

P13_0

Data 13

TFT_DISP_DB13

P0_2

Data 12

TFT_DISP_DB12

P9_5

Data 11

TFT_DISP_DB11

P9_4

Data 10

TFT_DISP_DB10

P9_2

数据 9

TFT_DISP_DB9

P9_1

数据 8

TFT_DISP_DB8

P9_0

 

 

Bhamy_1-1691659893640.png

 

2 CY8CKIT-062-WIFI-BT Arduino 接头引脚排列

项目中需要包含英飞凌 Github 中可用的显示驱动程序(display-tft-st7789v)以及像 emWin 这样的图形库来驱动显示器。

当前的显示写入函数 (A) 实现如下代码片段:

static inline void write_data(uint8_t data)
{
    cyhal_gpio_write(pins->db08,  data     & 0x01);
    cyhal_gpio_write(pins->db09, (data>>1) & 0x01);
    cyhal_gpio_write(pins->db10, (data>>2) & 0x01);
    cyhal_gpio_write(pins->db11, (data>>3) & 0x01);
    cyhal_gpio_write(pins->db12, (data>>4) & 0x01);
    cyhal_gpio_write(pins->db13, (data>>5) & 0x01);
    cyhal_gpio_write(pins->db14, (data>>6) & 0x01);
    cyhal_gpio_write(pins->db15, (data>>7) & 0x01);
    cyhal_gpio_write(pins->nwr, 0u);
    cyhal_gpio_write(pins->nwr, 1u);
}

 

数据中的每个位均在相应的位置移动,并将位值设置为数据 (GPIO) 引脚。 这个实现会起作用,但它对性能的影响非常严重。

为了提高性能,需要将数据写入相应的 GPIO 端口寄存器 (B)。

#define PORT9_MSK_1              0x07
#define PORT9_MSK_2              0x18
#define PORT9_MSK_2_SHIFT        1
#define PORT0_MSK_1              0x20
#define PORT0_MSK_1_SHIFT        3
#define PORT13_MSK_1             0xC0
#define PORT13_MSK_1_SHIFT       6

static inline void write_data(uint8_t data)
{
       GPIO_PRT9->OUT = ((data & PORT9_MSK_2)<OUT = ((data & PORT0_MSK_1)>>PORT0_MSK_1_SHIFT);
       GPIO_PRT13->OUT = ((data & PORT13_MSK_1)>>PORT13_MSK_1_SHIFT);   
       GPIO_PORT_12->OUT_SET = 0x01;
       GPIO_PORT_12->OUT_CLR = 0x01;
}

 

通过上述实现,显示性能比以前更好。

还有其他选项可以通过更改硬件路由来提高性能。 表 2 显示了进一步提高显示性能所需的硬件更改。

2 显示屏的优化硬件连接

 

CY8CKIT-028-TFT

CY8CKIT-062-WIFI-BT

重置

TFT_DISP_RST_L

P12_2

数据/命令

TFT_DISP_D/C

P12_1

写入启用

TFT_DISP_WR_L

P12_0

读取启用

TFT_DISP_RD_L

P12_3

Data 15

TFT_DISP_DB15

P9_7

Data 14

TFT_DISP_DB14

P9_6

Data 13

TFT_DISP_DB13

P9_5

Data 12

TFT_DISP_DB12

P9_4

Data 11

TFT_DISP_DB11

J2_P9_3

Data 10

TFT_DISP_DB10

P9_2

数据 9

TFT_DISP_DB9

P9_1

数据 8

TFT_DISP_DB8

P9_0

 

通过此次硬件更改,驱动程序 (C) 将得到简化,如下所示:

static inline void write_data(uint8_t data)
{
    GPIO_PRT9->OUT = data;
    GPIO_PORT_12->OUT_SET = 0x01;
    GPIO_PORT_12->OUT_CLR = 0x01;
}

 

通过这些更改,实现了 48.95 Hz 的显示帧速率。

也可以通过在 for 循环中添加 write_data 功能来调用和消除函数。 为了进一步减少 for 循环开销驱动程序 (D), CAN 通过减少由于 for 循环引起的检查次数来进一步优化,如以下代码片段所示:

    for (i = 0; i < num; i+=4)
    {
       GPIO_PRT9->OUT = data[i];
       GPIO_PRT12->OUT_CLR = 1;
       GPIO_PRT12->OUT_SET = 1;

       GPIO_PRT9->OUT = data[i+1];
       GPIO_PRT12->OUT_CLR = 1;
       GPIO_PRT12->OUT_SET = 1;

       GPIO_PRT9->OUT = data[i+2];
       GPIO_PRT12->OUT_CLR = 1;
       GPIO_PRT12->OUT_SET = 1;

       GPIO_PRT9->OUT = data[i+3];
       GPIO_PRT12->OUT_CLR = 1;
       GPIO_PRT12->OUT_SET = 1;  
    }

这将进一步将显示帧速率提高到 54.36 Hz。

结果:

方法

WR 引脚频率

FPS

A(移位并写入)

422 kHz

2.74

B(直接寄存器写入)

4.18 MHz

27.2

C(硬件更改)

7.52 MHz

48.95

D(用于循环展开)

8.35 MHz

54.36

 

请让我知道上面的解释是否对你的实施有帮助。 如果您还有其他问题,请告诉我。

最好的问候

Bhamy Narasimha Shenoy

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

直接寄存器写入极大地提高了 TFT 的吞吐量,谢谢。 不过,如果 TFT 在完全错误的时间重绘,我仍然 CAN 偶尔看到闪烁。 有没有办法消除这种情况,而不仅仅是降低这种可能性?

另外,为什么直接寄存器写入不是 display-tft-st7789v 库中的默认实现?

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

嗨 @KeithS_76

闪烁问题:

这可能是特定于应用程序的问题。 CAN 请分享您的观察项目或视频?

驱动程序实现变更:

当前的驱动程序实现是一个通用驱动程序,将用于多个设备。 每个设备的引脚映射会有所不同。 因此,为了简化引脚映射问题,实现了使用位移位进行通用位跳动。

如果您对此主题还有其他疑问,请告诉我。

最好的问候

Bhamy Narasimha Shenoy

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

嗨 @KeithS_76

请跟进以了解您是否有机会查看我的回复。 如果您需要任何进一步的支持,请告诉我。

最好的问候

Bhamy Narasimha Shenoy

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

嗨 @KeithS_76

由于不活动,此话题将被锁定。 如果您对本主题有任何其他疑问,请随时创建新话题。

最好的问候

Bhamy Narasimha Shenoy

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

嗨 @KeithS_76

你有机会查看我之前的回复吗?

最好的问候

Bhamy Narasimha Shenoy

0 点赞