树莓派Pico搭载RP2040微控制器,是一款适用于图形用户界面(GUI)应用的通用硬件,尤其适合与开源LVGL(轻量级多功能图形库)搭配使用。随着LVGL9的最新发布,开发人员可以更加充分地利用其提升的性能、新功能和增强的灵活性。然而,要在RP2040上高效运行LVGL,需要优化资源使用,尤其是充分利用两个Cortex-M0+核心。
本文探讨了如何在RP2040上设置和运行LVGL9.x,实现多核处理,并启用XPT2046电阻式触摸屏,同时在两个核心之间分配任务以最大限度地提高性能。内容涵盖系统架构、显示、输入处理以及多核应用的实际示例。通过本文,读者能够在RP2040上轻松高效地运行LVGL9,使其成为嵌入式GUI应用的可行选择。希望Arduino IDE的“Board Manager”能够支持各种树莓派Pico开发板(RP2040),从而简化编译器配置。
下载最新版本的Arduino IDE(截至目前:2.3.4)。从“文件”菜单中进入“首选项”,然后将以下URL复制粘贴到“Additional boards manager URLs”中(图1):
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
图1:Arduino IDE首选项
打开Board Manager并安装树莓派Pico/RP2040/RP2350。(图2)。
图2:“树莓派Pico...”板的安装
RP2040是一款由树莓派开发的微控制器,于2021年1月发布。它旨在以低成本提供高性能,是嵌入式系统、业余爱好者项目和专业应用的理想之选。多家公司已开发了多种Pico开发板(基于RP2040 MCU),但第一款正式的Pico开发板如图3所示。你可以使用任意Pico开发板版本来学习本文,不过请查阅制造商文档,以了解其I/O图,以便修改配置文件。
图3:官方树莓派Pico板,由树莓派基金会开发(2M闪存)
RP2040微控制器规格
CPU:双核Arm Cortex-M0+(最高133MHz)
SRAM:264KB(分成多个组)
存储:无内置闪存,需要外部QSPI Flash(最高支持16MB)
GPIO:30个引脚(其中4个可用作ADC)
I/O接口
2×SPI、2×I²C、2×UART
16×PWM通道
8×PIO(可编程I/O),用于自定义外设
USB:USB1.1,支持主机和设备
电源:1.8V至3.3V操作
其他特性:硬件乘法器/除法器、浮点单元、看门狗定时器和实时时钟(RTC)
LVGL的配置和定义在V8.x到V9.x有所不同。图4显示了LVGL9.x的定义,你应该将其写入Arduino的“void setup()”函数上方。请根据你的屏幕分辨率修改“TFT_HOR_RES”和“TFT_VER_RES”。我的这个是示例的分辨率为320*240。
图4:LVGL-9定义
LVGL最具挑战性的函数是“flush”,它将数据发送到屏幕并进行渲染,图5展示了该函数。为了支持LVGL9,我们对该函数进行了一些修改,默认的MCU和LCD通信接口是通过“TFT_eSPI”库实现的SPI。
图5:LVGL flush函数
我们必须告诉“TFT_eSPI”库使用Pico开发板的SPI引脚。打开Pico开发板的GPIO引脚布局,并在设置文件中分配SPI和其他引脚(CS、RD等)。图6显示了官方树莓派Pico开发板的GPIO指南。图7显示了我对“User_Setup.h”文件的修改,你可以修改此文件,并将这些引脚分配给其他SPI和GPIO。
图6:官方树莓派Pico开发板的引脚排列
图7:Pico板SPI和ILI9341的其他引脚
在设置文件的底部,你可以初始化SPI外设(SPI-0、SPI-1等)以及LCD SPI、触摸屏XPT2046(“TFT_eSPi”库的默认触摸屏芯片)的时钟频率。我配置了SPI-1硬件,设置LCD为32MHz,触摸屏为2.5MHz(图8)。
图8:LCD和XPT2046触摸屏的SPI设置和时钟频率
LVGL9的设置函数应该像图9那样写,LVGL8.x和LVGL9之间是有很大差异的,我花了相当多的时间来调整和修改它。
图9:RP2040的LVGL9.x配置
要启用微控制器的第二个核心,必须调用multicore_launch_core1并将其分配给函数,该函数自然会包含一个无限循环,图10展示了如何实现它,我每500毫秒切换一次Pico LED(GPIO-25)来验证第二个核心的运行情况。这不是一个软件RTOS,而是一个真正的硬件多处理系统,一个CPU核心流畅地运行LVGL,另一个核心运行用户代码。
图10:启用RP2040 MCU的第二个内核
要在同一SPI总线上运行LCD芯片(ILI9341)和触摸芯片(XPT2046),你应该遵循图11所示的电路。同一SPI总线上两个器件的选择是通过每个器件的片选引脚进行的,尤其是在每个器件的时钟频率不同的情况下。J1是LCD连接器,包含驱动器和触摸芯片所需的所有引脚。
图11:ILI9341 TFT LCD和XPT2046触摸屏芯片的电路图
图12显示了测试结果,我已将LCD模块和Pico板放在面包板上,并验证了代码。本文介绍的步骤和经过测试的代码可以大大减轻你的工作量。
图12:测试GUI和代码
(原文刊登于EDN姊妹网站Embedded,参考链接:How to Make LVGL9.x C/C++ Applications on a Dual Core RP2040 MCU,由Ricardo Xie编译。)