lugl4313820 发表于 2024-1-20 13:10

STM32U5A5 移植LVGL

<p>1、本次驱动的LCD为ILI9488使用板载的spi驱动,触摸屏为ADS7843使用spi3来驱动,选取的IO分别为如下:</p>

<p align="justify" >开发板 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LCD</p>

<p align="justify" >SPI1-MOSI(PA7) &nbsp;&nbsp;&nbsp;SDI</p>

<p align="justify" >SPI1-SCK(PA5) &nbsp;&nbsp;&nbsp;&nbsp;SCK</p>

<p align="justify" >TFT_CS(PD14) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CS</p>

<p align="justify" >TFT_RST(PD15) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RST</p>

<p align="justify" >TFT_DC(PF12) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DC</p>

<p align="justify" >VDD &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BL(目前不使用调光,直接接高电平)</p>

<p align="justify" >SPI3-SCK(PC10) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCLK</p>

<p align="justify" >PC8 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCS</p>

<p align="justify" >SPI3-MISO(PC11) &nbsp;&nbsp;&nbsp;&nbsp;TDO</p>

<p align="justify" >SPI3-MOSIP(C12) &nbsp;&nbsp;&nbsp;&nbsp;TDI</p>

<p align="justify" >PC9 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TPEN(中断)</p>

<p align="justify" >VDD &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VCC</p>

<p align="justify" >GND &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GND</p>

<p align="justify" >2、移植ILI9488驱动</p>

<p align="justify" >这在我的这篇帖子里已经移植好,不再详述:<a href="https://bbs.eeworld.com.cn/thread-1231258-1-1.html"><u>https://bbs.eeworld.com.cn/thread-1231258-1-1.html</u></a></p>

<p align="justify" >3、移植ADS7843驱动。</p>

<p align="justify" >驱动的原理图如下:</p>

<p align="justify" > &nbsp;</p>

<p align="justify" > &nbsp;</p>

<p align="justify" >其代码详见源码。</p>

<p>【LVGL移植】</p>

<ol>
        <li >下载lvgl源码,官方下载,<a href="https://github.com/lvgl/lvgl" target="_blank">https://github.com/lvgl/lvgl</a>。</li>
        <li >下载好后,我们把lvgl文件,直接粘帖到工程的Middlewares止录下:</li>
</ol>

<p> &nbsp;</p>

<p>&nbsp;</p>

<ol start="3">
        <li >把文件夹的目录添加到工程里面:</li>
</ol>

<p>&lt; class=&quot;p&quot; style=&quot;&quot;&gt; &nbsp;</p>

<p>&nbsp;</p>

<p>&lt; class=&quot;p&quot; style=&quot;&quot;&gt;4、复制lv_port_disp_template.h/c、lv_port_indev_template.h/c到src目录下面,并且重命名为lv_port_disp.h/c、lv_port_indev.h/c。</p>

<p>&nbsp;</p>

<p align="justify" > &nbsp;</p>

<p align="justify" >5、打开lv_port_disp.h,把if 0修改为if 1,同时把文件的引用路径修改为#include &ldquo;lvgl.h&rdquo;</p>

<p align="justify" > &nbsp;</p>

<ol start="5">
        <li align="justify" >打开lv_port_disp.c,修改if 0,为if 1。添加lcd屏、的头文件引用,添加hspi1、touch、lcd等的变量的扩展声明。</li>
</ol>

<p align="justify" > &nbsp;</p>

<ol start="6">
        <li align="justify" >在函数lv_port_disp_init中定义宽的参数,以及刷新缓存的方式</li>
</ol>

<p align="justify" > &nbsp;</p>

<ol start="7">
        <li align="justify" >修改disp_flush函数为内容如下:</li>
</ol>

<p align="justify" >&nbsp;</p>

<ol start="8">
        <li align="justify" >在disp_init函数中,加入LCD屏初始化,设置屏有横竖类型,同时修改电阻屏的横竖:</li>
</ol>

<p align="justify" > &nbsp;</p>

