【nRF5340】【笔记分享】NCS nRF52/53 添加LVGL组件驱动屏幕

本专栏由非官方人员 王小小海 所著,其内容主要记录了在开发5340的过程中遇到的一些问题和解决方法,还有一些应用的例程。作者本人也是在实践应用中遇到的问题,想着把这些问题分享给可能遇到的朋友。仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。

本专栏不涉及基础的安装和环境搭建问题,本例程开发使用最新版本的NCS 2.5.0开发,还请注意!。

本文代码位置

https://gitee.com/seliverwang/ncs_250_lvgl_demo.git

前言

nRF5340 作为Nordic 已推出系列中的 高端产品,拥有128Mhz的主频 和 32Mhz的SPI驱动能力。支持BLE 5.4 、LE Audio、AOA、Thread等多种协议,待机功耗在1~2个uA,很适合做低功耗的 手表 应用。今天就分享如何使用 zephyr 自带的 LVGL 组件进行 屏幕点亮,显示图标的教程。


所有分享内容

笔记分享

  1. 【笔记分享】NCS下radio_test添加FEM
  2. 【笔记分享】5340基于 BLE LBS 自定义网络核固件点亮LED并合并固件
  3. 【笔记分享】5340基于LBS自定义网络核双核DFU实现
  4. 【笔记分享】5340 设置public address 和 random address
  5. 【笔记分享】NCS nRF52/53 添加LVGL组件驱动屏幕
  6. 【笔记分享】VirtualBox Ubuntu22.04 不能使用nrfjprog问题记录

应用分享

暂无


NCS nRF52/53 添加LVGL组件驱动屏幕

前提准备和介绍

准备材料

  1. NCS 2.5.0 开发环境。
  2. nRF52/nRF53 系列开发板。
  3. SPI TFT屏幕一个。
  4. 杜邦线若干条。

本文使用 nRF5340 通过SPI 连接 驱动芯片为ILI9341的 TFT显示屏。


硬件准备

将SPI TFT屏幕 通过 杜邦线 按照以下引脚排序 接入到 开发板上。
硬件由此接好之后,开始准备 NCS 开发环境。

nRF5340TFT ILI9311
P1.15CS/CSN 片选
P1.14RESET 复位
P1.13DC/DCX 命令/数据 (低电平写命令,高电平写数据)
P1.12MOSI
P1.11SCK
P1.10MISO
VCCLED(背光)
VCCVCC
GNDGND

软件准备

创建工程

  1. 首先打开 VS CODE.
  2. 点击 nrf-connect.
  3. 点击 Create a new appication .
  4. Copy a sample .
  5. 输入 lvgl .
  6. 选择 lvgl .
  7. 回车并 打开当前目录。
开始操作

创建工程
创建工程

如果我们这个时候去选择板子编译,可以看到很多错误。

编译选择展示
在这里插入图片描述

报错展示
在这里插入图片描述

那么下面就开始解释如何编译成功。


移植操作流程

在这里插入图片描述

根据上面报错展示,展示了我们zephyr在调用时,调用了 设备树 CHOSEN 节点中的 zephyr_display 。由于没有这个节点,那么就直接报错。那么最简单的方式 就是 添加自己的设备树 overlay,在添加这个节点就可以了。详细过程见下节。

设备树增加和修改
  1. 创建 overlay文件,并创建设备树 zephyr_display节点。 根据自己的板子,创建不同名字的overlay, 此教程也适用 nRF52 系列。
    在这里插入图片描述
    创建完成之后,并添加 chosen节点 zephyr,display = &ili9341; ,其中 &ili9341 随意命名,但是最好就跟你 显示驱动的 IC芯片名称一致比较好,这个看个人规范爱好。

  1. 创建 之后,直接编译一次,可以看到它提示没有 ili9341 这个 label, 说明我们还需要定义 ili9341 的这个label。
    在这里插入图片描述
    ili9341 这个label怎么定义呢,我们完全不知道。这时候,就需要通过 github 去搜索了。

