【nRF5340】【笔记分享】5340基于 BLE LBS 自定义网络核固件点亮LED并合并固件分享

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

本专栏不涉及基础的安装和环境搭建问题,本例程开发使用的NCS 2.0.0,如果涉及2.0.0以上开发,会加以备注。


所有分享内容

笔记分享

  1. 【笔记分享】NCS下radio_test添加FEM
  2. 【笔记分享】5340基于 BLE LBS 自定义网络核固件点亮LED并合并固件
  3. 【笔记分享】5340基于LBS自定义网络核双核DFU实现

应用分享

暂无


5340基于 BLE LBS 自定义网络核固件点亮LED,并合并固件。

在5340的使用场合时,开发BLE应用的时候基本上都直接通过NCS自动生成hci_rpmsg来实现网络核的功能。但难免有的时候会出现当前想自定义网络核固件的情况,比如想在网络核里面点亮LED灯,或者在网络核里面 切换到 ESB(私有 2.4G)通信等。

首先本文基于了 5340 的 LBS 外围设备例程,通过自定义网络核应用固件,实现网络核固件点亮LED灯(会LED灯才会后续的,自定义固件ESB的 FEM T/RX切换),对应固件完成之后并合并成一个merged_domains.hex文件。(后续会推出基于5340的BLE和ESB互相切换,可以提前点个关注,谢谢大家支持!)

废话不多说,先从原理开始说起。


原理解析与前提

