lugl4313820 发表于 2024-2-6 09:18

【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&amp; rect)
{
    // Calling parent implementation of flushFrameBuffer(const touchgfx::Rect&amp; rect).
    //
    // To overwrite the generated implementation, omit call to parent function
    // and implemented needed functionality here.
    // Please note, HAL::flushFrameBuffer(const touchgfx::Rect&amp; 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&amp; rect)
    // defined in TouchGFXGeneratedHAL.cpp

    __IO uint16_t* ptr;
    uint32_t height;
        TouchGFXGeneratedHAL::flushFrameBuffer(rect);
        for(height=0;height&lt;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 &lt;= 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 &lt; n/3; i++)
                        {
                                        if(n%i == 0)
                                        {
                                                        cnt = i;
                                                        buf_size = n/i;
                                                        break;
                                        }
                        }
      }

      DC_DATA();
      CS_A();
                while(cnt&gt;0)
                {
                                uint8_t frm_buf;
                                for (i=0; i &lt; buf_size/3; i++)
                                {
                                                r = (uint8_t)(((uint16_t)color_p&amp;0xF800&gt;&gt;11)*255)/31;
                                                g = (uint8_t)(((uint16_t)color_p&amp;0x07E0&gt;&gt;5)*255)/63;
                                                b = (uint8_t)(((uint16_t)color_p&amp;0x001F)*255)/31;
                                                frm_buf = r;
                                                frm_buf = g;
                                                frm_buf = b;
                                               color_p++;
                                }

                                HAL_SPI_Transmit(&amp;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&amp;0xF800&gt;&gt;11)*255)/31;
                                                g = (uint8_t)(((uint16_t)color_p&amp;0x07E0&gt;&gt;5)*255)/63;
                                                b = (uint8_t)(((uint16_t)color_p&amp;0x001F)*255)/31;

</code></pre>

<p>希望有大神帮帮我解决这个问题。</p>

lugl4313820 发表于 2024-2-6 09:19

<p><span class="mentions">@okhxyyo </span>&nbsp;<span class="mentions">@nmg </span>&nbsp;管管大大们,帮帮我哒,搞了一个星期了的还没有解决。</p>

okhxyyo 发表于 2024-2-6 09:37

<p>来啦来啦~先给你@其他几位参与测评的网友,我再转给几位大侠看看~~</p>

<p>@怀揣少年梦 &nbsp; @bigbat &nbsp; @慕容雪花 &nbsp; @damiaa &nbsp; @常见泽1 &nbsp; @2609 &nbsp; @chrisrh &nbsp;&nbsp;</p>

littleshrimp 发表于 2024-2-6 09:55

<p>加一段代码&nbsp;判断图像全是0时打一个断点&nbsp;然后往回查&nbsp;看看问题出在哪里</p><br/>

bigbat 发表于 2024-2-6 09:56

<p>我没有弄过touchGFX和ILI9488以下的方法不知道对不对,</p>

<p>1、先使用调试器 ptr =getClientFrameBuffer获得的指针,看到是不是在SRAM的内存范围,如果不在就说明被驱动指向了ILI9488设备的地址,那么就没有必要这样获取了。</p>

<p>2、在其它的图形系统通常是使用SRAM作为缓冲,在更新到ILI9488设备中,可以使用SRAM的图形缓冲区,这样应该是可以的</p>

怀揣少年梦 发表于 2024-2-6 10:07

<p>大佬,厉害了。</p>

<p>我还没有用过TouchGFx;</p>

<p>1、getClientFrameBuffer() 调试一下,查看这个函数获取到的数据是什么;</p>

<p>2、一般刷新数据的时候,可以在链接文件里面开一段RAM区域,作为显存,并且打开CACHE</p>

lugl4313820 发表于 2024-2-6 10:22

<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>

lugl4313820 发表于 2024-2-20 13:19

<div class='shownolgin' data-isdigest='no'>https://bbs.eeworld.com.cn/thread-1272131-1-1.html已经成功解决了问题。</div><script>showreplylogin();</script>
页: [1]
查看完整版本: 【ST NUCLEO-U5A5ZJ-Q开发板测评】touchGFX移植中颜色数据获取失败