从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方式获取。
【操作说明】
截图功能介绍
截图功能位于如下位置:
截图各个选项功能:
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)
截图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像素交错
截图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)
内存方式截屏
1、单缓冲,800*480分辨率,RGB565
SDRAM分配的显存地址是0xC0000000:
2、单缓冲,800*480分辨率,RGB888
SDRAM分配的显存地址是0xC0000000:
可以看出比RGB565更加细腻
3、单缓冲,800*480分辨率,ARGB8888
SDRAM分配的显存地址是0xC0000000:
也是非常细腻
4、三缓冲,800*480分辨率,RGB565
填写缓冲首地址0xC0000000,然后点击自动填充按钮即可:
显示1,显示2和现实3都是有内容的,大家可以根据需要查看
各种其他GUI效果
TouchGFX截屏
双缓冲方式,地址分别设置为SDRAM空间的0xC0000000和0xC0177000
[C] 纯文本查看 复制代码 void TouchGFXGeneratedHAL::initialize()
{
HAL::initialize();
registerEventListener(*(touchgfx::Application::getInstance()));
setFrameBufferStartAddresses((void*)0xC0000000, (void*)0xC0177000, (void*)0);
由于截图的是一个游戏截图,为了防止撕裂,选择了暂停LTDC
显示1:
显示2:
GUIX截屏
单缓冲,显存地址0xC0000000,800*480分辨率,RGB565颜色格式
LVGL
LVGL可以设置局部分段缓冲,整屏单缓冲或者整屏双缓冲。
局部缓冲方式,直接读取显示屏的显存空间即可。
整屏单缓冲或者整屏双缓冲方式,可以读取缓冲地址或者显存地址
我们这里直接读取SDRAM的显存地址0xC00BB800
AWTK
单缓冲,800*480分辨,RGB565格式,显存地址0xC0000000.
这里把暂停CPU和LTDC都勾上,防止截图失败
|