<ol start="9">
        <li align="justify" >重命名lvgl目录下的lvgl_conf_template.h为lvgl_conf.h。</li>
        <li align="justify" >打开lvgl_conf.h,修改if 0为if 1,打开代码。</li>
</ol>

<p align="justify" > &nbsp;</p>

<ol start="11">
        <li align="justify" >为lvgl添加freertos的tick心跳包,在第88行左右,找到#define LV_TICK_CUSTOM,把他修改为1,同时修改内容如下,使得lvgl的心跳包为freertos来提供:</li>
</ol>

<p>&lt; class=&quot;p&quot; style=&quot;&quot;&gt;<b>#define</b>&nbsp;LV_TICK_CUSTOM 1</p>

<p>&nbsp;</p>

<p>&lt; class=&quot;p&quot; style=&quot;&quot;&gt;<b>#if</b>&nbsp;LV_TICK_CUSTOM</p>

<p>&nbsp;</p>

<p>&lt; class=&quot;p&quot; style=&quot;&quot;&gt;<b>#define</b>&nbsp;LV_TICK_CUSTOM_INCLUDE &quot;FreeRTOS.h&quot;&nbsp;/*Header for the system time function*/</p>

<p>&nbsp;</p>

<p>&lt; class=&quot;p&quot; style=&quot;&quot;&gt;<b>#define</b>&nbsp;LV_TICK_CUSTOM_SYS_TIME_EXPR (xTaskGetTickCount()) /*Expression evaluating to current system time in <u>ms</u>*/</p>

<p>&nbsp;</p>

<p>&lt; class=&quot;p&quot; style=&quot;&quot;&gt;/*If using <u>lvgl</u>&nbsp;as ESP32 component*/</p>

<p>&nbsp;</p>

<p>&lt; class=&quot;p&quot; style=&quot;&quot;&gt;// #define LV_TICK_CUSTOM_INCLUDE &quot;esp_timer.h&quot;</p>

<p>&nbsp;</p>

<p>&lt; class=&quot;p&quot; style=&quot;&quot;&gt;// #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL))</p>

<p>&nbsp;</p>

<p>&lt; class=&quot;p&quot; style=&quot;&quot;&gt;<b>#endif</b>&nbsp;/*LV_TICK_CUSTOM*/</p>

<p>&nbsp;</p>

<p align="justify" >&nbsp;</p>

<ol start="8">
        <li align="justify" >打开lv_port_indev.h 修改if 0为 if 1打开代码。</li>
</ol>

<p align="justify" > &nbsp;</p>

<ol start="9">
        <li align="justify" >打开lv_port_indev.c,修改if 0 为if 1, 打开代码,同时添加touch.h的头文件引用:</li>
</ol>

<p align="justify" > &nbsp;</p>

<ol start="10">
        <li align="justify" >修改touchpad_read函数内容如下:</li>
</ol>

<pre>
<code>/*Will be called by the library to read the touchpad*/
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{
    static lv_coord_t last_x = 0;
    static lv_coord_t last_y = 0;

    TP_Scan(0);
    if(tp_dev.sta&amp;TP_PRES_DOWN)
    {
            last_x = tp_dev.x;
                last_y = tp_dev.y;

                data-&gt;point.x = last_x;
                data-&gt;point.y = last_y;
                data-&gt;state = LV_INDEV_STATE_PR;

    }
    else
    {
            data-&gt;point.x = last_x;
                data-&gt;point.y = last_y;
                data-&gt;state = LV_INDEV_STATE_REL;
    }
}</code></pre>

<p align="justify" >到此代码的移植全部完成,编译后有些错误提示,可以根据提示来添加头文件的引用等。</p>

<p align="justify" >&nbsp;</p>

<p align="justify" >【测试代码】</p>

<ol>
        <li align="justify" >在main.c中,我们需要先添加lcd的初始化与电阻屏的初化与较准。</li>
</ol>

<p align="justify" > &nbsp;</p>

