21ic问答首页 - GD32H759IMT6的TLI高速刷新图像时存在不符预期的残影
GD32H759IMT6的TLI高速刷新图像时存在不符预期的残影
本帖最后由 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,不应该再出现图像帧.
哪位专家路过,麻烦看一下,为什么会这样?
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,不应该再出现图像帧.
哪位专家路过,麻烦看一下,为什么会这样?

问答
赞0
没有解决啊,这个残影无法解释, 请求哪位专家看下可能是什么原因?
悬赏怎么弄啊?@版主 我要悬赏专家帮我看看这个问题
评论
2025-12-15
赞0
评论
2025-12-15
您需要登录后才可以回复 登录 | 注册