STM32U5A5 移植LVGL
<p>1、本次驱动的LCD为ILI9488使用板载的spi驱动,触摸屏为ADS7843使用spi3来驱动,选取的IO分别为如下:</p><p align="justify" >开发板 LCD</p>
<p align="justify" >SPI1-MOSI(PA7) SDI</p>
<p align="justify" >SPI1-SCK(PA5) SCK</p>
<p align="justify" >TFT_CS(PD14) CS</p>
<p align="justify" >TFT_RST(PD15) RST</p>
<p align="justify" >TFT_DC(PF12) DC</p>
<p align="justify" >VDD BL(目前不使用调光,直接接高电平)</p>
<p align="justify" >SPI3-SCK(PC10) TCLK</p>
<p align="justify" >PC8 TCS</p>
<p align="justify" >SPI3-MISO(PC11) TDO</p>
<p align="justify" >SPI3-MOSIP(C12) TDI</p>
<p align="justify" >PC9 TPEN(中断)</p>
<p align="justify" >VDD VCC</p>
<p align="justify" >GND 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" > </p>
<p align="justify" > </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> </p>
<p> </p>
<ol start="3">
<li >把文件夹的目录添加到工程里面:</li>
</ol>
<p>< class="p" style=""> </p>
<p> </p>
<p>< class="p" style="">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> </p>
<p align="justify" > </p>
<p align="justify" >5、打开lv_port_disp.h,把if 0修改为if 1,同时把文件的引用路径修改为#include “lvgl.h”</p>
<p align="justify" > </p>
<ol start="5">
<li align="justify" >打开lv_port_disp.c,修改if 0,为if 1。添加lcd屏、的头文件引用,添加hspi1、touch、lcd等的变量的扩展声明。</li>
</ol>
<p align="justify" > </p>
<ol start="6">
<li align="justify" >在函数lv_port_disp_init中定义宽的参数,以及刷新缓存的方式</li>
</ol>
<p align="justify" > </p>
<ol start="7">
<li align="justify" >修改disp_flush函数为内容如下:</li>
</ol>
<p align="justify" > </p>
<ol start="8">
<li align="justify" >在disp_init函数中,加入LCD屏初始化,设置屏有横竖类型,同时修改电阻屏的横竖:</li>
</ol>
<p align="justify" > </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" > </p>
<ol start="11">
<li align="justify" >为lvgl添加freertos的tick心跳包,在第88行左右,找到#define LV_TICK_CUSTOM,把他修改为1,同时修改内容如下,使得lvgl的心跳包为freertos来提供:</li>
</ol>
<p>< class="p" style=""><b>#define</b> LV_TICK_CUSTOM 1</p>
<p> </p>
<p>< class="p" style=""><b>#if</b> LV_TICK_CUSTOM</p>
<p> </p>
<p>< class="p" style=""><b>#define</b> LV_TICK_CUSTOM_INCLUDE "FreeRTOS.h" /*Header for the system time function*/</p>
<p> </p>
<p>< class="p" style=""><b>#define</b> LV_TICK_CUSTOM_SYS_TIME_EXPR (xTaskGetTickCount()) /*Expression evaluating to current system time in <u>ms</u>*/</p>
<p> </p>
<p>< class="p" style="">/*If using <u>lvgl</u> as ESP32 component*/</p>
<p> </p>
<p>< class="p" style="">// #define LV_TICK_CUSTOM_INCLUDE "esp_timer.h"</p>
<p> </p>
<p>< class="p" style="">// #define LV_TICK_CUSTOM_SYS_TIME_EXPR ((esp_timer_get_time() / 1000LL))</p>
<p> </p>
<p>< class="p" style=""><b>#endif</b> /*LV_TICK_CUSTOM*/</p>
<p> </p>
<p align="justify" > </p>
<ol start="8">
<li align="justify" >打开lv_port_indev.h 修改if 0为 if 1打开代码。</li>
</ol>
<p align="justify" > </p>
<ol start="9">
<li align="justify" >打开lv_port_indev.c,修改if 0 为if 1, 打开代码,同时添加touch.h的头文件引用:</li>
</ol>
<p align="justify" > </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&TP_PRES_DOWN)
{
last_x = tp_dev.x;
last_y = tp_dev.y;
data->point.x = last_x;
data->point.y = last_y;
data->state = LV_INDEV_STATE_PR;
}
else
{
data->point.x = last_x;
data->point.y = last_y;
data->state = LV_INDEV_STATE_REL;
}
}</code></pre>
<p align="justify" >到此代码的移植全部完成,编译后有些错误提示,可以根据提示来添加头文件的引用等。</p>
<p align="justify" > </p>
<p align="justify" >【测试代码】</p>
<ol>
<li align="justify" >在main.c中,我们需要先添加lcd的初始化与电阻屏的初化与较准。</li>
</ol>
<p align="justify" > </p>
<ol start="2">
<li align="justify" >在app_freertos.c文件中,我们在任务中添加一个LED的控制程序,添加一个LED及一个开关部件来实现对板载LED红灯的控制。添加一个label标签,用于展示当前的时间,开启一个定时器,在定时器回调函数中刷定时间显示。</li>
</ol>
<p> </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" > </p>
<p align="justify" >附工程源代码:</p>
<p align="justify" ></p>
<p align="justify" > </p>
<p>STM32U5A5拥有大的flash与大内存,编写lvgl时不需要考虑内存是否足够的情况。</p>
<p> 确实对于资源不足的单片机可能还需要剪裁lvgl。</p>
<p>接下来和版主一起学习lvgl<img height="52" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/pleased.gif" width="48" /></p>
qiao--- 发表于 2024-1-20 19:42
STM32U5A5拥有大的flash与大内存,编写lvgl时不需要考虑内存是否足够的情况。
确实对于资源不足的 ...
<p>我最近要主攻TouchGFX,还没有掌握好呀。</p>
<p>这个屏的器件很让人恶心</p>
freebsder 发表于 2024-1-23 16:34
这个屏的器件很让人恶心
<p>能具体说吗?最近我在考察4寸屏幕的性能,我看到ILI9488的SPI接口屏很多,不会知道有什么坑</p>
bigbat 发表于 2024-1-25 11:21
能具体说吗?最近我在考察4寸屏幕的性能,我看到ILI9488的SPI接口屏很多,不会知道有什么坑
<p>各种寄存器设置的根本不知道啥意思,只能抄。</p>
freebsder 发表于 2024-1-25 22:36
各种寄存器设置的根本不知道啥意思,只能抄。
<p>ssd1306的资料在早期的时候也是这样,后来才出来一些资料。搞明白了一些寄存器,例如:翻转90°之类的。也是不到这些厂家怎么想的</p>
<p>大佬,这么快就出测评文章了,牛牛<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/congra.gif" width="48" /></p>
bigbat 发表于 2024-1-26 09:21
ssd1306的资料在早期的时候也是这样,后来才出来一些资料。搞明白了一些寄存器,例如:翻转90°之类的 ...
<p>深度产品应该不会用这种不可控的东西。很多寄存器完全不知道啥意思。</p>
页:
[1]