<ol start="2">
        <li align="justify" >在app_freertos.c文件中,我们在任务中添加一个LED的控制程序,添加一个LED及一个开关部件来实现对板载LED红灯的控制。添加一个label标签,用于展示当前的时间,开启一个定时器,在定时器回调函数中刷定时间显示。</li>
</ol>

<p>&nbsp;</p>

<p align="justify" >【总结】</p>

<p align="justify" >基于LVGL的移植历经一个星期才完成任务。下面谈谈这项目工程的一些经验与心得。</p>

<ol>
        <li align="justify" >STM32U5A5拥有大的flash与大内存,编写lvgl时不需要考虑内存是否足够的情况。</li>
        <li align="justify" >Stm32CubeIDE提供了强大的编程工具,基础的组件基于图形化的工具配置,减少了开发者的复杂的寄存器的配置。生成基础工程非常之方便。国家厂家比如雅特力、TI等也有图形化的配置工程,但是相比stm32cubeIDE还是没有这么全面与方便。</li>
        <li align="justify" >Stm32cubeIDE的FreeRTOS的移植也是有软件包,虽然在stm32U5下面没有默认的包,但是可以经过手工安装来实现对freeRTOS的简单配置,使得移植工作也是非常的快捷方便。</li>
        <li align="justify" >在LVGL的移植工作中,相比keil的移植,也是有相当大的优势,keil中,需要手工添加非常多的.c文件,与头文件的引用,在stm32cubeIDE中只需要把外部的文件夹拷贝进目录就行了,简单的添加编译的路径与工程里就行了。</li>
</ol>

<p align="justify" >&nbsp;</p>

<p align="justify" >附工程源代码:</p>

<p align="justify" ></p>

<p align="justify" >&nbsp;</p>

qiao--- 发表于 2024-1-20 19:42

<p>STM32U5A5拥有大的flash与大内存,编写lvgl时不需要考虑内存是否足够的情况。</p>

<p>&nbsp;确实对于资源不足的单片机可能还需要剪裁lvgl。</p>

<p>接下来和版主一起学习lvgl<img height="52" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/pleased.gif" width="48" /></p>

lugl4313820 发表于 2024-1-20 21:29

qiao--- 发表于 2024-1-20 19:42
STM32U5A5拥有大的flash与大内存,编写lvgl时不需要考虑内存是否足够的情况。

&nbsp;确实对于资源不足的 ...

<p>我最近要主攻TouchGFX,还没有掌握好呀。</p>

freebsder 发表于 2024-1-23 16:34

<p>这个屏的器件很让人恶心</p>

bigbat 发表于 2024-1-25 11:21

freebsder 发表于 2024-1-23 16:34
这个屏的器件很让人恶心

<p>能具体说吗?最近我在考察4寸屏幕的性能,我看到ILI9488的SPI接口屏很多,不会知道有什么坑</p>

freebsder 发表于 2024-1-25 22:36

bigbat 发表于 2024-1-25 11:21
能具体说吗?最近我在考察4寸屏幕的性能,我看到ILI9488的SPI接口屏很多,不会知道有什么坑

<p>各种寄存器设置的根本不知道啥意思,只能抄。</p>

bigbat 发表于 2024-1-26 09:21

freebsder 发表于 2024-1-25 22:36
各种寄存器设置的根本不知道啥意思,只能抄。

<p>ssd1306的资料在早期的时候也是这样,后来才出来一些资料。搞明白了一些寄存器,例如:翻转90&deg;之类的。也是不到这些厂家怎么想的</p>

怀揣少年梦 发表于 2024-1-29 08:43

<p>大佬,这么快就出测评文章了,牛牛<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/congra.gif" width="48" /></p>

freebsder 发表于 2024-1-29 16:40

bigbat 发表于 2024-1-26 09:21
ssd1306的资料在早期的时候也是这样,后来才出来一些资料。搞明白了一些寄存器,例如:翻转90&deg;之类的 ...

<p>深度产品应该不会用这种不可控的东西。很多寄存器完全不知道啥意思。</p>
页: [1]
查看完整版本: STM32U5A5 移植LVGL