硬汉嵌入式论坛

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

[截图功能] H7-TOOL截图功能操作说明,无需内嵌代码,支持TouchGFX,GUIX,emWin,LVGL,AWTK,裸机等,含多缓冲玩法(2023-02-26)

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106757
QQ
发表于 2023-2-26 01:06:17 | 显示全部楼层 |阅读模式
从2.20版本开始支持

【说明】

早期包括现在做产品效果展示,需要截屏时,很多时候依然采用的SD卡/U盘这种的古老方案,不仅麻烦,而且繁琐。
emWin早期的时候有推出过emSPY截图功能,需要用户移植RTT或者网络协议栈,后续新版本更新,经常出现花屏,几乎没法使用。

【特色】
1、用户仅需接上SWD接口(3线,4线或者5线均可),无需用户嵌入代码到目标,填入显存地址即可,通过这个功能,会大大方便大家产品效果展示。
2、支持RGB接口屏和总线接口屏方式,对于总线接口方式,比如使用STM32的FSMC总线外接ili9488,RA8875都是没问题的。并且也支持FSMC总线方式外接OLED屏读取。
3、裸机,TouchGFX,ThreadX GUIX,emWin,LVGL,AWTK全部测试通过,含多缓冲方式玩法。
4、颜色格式支持RGB565、RGB888、ARGB8888和1bit单色屏。
5、支持USB,WiFi和以太网通信方式,支持内网和外网访问,由于截图是原始数据,数据量较大,推荐用USB方式获取。

【操作说明】

截图功能介绍

截图功能位于如下位置:

image.png

截图各个选项功能:

image.png

1、支持内存读取,RA8875和ili9488:
(1) 内存读取就是用户独立开启显存的显示屏,这类显示屏以外接RGB接口裸屏最多,需要用户使用内部SRAM或者外置SDRAM做显存,大家仅需把显存的首地址给TOOL截图功能,就可以读取了。当然,用户有时候想给ST7789之类的显示屏也在内部SRAM开辟个独立的显存刷新,使用TOOL读取整个显存也是没问题的。
(2)  RA8875和ili9488是外置控制器方式的用法,大家使用8080类总线接口都可以驱动,这种类似的屏,TOOL也可以读取。这类屏本质上需要TOOL控制其寄存器实现这类显示屏自带显存内容的读取。

2、缓冲区:
这里支持单缓冲,双缓冲和三缓存模式。以emWin例子,它支持了这种三种缓冲方式,大家根据自己的缓冲设置选择即可。
这个还有个选项是“自动填充”按钮,这个按钮是按照大家设置的颜色格式大小设置缓冲区地址,以三个缓冲地址连续的方式填写。当然,大家也可以自定义填写。

3、数据端口地址和指令端口地址
这个是转供RA8875和ili9488显示屏使用,对于这类显示屏,大家的工程里面都有个指令地址和数据地址,大家将这两个地址分别填入即可。

4、缓冲分区地址

主要用于多缓存模式,大家可以自己手动填写每个缓冲地址。

5、屏幕分辨率

大家根据自己的情况填写即可

6、像素格式
(1)  16bit RGB565
(2)  24bit RGB888
(3)  24bit BGR888
(4)  32bit ARGB8888
(5)  1bit 左到右
      1bit 左到右 bit反序
      1bit 右到左
      1bit 右到左,bit反序

7、防撕裂

我们通过SWD接口访问目标板的显存空间时,像STM32的LCD控制器LTDC也会访问,冲突访问容易造成截屏撕裂,大家可以根据需要勾上这个选项

8、暂停CPU

同上,CPU也有会和SWD同时访问显存的情况,大家可以更新需要暂停CPU。

9、排列方式

这个一般不用动,LCD大部分的扫描方式都是从左到右,从上到下。

10、刷新和复制

(1)执行“刷新”按钮就截图功能
(2)执行“复制”按钮,大家就可以将截图数据复制出来,可以粘贴到ppt,word等软件使用。


截图RA8875显示屏

RA8875的数据端口地址是0x6C000000, 指令端口地址是0x6C080000
[C] 纯文本查看 复制代码
        #define RA8875_BASE                ((uint32_t)(0x6C000000 | 0x00000000))

        #define RA8875_REG                *(__IO uint16_t *)(RA8875_BASE +  (1 << (18 + 1)))        /* FSMC 16位总线模式下,FSMC_A18口线对应物理地址A19 */
        #define RA8875_RAM                *(__IO uint16_t *)(RA8875_BASE)


image.png


截图ili9488显示屏

ili9488的数据端口地址是0x6C080000, 指令端口地址是0x6C000000

[C] 纯文本查看 复制代码
#define ILI9488_BASE       ((uint32_t)(0x6C000000 | 0x00000000))

#define ILI9488_REG                *(__IO uint16_t *)(ILI9488_BASE)
#define ILI9488_RAM                *(__IO uint16_t *)(ILI9488_BASE + (1 << (18 + 1)))        /* FSMC 16位总线模式下,FSMC_A18口线对应物理地址A19 */


特别注意9488要选择24bit,2像素交错

image.png


截图OLED单色屏

