【ST NUCLEO-U5A5ZJ-Q开发板测评】touchGFX移植中颜色数据获取失败
<p>【原因】</p><p>我申请试用的是移植touchgfx到开发板上。</p>
<p>【已完成的工作】</p>
<p>1、驱动ILI9488屏,因为我已经移植好LVGL的,所以确定已经移植好驱动的。</p>
<p>2、按照官方以及其他的人的经验,我已经配置好touchgfx,touchgfx也已经能够实现刷屏的动作。</p>
<p>【问题】</p>
<p>我在获取屏屏数据并通过ili9488的填充到屏上时,总是刷出黑色的屏,也就是0x00。</p>
<p>【代码】</p>
<p>1、获取屏幕的颜色数据:</p>
<pre>
<code>void TouchGFXHAL::flushFrameBuffer(const touchgfx::Rect& rect)
{
// Calling parent implementation of flushFrameBuffer(const touchgfx::Rect& rect).
//
// To overwrite the generated implementation, omit call to parent function
// and implemented needed functionality here.
// Please note, HAL::flushFrameBuffer(const touchgfx::Rect& rect) must
// be called to notify the touchgfx framework that flush has been performed.
// To calculate he start adress of rect,
// use advanceFrameBufferToRect(uint8_t* fbPtr, const touchgfx::Rect& rect)
// defined in TouchGFXGeneratedHAL.cpp
__IO uint16_t* ptr;
uint32_t height;
TouchGFXGeneratedHAL::flushFrameBuffer(rect);
for(height=0;height<rect.height; height++)
{
ptr = getClientFrameBuffer() + rect.x + (height + rect.y) * HAL::DISPLAY_WIDTH;//获取一行的颜色数据
mydisp_flush(0,height,320,1, (uint16_t*)ptr); //刷新到屏上
}
}</code></pre>
<p>2、屏刷新函数:</p>
<pre>
<code>void mydisp_flush(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t * color_p)
{
/*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/
uint32_t i, n, cnt, buf_size;
uint8_t r,g,b;
setAddrWindow(x, y, w, y+h-1);
n = w*h*3;
//割分发送给屏
if (n <= 65535){
cnt = 1;
buf_size = n;
}
else {
cnt = n/3;
buf_size = 3;
uint8_t min_cnt = n/(65535)+1;
for (i=min_cnt; i < n/3; i++)
{
if(n%i == 0)
{
cnt = i;
buf_size = n/i;
break;
}
}
}
DC_DATA();
CS_A();
while(cnt>0)
{
uint8_t frm_buf;
for (i=0; i < buf_size/3; i++)
{
r = (uint8_t)(((uint16_t)color_p&0xF800>>11)*255)/31;
g = (uint8_t)(((uint16_t)color_p&0x07E0>>5)*255)/63;
b = (uint8_t)(((uint16_t)color_p&0x001F)*255)/31;
frm_buf = r;
frm_buf = g;
frm_buf = b;
color_p++;
}
HAL_SPI_Transmit(&hspi1, frm_buf, buf_size, 10);
cnt -= 1;
}
CS_D();
/*IMPORTANT!!!
*Inform the graphics library that you are ready with the flushing*/
}</code></pre>
<p>程序运行后,屏是黑色的。</p>
<p>如果我把 r=255,g=255, b=255是可以成功的把屏刷成白色。</p>
<pre>
<code> r = (uint8_t)(((uint16_t)color_p&0xF800>>11)*255)/31;
g = (uint8_t)(((uint16_t)color_p&0x07E0>>5)*255)/63;
b = (uint8_t)(((uint16_t)color_p&0x001F)*255)/31;
</code></pre>
<p>希望有大神帮帮我解决这个问题。</p>
<p><span class="mentions">@okhxyyo </span> <span class="mentions">@nmg </span> 管管大大们,帮帮我哒,搞了一个星期了的还没有解决。</p>
<p>来啦来啦~先给你@其他几位参与测评的网友,我再转给几位大侠看看~~</p>
<p>@怀揣少年梦 @bigbat @慕容雪花 @damiaa @常见泽1 @2609 @chrisrh </p>
<p>加一段代码 判断图像全是0时打一个断点 然后往回查 看看问题出在哪里</p><br/> <p>我没有弄过touchGFX和ILI9488以下的方法不知道对不对,</p>
<p>1、先使用调试器 ptr =getClientFrameBuffer获得的指针,看到是不是在SRAM的内存范围,如果不在就说明被驱动指向了ILI9488设备的地址,那么就没有必要这样获取了。</p>
<p>2、在其它的图形系统通常是使用SRAM作为缓冲,在更新到ILI9488设备中,可以使用SRAM的图形缓冲区,这样应该是可以的</p>
<p>大佬,厉害了。</p>
<p>我还没有用过TouchGFx;</p>
<p>1、getClientFrameBuffer() 调试一下,查看这个函数获取到的数据是什么;</p>
<p>2、一般刷新数据的时候,可以在链接文件里面开一段RAM区域,作为显存,并且打开CACHE</p>
<div class='shownolgin' data-isdigest='no'>bigbat 发表于 2024-2-6 09:56
我没有弄过touchGFX和ILI9488以下的方法不知道对不对,
1、先使用调试器 ptr =getClientFrameBuffer获得 ...
<p>在LVGL中是开了一个缓冲区的。我还没有找到touchgfx是怎么弄的。</p>
</div><script>showreplylogin();</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <div class='shownolgin' data-isdigest='no'>https://bbs.eeworld.com.cn/thread-1272131-1-1.html已经成功解决了问题。</div><script>showreplylogin();</script>
页:
[1]