搜索介绍

  1. 打开 https://github.com/zephyrproject-rtos/zephyr zephyr的 github。
  1. 搜索 zephyr,display ,可见下图搜索结果。
    在这里插入图片描述
  1. 任意点击一个搜索结果,查找 zephyr,display对应的 label 定义。
    在这里插入图片描述
  1. 可以看到 原来 zephyr,display 节点关联的那个 ili9341 是 在 spi 节点定义的,那么我们就可以先把别人的拷贝出来,然后 修改成我们自己的。
    在这里插入图片描述
  1. 拷贝过来之后,可以看到别人用的 SPI1,并且驱动芯片为 ssd16xx。那么就需要把这些东西修改成我们能用的。我们打算 不用 SPI1,用SPI4(因为5340的 SPI4 在 128Mhz的情况下是高速SPI,可以跑到32Mhz)。其中这个 ssd16xx 节点里面有很多我们不知道的东西,full , partial 这些东西。不知道的东西,我们都删掉。然后把 ssd16xx 改成 ili9341.
  1. 修改内容为以下截图:**注意一定要修改spi4中的 compatible = “nordic,nrf-spi”; 为 compatible = “nordic,nrf-spim”;不然会报错。
    在这里插入图片描述
  1. 可以看到修改了之后,还剩下 ili9341 节点里面的 compatible 没有修改了。打开 zephyr sdk的目录下查看 zephyr现在支持哪些 显示驱动。其目录为:v2.5.0/zephyr/dts/bindings/display。
    在这里插入图片描述
  1. 可以看到,它有我们需要的 ilitek,ili9341,那么直接修改 compatible 为:
    在这里插入图片描述
  1. 点击编译,咱们试试能不能编译成功,编译之后,结果报,没有cmd-data-gpios 这个 属性,那奇怪了,我们上图不是有个 dc-gpios 吗,难道不一样 :
    在这里插入图片描述
  1. 这时候我们就需要打开对应的 compatible 文件中的属性,具体查看怎么定义的了。我们就点击 ili9341 这个compatible 查找 cmd-data-gpios,最后发现这个cmd-data-gpios在 ili9xxx-common.yaml文件中:
    在这里插入图片描述
  1. ili9xxx-common.yaml 这个文件中还定义了很多其他属性:
  • reset-gpios: 复位引脚,必须。
  • cmd-data-gpios:D/CX 引脚,必须。
  • pixel-format 显示格式为 RGB565和RGB888,我们用SPI通常是RBG565,默认就是RGB565那么我们不修改了。
  • rotation 旋转屏幕,0,90,180,270,我们暂时不修改。
  1. 那么根据上面的内容,我们对应自己的引脚修改完成overlay文件,修改overlay之后文件内容如下。那么修改完成不就OK了吗,完美!!!
  1. 那么我们开始下载编译吧,但是在这之前别忘了开启 log,不然不好调试,默认是开了log的,下载完成之后,你会发现什么情况,一直在不停的复位重启,复位重启。
    在这里插入图片描述什么鬼,为什么在一直不停的复位重启,那么我们看一看log里面是哪些地方错了。
    我们发现报错中有一行: lvgl: Vertical resolution is larger than maximum。
    然后又报了: lvgl: (0.385, +385) lv_disp_get_scr_act: no display registered to get its active screen (in lv_disp.c line #54)。
    那么我们 打开 lvgl这个文件看看,到底是什么问题。
  1. 打开vs code的 nrf-connect 文件浏览这一栏,找到lvgl,并打开 lvgl.c,搜索 Vertical resolution,可以看到原来 这一行出错了,那这一行出错了之后,会影响哪里呢?根据搜索可以看到, lvgl_allocate_rendering_buffers因为错误 直接返回了,没有注册和初始化 lvgl 的显示驱动函数,那么为啥这个会报错呢?
    在这里插入图片描述
    在这里插入图片描述
  1. 问题分析,发现 设备树 ili9341 节点中的,width = <320>;height = <240>; 但是ili9341的驱动默认是 width= 240, height = 320.因此我们需要把 屏幕旋转一下,那么我们在步骤 11 看到的 rotation 那就非常有用了。
    在这里插入图片描述
  1. 修改设备树,增加 rotation,增加完成之后如下图,我们在编译下载看看有没有问题。
    在这里插入图片描述
  1. 编译运行测试,终于正常运行了,但是屏幕上的颜色怎么不对呢,默认颜色是蓝色。查看.config文件发现 CONFIG_LV_COLOR_16_SWAP 没有将颜色反转,那么我们将颜色进行反转,在pj.conf中添加 CONFIG_LV_COLOR_16_SWAP=y.
  1. 编译完成,运行正常,可以看到它的 label 每1S增加一次计数值。
    在这里插入图片描述

拓展 设置

上面我们介绍了详细过程和思路。但是实际还需要查看LVGL一些配置相关的东西。

  1. 内存配置。LVGL 使用了2中内存管理方式,一就是 默认的 lvgl 自带mem管理,二是 使用自定义的 内存管理接口,比如:系统自带的 malloc ,或者zephyr定义的 lvgl_malloc。但是我们发现,实际lvgl的内存很小,只有 8 * 2048 = 16K。如果定义大的图片和显示多的控件就会内存不够,直接 HardFault。因此根据使用场景 加大 CONFIG_LV_Z_MEM_POOL_NUMBER_BLOCKS的数量。

默认lvgl的配置
在这里插入图片描述

zephyr定义的malloc函数
在这里插入图片描述


软件拓展、

在测试过程中发现,nRF5340的 SPIM4没有跑到32Mhz,只有16Mhz,但是在main中又初始化了主频到128Mhz,后续根据排查发现,zephyr在配置spi参数时会检查当前的主频,如果在128Mhz则配置 32Mhz,如果不是,那么最高只有16Mhz,并且配置1次波特率之后,就不会在更新了。那么就需要把 切换128Mhz的函数 放在 SPI参数配置之前。



// 高频128Mhz 运行模式.
static int hfclock_config_and_start(void)
{
	int ret;

	/* Use this to turn on 128 MHz clock for cpu_app */
	ret = nrfx_clock_divider_set(NRF_CLOCK_DOMAIN_HFCLK, NRF_CLOCK_HFCLK_DIV_1);

	ret -= NRFX_ERROR_BASE_NUM;
	if (ret) {
		return ret;
	}

	nrfx_clock_hfclk_start();
	while (!nrfx_clock_hfclk_is_running()) {
	}

	return 0;
}

// 初始化高频时钟128Mhz运行模式. 因为SPI配置的时候会判断当前是否在 高频模式,
SYS_INIT(hfclock_config_and_start, POST_KERNEL, 0);


结束语

以上为整个NCS nRF52/53 添加LVGL组件驱动屏幕笔记分享,本文内容较多,不过大多数都是在 overlay中使能对应的 设备树节点,zephyr编译期间去识别对应的节点是否存在,然后在转换为宏来开启对应功能,不太明白可以看一下gitee中的代码。

有不明白的地方欢迎提问,也厚脸皮要个赞或者关注,谢谢各位啦。


本系列文章大多数是本人遇到和解决过的问题,难有疏忽之处,有什么问题或者不明白的地方,欢迎留言询问!

  • 17
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: nrf5340是Nordic Semiconductor(挪威Nordic半导体公司)发布的一款多协议SoC(片上系统)芯片,该芯片被广泛用于物联网应用中。nrf5340集成了两个ARM Cortex-M33内核,能够同时运行多个协议,具有高度灵活性,可大大减少系统组成单元,降低系统成本。nrf5340还配备了双2MB闪存、1.8V至5V电源管理、USB、UART、SPI、I2C、GPIO等外设,使其支持多种连接方式。nrf5340芯片在安全方面也非常强大,支持物联网安全策略,如TLS(传输层安全)、加密、证书管理等。此外,nrf5340具有低功耗和高度优化的特性,其最低功耗可达到1.2μA,因此比其他同类芯片更适合应用于电池供电的IoT设备。nrf5340 PDF是该芯片数据手册的电子版文件,包含了关于nrf5340芯片的详细技术参数、特性、接口定义、引脚说明、开发指南等信息,有助于开发人员更好地了解和使用该芯片。 ### 回答2: nrf5340是诺基亚推出的一款基于64位Arm Cortex-A53应用处理器和Cortex-M33微控制器组合而成的芯片,被广泛用于物联网领域。它是专为面向未来网络和安全性、功耗、集成度和可扩展性而设计的。nrf5340融合了处理、通信和安全功能,同时具有高效的低功耗性能和可扩展的通信能力。值得一提的是,nrf5340采用全球性专有无线协议nRF Connect SDK,该协议结合Bluetooth低功耗技术实现了IEEE 802.15.4无线标准,并在制造和交付环节提供了更简单、更快速、更灵活的解决方案。此外,nrf5340还具有极高的安全等级,具备完善的硬件安全机制和安全软件支持。nrf5340可应用于智能家居、智能物联、智慧城市、智能工业和医疗领域等多个领域。nrf5340 pdf就是该芯片的数据手册,内容详实地描述了nrf5340的特性、功能和使用方法,对于开发者和研究人员来说是一份极为重要的资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值