5340在创建LBS例程之后,点击build会自动生成hci_rpmsg的固件,并编译完成之后会在build/zephyr/目录下生成merged_domains.hex 和没有合并的zephyr.hex,如果你下过网络核固件并只想只更新应用核固件,那么直接下zephyr.hex(感觉在废话 ),那么如果要实现标题的目标怎么办,那么需要以下步骤:

  1. 在pj.conf文件中关闭自动包含 hci_rpmsg 的配置项。
  2. 创建一个hci_rpmsg的工程,初始化LED灯,并创建定时器在定时器里翻转GPIO口。
  3. 在peripheral_lbs 应用核的工程中添加 overlay 文件,创建添加方法有2种:
    • 目录下,创建boards文件夹(默认是有的,如果自己的工程需要创建这个文件夹来添加nrf5340dk_nrf5340_cpuapp.overlay,这个方法不需要在 根目录下的CMakeLists.txt文件中添加任何东西。
    • 在任意目录下 创建 任意名字的 .overlay,然后通过修改CMakeLists.txt文件,使其在编译阶段dtc能够识别到 自定义的 .overlay 文件。
  4. 在创建的overlay文件中,将要给网络核用的GPIO引脚释放给网络核。

以上便实现了网络核点灯的功能。
原理解析:
主要是在于创建overlay文件中添加 zephyr能够识别的 节点,在初始化阶段的时候会把gpio_fwd节点内的GPIO口都释放给网络核,当然你也可以直接用函数:
nrf_gpio_pin_mcu_select(31 , NRF_GPIO_PIN_MCUSEL_NETWORK);
释放给网络核,不过移植方便肯定是在overlay里面操作啦。

gpio_fwd: nrf-gpio-forwarder {
        led_pins {
            gpios = < &gpio0 31 GPIO_ACTIVE_HIGH >;
        };
    };

以上是前期基本原理解析,由于工程是2个工程,下载就得分开的2个.hex文件,大家就会觉得很麻烦,这时候需要合并成一个merged_domain.hex就需要一下步骤了。

  1. 将hci_rpmsg工程移动到peripheral_lbs目录下。
  2. 在peripheral_lbs目录创建 zephyr 文件夹,在文件夹下创建 module.yml文件,并自定义文件内容。
  3. 在peripheral_lbs目录创建 aci 文件夹,在文件夹下创建 CMakeLists.txt文件,并自定义文件内容。
  4. 修改peripheral_lbs目录的CMakeLists.txt文件内容。
  5. 修改peripheral_lbs目录的Kconfig文件内容

原理解析:zephyr留了一个能够自定义包含网络核固件的cmake函数,这个函数可以调用任意目录下的网络核工程,不过建议放在应用核目录下,然后只调用这个cmake函数不够,还需要使能cmake的环境变量——ZEPHYR_EXTRA_MODULES,通过ZEPHYR_EXTRA_MODULES去调用步骤2的zephyr文件夹下的 module.yml,然后module.yml去调用步骤三的 aci文件夹CMakeLists.txt文件,然后aci文件夹CMakeLists.txt文件去添加包含 网络核工程。

以上步骤完成之后,编译就可以生成 merged_domain.hex 的文件了,看起来有点多,起始也不多,很简单的,详细步骤情况下面。


自定义固件实现步骤

最初准备:创建LBS例程和创建hci_rpmsg工程

  1. 首先咱们先创建一个文件夹名字任意,在 目录下输入

code .

打开vs code(Linux下,如果windows直接正常操作),创建LBS例程和hci_rpmsg例程。

  • peripheral_lbs 例程
    lbs例程
  • hci_rpmsg 固件代码项目目录
    hci_rpmsg例程
  1. 在VS Code 的 NCS组件下选择 board为 nrf5340dk_nrf5340_cpunet. 如果不是DK板可以在右侧点击Create New Board,或者 使用 Overlay来对应配置设备树。(不过我觉得搜这篇文章的同学都不会是才接触 NCS的)
  • 编译 hci_rpmsg,由于rpmsg是网络核固件,可以直接编译的。
    在这里插入图片描述

  • 编译应用核固件之前需要 在pj.conf文件中添加 不自动包含 rpmsg的CONFIG 。

# Avoid multi-build system build network core firmware
CONFIG_NCS_INCLUDE_RPMSG_CHILD_IMAGE=n

在这里插入图片描述

  • 等待编译结束之后将2个固件下进去,分别下进去,通过log就可以看到对应的启动了。不过,如果你两个核都下载了,但是进入网络核调试,那么就必须同时得debug应用核,因为需要应用核的rpmsg 重启一次。


在这里插入图片描述

  • 编译完成,没有错误,下载进去之后,能够正常广播,nrf connect也能正常扫描到(就不放图了,因为基本上没有问题)。
可能出现的问题

如果编译成功下载进去之后无法正常运行,多半是卡在了 晶振初始化的问题,默认NCS选择的外部低频时钟晶振,如果没有外部的就用内部的。只需要在 应用核的pj.conf 添加,即可:

CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y 

步骤二:在hci_rpmsg添加定时器翻转GPIO

由于工程量比较小,直接在 hci_rpmsg工程下的main.c修改了。

#include <nrfx_gpiote.h>

static void led_show_handler(struct k_timer *dummy);
static K_TIMER_DEFINE(led_show_timer, led_show_handler, NULL);


int32_t leds_init(void)
{
	// 初始化gpio31,
    nrf_gpio_cfg_output(31);
    nrf_gpio_pin_clear(31);

	// 开启定时器.
	return k_timer_start(&led_show_timer, K_NO_WAIT , K_MSEC(1000));
}


static void led_show_handler(struct k_timer *dummy)
{
	nrf_gpio_pin_toggle(31);
}

void main(void)
{
	int err;
	const struct device *hci_ipc_instance =
		DEVICE_DT_GET(DT_CHOSEN(zephyr_bt_hci_rpmsg_ipc));

	/* incoming events and data from the controller */
	static K_FIFO_DEFINE(rx_queue);

	LOG_DBG("Start");
	
	leds_init();
    
    // 复制到这里就可以了,其它都一样的,

编译一下,没有错,将软件下进去,虽然暂时看不到现象,因为应用核没有释放gpio给网络核
在这里插入图片描述

步骤三:在应用核的overlay中添加fwd释放gpio口给网络核

方法一,使用boards文件夹识别与板名字相同的overlay

首先创建overlay文件,在boards目录下一定要名字和你选的板子名字相同,不然不一样的无法识别的。
在这里插入图片描述
创建好了之后,填入以下

/ {
    
    gpio_fwd: nrf-gpio-forwarder {
        led_pins {
            gpios = < &gpio0 31 GPIO_ACTIVE_HIGH >;
        };
    };
};

填好了之后,就跟下面截图一样了,当然有同学会看到一个多的 overlay的文件夹,那个是方法二用到的,

在这里插入图片描述

重新编译一下可以看到,一下截图的信息的话,就说明添加成功了,或者直接等编译完成去看build/zephyr/目录下的zephyr.dts文件可以。


添加成功,那么只需要下载进去,那么可以看到,LED4在以1S为周期的闪烁了。(如果没有现象,需要断电重启一次,forwarder有的时候不会立即生效)

方法二,使用自定义文件夹,在cmake文件添加指定overlay文件

添加任意名字的文件夹,任意名字的.overlay文件,在lbs目录下的cmakelists.txt中添加

set(DTC_OVERLAY_FILE ${CMAKE_CURRENT_SOURCE_DIR}/overlay/my_custom_boards.overlay)

效果如下图:这个my_custom_boards.overlay内容和刚才nrf5340dk_nrf5340_cpuapp.overlay是一样的,我移动过来,然后改了个名字。
在这里插入图片描述
点击编译,如果你的编译没有效果,可以点击 这个按钮,是将build全部清掉重新编译。看到了overlay的调用,那么成功啦。然后下载进去,可以看到LED4在按照1S闪烁。
在这里插入图片描述

以上就是自定义固件修改固件的全过程了,下面就教大家怎么合并了


合并自定义网络核固件和应用核固件

再所有步骤开始之前,需要将 hci_rpmsg项目拷贝到 lbs目录下!

在应用核目录下创建依赖文件夹添加依赖

  • 在lbs例程目录下创建:
  1. 创建aci 文件夹 并 创建 CMakeLists.txt 。
  2. 创建zephyr文件夹 并创建 module.yaml。

创建完成效果如下:(hci_rpmsg是拷贝的,圈出来是提醒一下)

在这里插入图片描述

  • 修改aci 文件夹下CMakeLists.txt 内容
#
# Copyright (c) 2022 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#

# This check is needed to avoid infinite recursion. This module code will
# be executed for all images in the build, also for the child image being
# added below.
if (CONFIG_INCLUDE_NET_CORE_IMAGE)
    add_child_image(
      NAME cpunet
      SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/../hci_rpmsg
      DOMAIN CPUNET
      BOARD ${CONFIG_DOMAIN_CPUNET_BOARD}
      )
  endif()
  
  • 修改zephyr文件夹 的module.yaml内容为
build:
    cmake: aci
  • 修改lbs目录下Kconfig文件,增加一下内容
config INCLUDE_NET_CORE_IMAGE
	bool "Include net image as sub image"
	depends on SOC_NRF5340_CPUAPP
	default y if (BOARD_NRF5340DK_NRF5340_CPUAPP || BOARD_NRF5340DK_NRF5340_CPUAPPNS)
	select PARTITION_MANAGER_ENABLED
	select BOARD_ENABLE_CPUNET

不太清楚的同学看截图:
在这里插入图片描述

  • 修改lbs文件夹下CMakeLists.txt 内容
set(ZEPHYR_EXTRA_MODULES ${CMAKE_CURRENT_LIST_DIR})

在这里插入图片描述

完成以上为所有添加步骤,点击编译即可,等待编译完成。

可以看到终端提示了 CPUNET 的信息,基本说明了已经成功添加了 Child image,如果不放心还可以在 build 完成之后在 build 目录下 运行

ninja partition_manager_report

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


结束语

以上为整个自定义网络核固件和怎么将自定义网络核固件绑定一起的笔记分享,自定义网络核固件这个应用比较简单,合并的事情这个阶段也很简单,但是到了 应用核和网络核都需要DFU的时候,需要添加一些配置,这个我也折腾了好久,在Nordic的论坛上起码问了4次才搞懂(苦笑,每个人回答都不一样,不过也好原理也搞懂了)

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


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

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值