硬汉嵌入式论坛

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

[截图功能] 客户为H7-TOOL的截图功能增加ST7789控制器支持(2025-07-04)

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116747
QQ
发表于 昨天 08:32 | 显示全部楼层 |阅读模式

【截图功能详细介绍】


H7-TOOL截图功能操作说明,无需内嵌代码,支持TouchGFX,GUIX,emWin,LVGL,AWTK,裸机等,含多缓冲玩法(2023-02-26)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=118116


【ST7789截图支持】


非常感谢客户分享,这个是采用的FSMC/FMC总线接口方式,下次TOOL升级将集成进来

12345.png

效果:

QQ20250704-082611.png


驱动代码实现:

ST7789V3.lua (3.34 KB, 下载次数: 0)

[Lua] 纯文本查看 复制代码
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





回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-5 00:13 , Processed in 0.219709 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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