客户为H7-TOOL的截图功能增加ST7789控制器支持,无需内嵌代码,直接调试接口截图
【截图功能简介】
早期包括现在做产品效果展示,需要截屏时,很多时候依然采用的SD卡/U盘这种的古老方案,不仅麻烦,而且繁琐。
特色:
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方式获取。
详细介绍
https://www.armbbs.cn/forum.php?mod=viewthread&tid=118116
【ST7789截图支持】
非常感谢客户分享,这个是采用的FSMC/FMC总线接口方式,下次TOOL升级将集成进来

效果:

驱动代码实现, 下次升级将直接添加到TOOL上位机中:
print("ST7789V3.lua") --返回格式:每像素3个字节,2像素交错紧凑排列: G1 R1 R2 B1 B2 G2 function dev_read(driver, height, width, rgb, ltdc, pause, data_reg_addr, cmd_reg_addr, buff_count, buff_addr1, buff_addr2, buff_addr3) local dispmem1 local dispmem2 local dispmem3 local re = 0 local i, j local px local t1, t2 local str pg_write32(0xE000EDF0, 0xA05F0000 + 0X00000001 + 0X00000002) -- 进入调试暂停CPU --读第1个显存 t1 = get_runtime() str = string.format("读ST7789V3显存 数据寄存器地址:0x%08X 指令寄存器地址:0x%08X 高度:%d 宽度:%d", data_reg_addr, cmd_reg_addr, height, width) print(str) DATA_REG = data_reg_addr CMD_REG = cmd_reg_addr pg_write8(CMD_REG, 0x04) id1 = pg_read8(DATA_REG) id2 = pg_read8(DATA_REG) id3 = pg_read8(DATA_REG) id4 = pg_read8(DATA_REG) str = string.format("Chip ID = %02X %02X %02X %02X", id1, id2, id3, id4) print(str) pg_write8(CMD_REG, 0x0C)--读取显示的像素格式 pg_read8(DATA_REG) id1 = pg_read8(DATA_REG) str = string.format("读取ST7789V3显示像素格式 = %02X", id1) print(str) dispmem1 = "" ST7789V3_SetDispWin(0,0, 160, 240)--设置指针位置 pg_write8(CMD_REG, 0x2E)--发送读取指令 pg_read8(DATA_REG) --丢弃 re, dispmem1 = pg_read_mem_16(DATA_REG, 160 * 240 * 3) ST7789V3_SetDispWin(0,160, 160, 240)--设置指针位置 pg_write8(CMD_REG, 0x2E)--发送读取指令 pg_read8(DATA_REG) --丢弃 re, dispmem2 = pg_read_mem_16(DATA_REG, 160 * 240 * 3) dispmem1 = dispmem1 .. dispmem2; if (re == 0) then print("pg_read_mem1() failed") else print(string.format("高度:%d, 宽度:%d, 实际大小:%d, 读取长度:%d",height, width, height * width , #dispmem1)) end t2 = get_runtime() print("读显存耗时:", t2 - t1) pg_write32(0xE000EDF0, 0xA05F0000) --恢复 return re, dispmem1, dispmem2, dispmem3 end function ST7789V3_WriteCmd(cmd) pg_write8(CMD_REG, cmd) end function ST7789V3_WriteParam(param) pg_write8(DATA_REG, param) end function ST7789V3_SetDispWin(x, y, h, w) ST7789V3_WriteCmd(0X2A) --设置X坐标 */ ST7789V3_WriteParam(x >> 8); --起始点 */ ST7789V3_WriteParam(x); ST7789V3_WriteParam((x + w - 1) >> 8) --结束点 ST7789V3_WriteParam(x + w - 1) ST7789V3_WriteCmd(0X2B) --设置Y坐标 ST7789V3_WriteParam(y >> 8) --起始点 ST7789V3_WriteParam(y) ST7789V3_WriteParam((y + h - 1) >> 8) --结束点 ST7789V3_WriteParam((y + h - 1)) end function ST7789V3_SetCursor(x, y) ST7789V3_WriteCmd(0X2A) --设置X坐标 ST7789V3_WriteParam(x >> 8) --先高8位,然后低8位 ST7789V3_WriteParam(x) --设置起始点和结束点*/ ST7789V3_WriteParam(x >> 8) --先高8位,然后低8位 ST7789V3_WriteParam(x) --设置起始点和结束点 ST7789V3_WriteCmd(0X2B) --设置Y坐标 ST7789V3_WriteParam(y >> 8) ST7789V3_WriteParam(y) ST7789V3_WriteParam(y >> 8) ST7789V3_WriteParam(y) end --返回字符串,2字节,RGB565 function ST7789V3_GetPixel(x, y) local R = 0 local G = 0 local B = 0 local str = "" ST7789V3_SetCursor(x, y) --设置光标位置 pg_write8(CMD_REG, 0x2E) R = pg_read32(DATA_REG) --第1个哑读,丢弃 R = pg_read32(DATA_REG) B = pg_read32(DATA_REG) G = pg_read32(DATA_REG) R = (((R >> 11) << 11) | ((G >> 10 ) << 5) | (B >> 11)) return string.char(R & 0xFF, (R >> 8) & 0xFF) end function ST7789V3_PutPixel(x, y, color) ST7789V3_SetCursor(x, y) pg_write8(CMD_REG, 0x2C) pg_write32(DATA_REG, color) end
微信公众号:armfly_com
安富莱论坛:www.armbbs.cn
安富莱淘宝:https://armfly.taobao.com

浙公网安备 33010602011771号