这类读取OLED屏是采用的内置了1KB的显存方式,方便刷新,所我们这里直接读取显存的RAM地址即可,通过看map文件获得
[C] 纯文本查看 复制代码
/* 12864 OLED的显存镜像,占用1K字节. 共8行,每行128像素 */
static uint8_t s_ucGRAM[8][128];

s_ucGRAM                                 0x200044ca   Data        1024  bsp_oled.o(.bss)



image.png

image.png

内存方式截屏

1、单缓冲,800*480分辨率,RGB565

SDRAM分配的显存地址是0xC0000000:

image.png


2、单缓冲,800*480分辨率,RGB888

SDRAM分配的显存地址是0xC0000000:

可以看出比RGB565更加细腻

image.png

3、单缓冲,800*480分辨率,ARGB8888

SDRAM分配的显存地址是0xC0000000:

也是非常细腻

image.png

4、三缓冲,800*480分辨率,RGB565

填写缓冲首地址0xC0000000,然后点击自动填充按钮即可:

显示1,显示2和现实3都是有内容的,大家可以根据需要查看

image.png


各种其他GUI效果

TouchGFX截屏

双缓冲方式,地址分别设置为SDRAM空间的0xC0000000和0xC0177000

[C] 纯文本查看 复制代码
void TouchGFXGeneratedHAL::initialize()
{
    HAL::initialize();

    registerEventListener(*(touchgfx::Application::getInstance()));

    setFrameBufferStartAddresses((void*)0xC0000000, (void*)0xC0177000, (void*)0);


由于截图的是一个游戏截图,为了防止撕裂,选择了暂停LTDC

显示1:
image.png

显示2:

image.png

GUIX截屏

单缓冲,显存地址0xC0000000,800*480分辨率,RGB565颜色格式

image.png


LVGL

LVGL可以设置局部分段缓冲,整屏单缓冲或者整屏双缓冲。

局部缓冲方式,直接读取显示屏的显存空间即可。
整屏单缓冲或者整屏双缓冲方式,可以读取缓冲地址或者显存地址

我们这里直接读取SDRAM的显存地址0xC00BB800

image.png

AWTK

单缓冲,800*480分辨,RGB565格式,显存地址0xC0000000.

这里把暂停CPU和LTDC都勾上,防止截图失败

image.png
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2023-2-26 10:20:18 | 显示全部楼层
坐等新版固件发布
代码不规范,亲人两行泪!
回复

使用道具 举报

9

主题

103

回帖

130

积分

初级会员

积分
130
发表于 2023-2-26 18:20:04 | 显示全部楼层
终于要发布了,让我们等太久了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106757
QQ
 楼主| 发表于 2023-2-26 18:45:09 | 显示全部楼层
更新完毕。
回复

使用道具 举报

82

主题

401

回帖

667

积分

金牌会员

积分
667
QQ
发表于 2023-2-26 20:43:37 | 显示全部楼层
华芯微特的芯片可以吗
武汉天纵鹏元科技有限公司。承接嵌入式项目开发,相关技术交流。STM32,物联网,工业控制方向。QQ  408137104
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106757
QQ
 楼主| 发表于 2023-2-26 21:34:14 | 显示全部楼层
雷鹏 发表于 2023-2-26 20:43
华芯微特的芯片可以吗

是不是内置SDRAM那款SWM34X,可以的。
回复

使用道具 举报

82

主题

401

回帖

667

积分

金牌会员

积分
667
QQ
发表于 2023-2-27 08:36:29 | 显示全部楼层
eric2013 发表于 2023-2-26 21:34
是不是内置SDRAM那款SWM34X,可以的。

是的  最新程序大概什么时候发布,现在项目上面要用到
武汉天纵鹏元科技有限公司。承接嵌入式项目开发,相关技术交流。STM32,物联网,工业控制方向。QQ  408137104
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106757
QQ
 楼主| 发表于 2023-2-27 09:03:02 | 显示全部楼层
雷鹏 发表于 2023-2-27 08:36
是的  最新程序大概什么时候发布,现在项目上面要用到

今天晚些时候正式发布H7-TOOL的2.20版固件(2023-02-27)
https://www.armbbs.cn/forum.php? ... 8124&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106757
QQ
 楼主| 发表于 昨天 01:05 | 显示全部楼层
1、一种是显存在SDRAM,SRAM等空间,这种的只要大家的板子上电,GUI运行起来之后,直接读取显存地址就可以获取。
2、还有一种是RA8875,9488这种8080总线接口,一般都是外挂到FSMC总线的,TOOL通过SWD接口控制FSMC外设让LCD工作到开窗模式,方便读取这些外置控制器自带显存空间。这种的不管是那家芯片的FSMC总线,只要给总线地址就可以控制外置控制器。
3、还有就是SPI,I2C等接口方式,这种的当前还没做。这种的要针对每款芯片单独做外设控制才行,这个有点繁琐,每个芯片的SPI I2C都略有不同,得知道数据寄存器,控制寄存器和状态寄存器。
这个可以通过此贴SWD接口函数控制。
H7-TOOL的LUA小程序教程第8期:SWD接口函数,读写各种类型数据,内存和寄存器等(2023-04-07)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=118104
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 23:57 , Processed in 0.189427 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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