客户为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

 

posted @ 2025-07-05 19:17  硬汉嵌入式  阅读(32)  评论(0)    收藏  举报