问答

汇集网友智慧,解决技术难题

21ic问答首页 - GD32H759IMT6的TLI高速刷新图像时存在不符预期的残影

TLI

GD32H759IMT6的TLI高速刷新图像时存在不符预期的残影

oinobody2025-12-14
本帖最后由 oinobody 于 2025-12-15 17:49 编辑


GD32H759IMT6的TLI(RGB888)接口连接一个LED灯板(RGB8,只能显示单色图像)
软件的需求是:我们需要把每一帧彩色图像帧,分成两次发出去.
4ms发送当前帧的图像帧RGB(LED显示R分量),下一个4ms发送GRB(LED显示G分量);
然后显示下一帧图像,即可播放视频.


以下是程序的播放代码:


// 从sd_ram中获取视频文件,然后逐帧发到TLI接口,4ms显示该帧的绿色分量,下一个4ms显示该帧的红色分量.
void PlayVideoInSdram(void)
{
    uint32_t curFrame = 0;
    uint8_t* redFrame = (uint8_t*)mymalloc(SRAMIN, AVI_VIDEO_BUF_SIZE);
    uint8_t* greenFrame = (uint8_t*)mymalloc(SRAMIN, AVI_VIDEO_BUF_SIZE);
    while (1)
    {
        // 将绿色帧配置到tli接口,播放绿色帧
        TLI_LXFBADDR(LAYER0) &= ~(TLI_LXFBADDR_FBADD);
        TLI_LXFBADDR(LAYER0) = (uint32_t)greenFrame;
        tli_reload_config(TLI_REQUEST_RELOAD_EN);
        tli_enable();

        // 从sd_ram中读取红色图像帧
        sdram_readbuffer_8(redFrame, (curFrame * FRAME_LEN), FRAME_LEN);
        curFrame++;
        curFrame = curFrame % g_max_frame_num;

        // g_timer_is_up在4s周期定时器中,被不断地置1置2
        while (g_timer_is_up != 1) // 等待4ms时间到
        {
            ;
        }
        // 4ms定时器到了,发出红色帧
        TLI_LXFBADDR(LAYER0) &= ~(TLI_LXFBADDR_FBADD);
        TLI_LXFBADDR(LAYER0) = (uint32_t)redFrame;
        tli_reload_config(TLI_REQUEST_RELOAD_EN);
        tli_enable();

        // 准备绿色帧,将红色帧的GR通道反转一下得到绿色帧图像
        memcpy(greenFrame, redFrame, FRAME_LEN);
        SwitchGR(greenFrame, FRAME_LEN);


        while (g_timer_is_up != 2) // 等待4ms时间到
        {
            ;
        }
    }
}

上面的程序可以做到4ms显示图像的红色分量,下一个4ms显示绿色分量.播放一个花朵开放的视频.
然后我在做实验的时候,想观察纯色图像的播放情况,每一次给tli发送的图像我都用memset置为一个固定灰阶.


// 从sd_ram中获取视频文件,然后逐帧发到TLI接口,4ms显示该帧的绿色分量,下一个4ms显示该帧的红色分量.
void PlayVideoInSdram(void)
{
    uint32_t curFrame = 0;
    uint8_t* redFrame = (uint8_t*)mymalloc(SRAMIN, AVI_VIDEO_BUF_SIZE);
    uint8_t* greenFrame = (uint8_t*)mymalloc(SRAMIN, AVI_VIDEO_BUF_SIZE);
    while (1)
    {
        // 将绿色帧配置到tli接口,播放绿色帧
        TLI_LXFBADDR(LAYER0) &= ~(TLI_LXFBADDR_FBADD);
        TLI_LXFBADDR(LAYER0) = (uint32_t)greenFrame;
        tli_reload_config(TLI_REQUEST_RELOAD_EN);
        tli_enable();

        // 从sd_ram中读取红色图像帧
        sdram_readbuffer_8(redFrame, (curFrame * FRAME_LEN), FRAME_LEN);
        curFrame++;
        curFrame = curFrame % g_max_frame_num;
        memset(redFrame, 60, FRAME_LEN);  // 红色帧全置60

        // g_timer_is_up在4s周期定时器中,被不断地置1置2
        while (g_timer_is_up != 1) // 等待4ms时间到
        {
            ;
        }
        // 4ms定时器到了,发出红色帧
        TLI_LXFBADDR(LAYER0) &= ~(TLI_LXFBADDR_FBADD);
        TLI_LXFBADDR(LAYER0) = (uint32_t)redFrame;
        tli_reload_config(TLI_REQUEST_RELOAD_EN);
        tli_enable();

        // 准备绿色帧,将红色帧的GR通道反转一下得到绿色帧图像
        memcpy(greenFrame, redFrame, FRAME_LEN);
        SwitchGR(greenFrame, FRAME_LEN);
        memset(greenFrame, 0, FRAME_LEN); // 绿色帧全置0

        while (g_timer_is_up != 2) // 等待4ms时间到
        {
            ;
        }
    }
}



按道理,此时的LED灯板,应该4ms显示一个纯平的灰度60,再4ms灭掉.
但是奇怪的现象是:我隐约可见纯平的图像里掺杂着非纯平的图像(一朵花的开放视频).

这个现象难以解释,感觉TLI 的DMA操作和软件存在不同步的情况,但是每次TLI_LXFBADDR(LAYER0)赋值的时候,对应的frame buffer已经被memset,不应该再出现图像帧.



哪位专家路过,麻烦看一下,为什么会这样?


回答 +关注 1
104人浏览 2人回答问题 分享 举报
2 个回答

您需要登录后才可以回复 登录 | 注册