教程:将 nRF52 与 nRF Connect SDK、CMake 和 CLion 一起使用
大约一年前,我们的嘉宾,NRB Tech 的创始人 Nick Brook 解释了如何将 CLion 用于 nRF52。 今天,Nick 带着新的教程回来了,重点讨论如何在 CLion 中使用基于 CMake 的 nRF Connect SDK。 请阅读 Nick 的这篇教程,并使用 CLion 尝试一下!
物联网顾问和 NRB Tech 创始人 Nick 于 2018 年创立了 NRB Tech,通过结合深入的硬件、软件和用户体验专业知识,构建实用和可持续的 IoT(物联网)产品。 |
在此之前,我们确定了如何将 Nordic 的 nRF5 SDK 与 CMake 和 CLion 一起使用。 2020 年 4 月,Nordic 发布了 1.0.0 版 nRF Connect SDK,这是 Nordic 产品向前发展的新平台。 此 SDK 基于 Zephyr RTOS,这是一种现代、安全、开源的实时操作系统,由 Facebook、Google、Intel、Nordic、NXP 和 Opticon 支持的 Linux Foundation 开发。 新 SDK 可以实现使用蜂窝和 Wi-Fi 并包含新的和未来 Nordic 模块的更复杂项目,同时还支持 nRF52 系列模块。
Zephyr 使用 CMake 作为构建系统,这使其比 nRF5 SDK 更容易在 CLion 中使用。 不过,我们需要进行一些设置。
前提
nRF Connect SDK 支持 nRF52 系列 SOC 以及较新的 nRF53 和 nRF91 SOC。 支持所有开发工具包和 Thingy 开发板。 nRF Connect SDK 支持 Windows、macOS 和 Linux。
设置工具链和 SDK
在 Windows 和 macOS 上设置 SDK 和工具链的最佳方式是使用 nRF Connect Toolchain Manager。 这是最简单的设置方式,它还可以确保所有工具链依赖项都在一个位置,并且是适用于该 SDK 版本的正确版本。
也可以按照手动安装说明在 Linux 上安装。
在本教程中,当需要 SDK 的路径时,我们将使用 <ncsroot>
作为占位符。 如果使用 1.5.0 版本的 Toolchain Manager,在 Windows 上为 C:Users<user>ncsv1.5.0
;在 macOS 上为 /opt/nordic/ncs/v1.5.0
。
创建要在 CLion 中使用的自定义项目
我们从示例 Nordic 项目创建一个自定义项目。
- 在
<ncsroot>/nrf/samples
目录中找到 SDK 中的相关示例。 将其复制到系统上一个方便的位置。 如果愿意,可以重命名该目录。 如果您对 nRF52 非常陌生,建议使用 peripheral_hids_mouse 示例。 该示例模拟了一个普通的计算机鼠标。 有关详情,请参阅示例的 README.rst 文件。 - 在 CLion 中打开该项目。 暂时忽略所有错误。
- 在 CLion 偏好设置中,转到 Build, Execution, Deployment | Toolchains(构建、执行、部署 | 工具链),并添加一个新的工具链。 按如下所示进行配置:
- 名称:“nRF Connect SDK <version>”,将 <version> 替换为您正在使用的 SDK 版本
- CMake:
<ncsroot>/bin/cmake
- C 编译器:
<ncsroot>/bin/arm-none-eabi-gcc
- C++ 编译器:
<ncsroot>/bin/arm-none-eabi-g++
- 调试器:
<ncsroot>/bin/arm-none-eabi-gdb
- 点击 Apply(应用)
- 在 CLion 偏好设置中,转到 Build, Execution, Deployment | CMake(构建、执行、部署 | CMake),然后选择现有的“Debug”配置文件。
- 将 Build type(构建类型)设置为
ZDebug
(这一点将在本文最后进一步解释) - 将 Toolchain(工具链)设置为我们刚刚创建的
nRF Connect SDK <version>
工具链 - 在 CMake options(CMake 选项)中添加
-G Ninja
。 Ninja 是 Zephyr 的推荐生成器,可以防止 Windows 上出现问题。
- 将 Build type(构建类型)设置为
- 为了向 Zephyr 提供所需的系统和项目特定配置,我们必须设置环境变量。 我们需要在 CLion 配置文件中设置环境变量,因为这会将它们传播到由 CMake 启动的进程,这样,使用
west
的目标将能够正常工作。 如果我们在CMakeLists.txt
中设置环境变量,它们将不会传播到已启动的进程。- 如果您正在使用工具链管理器,请点击已安装的 NCS 版本旁边的向下箭头,然后:
- 在 Windows 上,点击“打开命令提示符”并粘贴:
echo BOARD=nrf52dk_nrf52832;ZEPHYR_BASE=%ZEPHYR_BASE%PATH=%PATH%;GIT_EXEC_PATH=%GIT_EXEC_PATH%;ZEPHYR_TOOLCHAIN_VARIANT=%ZEPHYR_TOOLCHAIN_VARIANT%;GNUARMEMB_TOOLCHAIN_PATH=%GNUARMEMB_TOOLCHAIN_PATH% | clip
- 在 macOS 上,点击“打开终端”并粘贴:
echo "BOARD=nrf52dk_nrf52832;ZEPHYR_BASE=$(pwd)/zephyr;PATH=$PATH:/usr/local/bin;GIT_EXEC_PATH=$GIT_EXEC_PATH;ZEPHYR_TOOLCHAIN_VARIANT=$ZEPHYR_TOOLCHAIN_VARIANT;GNUARMEMB_TOOLCHAIN_PATH=$GNUARMEMB_TOOLCHAIN_PATH" | pbcopy
结果会自动复制到剪贴板中。 将其粘贴到 CLion 的 CMake 配置文件配置中的 Environment(环境)框中。
- 在 Windows 上,点击“打开命令提示符”并粘贴:
- 如果您已手动安装,请将以下内容粘贴到 Environment(环境)中并进行修改。
BOARD=nrf52dk_nrf52832;ZEPHYR_BASE=<ncsroot>;PATH=<ncsroot>/toolchain/bin:<existing path>;GIT_EXEC_PATH=<ncsroot>/toolchain/Cellar/git/2.26.2/libexec/git-core;ZEPHYR_TOOLCHAIN_VARIANT=gnuarmemb;GNUARMEMB_TOOLCHAIN_PATH=<ncsroot>/toolchain
- 修改
ZEPHYR_BASE
、GIT_EXEC_PATH
和GNUARMEMB_TOOLCHAIN_PATH
,替换<ncsroot>
。 - 在
PATH
变量中,NCS 工具链必须在其他路径之前。 CLion 暂不支持环境变量中的变量扩展,因此需要输入完整路径,替换<existing path>
。 为了获取要使用的路径,请在 shell(macOS 和 Linux)中输入echo $PATH
,或在命令提示符 (Windows) 中输入echo %PATH%
。
- 修改
- 如果要使用 nRF52 DK 以外的开发板,则需要将
BOARD
环境变量修改为要使用的开发板。 此处的 Build target(构建目标)列中定义了可用开发板。 您还可以按照在线讲座和指南创建自定义开发板。
- 如果您正在使用工具链管理器,请点击已安装的 NCS 版本旁边的向下箭头,然后:
- 复制 ZDebug 配置文件并将新配置文件的 Build type(构建类型)修改为“ZRelease”。 点击 OK(确定)。
- 大多数项目配置在
prj.conf
文件中完成。 将此文件重命名为prj.common.conf
。 这将包含 ZDebug 和 ZRelease 构建的通用配置。 打开文件,并在底部添加:# Use RTT instead of UART for debug output (optional) CONFIG_USE_SEGGER_RTT=y CONFIG_RTT_CONSOLE=y CONFIG_UART_CONSOLE=n
- 创建新文件
prj.ZDebug.conf
并添加:# Optimize for debug CONFIG_DEBUG_OPTIMIZATIONS=y
- 创建新文件
prj.ZRelease.conf
并添加:# Optimize for speed. See https://docs.zephyrproject.org/latest/reference/kconfig/choice_471.html#choice-471 for other options CONFIG_SPEED_OPTIMIZATIONS=y # Disable assertions in the Zephyr Kernel. This improves the execution speed and prevents a CMake configure warning. See https://docs.zephyrproject.org/latest/reference/kconfig/CONFIG_ASSERT.html CONFIG_ASSERT=n
- 打开
CMakeLists.txt
文件。 在find_package(Zephyr ...)
行之前,插入:if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE ZDebug) endif() # Point to the build type and common config files set(CONF_FILE "prj.${CMAKE_BUILD_TYPE}.conf" "prj.common.conf")
- 点击 Tools | CMake | Reset Cache and Reload Project(工具 | CMake | 重置缓存并重新加载项目)
- 您现在可以使用
zephyr_final
目标构建<project dir>/cmake-build-<profile>/zephyr.hex
,使用flash
目标构建并刷写到开发板上。 - 您可以按照 Nordic 的使用示例应用程序进行测试指南中的步骤获得 RTT 输出。 基本上,在安装 JLink 软件和文档包之后,运行:
- 在 Windows 上:
JLinkRTTViewer.exe
- 在 macOS 上:
open /usr/local/bin/JLinkRTTViewer.app
- 在 Linux 上:
JLinkRTTViewerExe
然后,选择您正在使用的 Nordic SOC;其他使用默认值即可。
- 在 Windows 上:
- 接下来,我们将设置调试。
- 在 CLion 窗口的右上方,点击配置下拉菜单,选择 Edit Configurations(编辑配置)。 然后添加一个新的 Embedded GDB Server(嵌入式 GDB 服务器)配置:
- 按如下所示进行配置:
- 设置名称
- 勾选 Store as project file(存储为项目文件)以与您的项目的其他 CLion 用户共享此文件
- 选择
zephyr_final
目标 - 选择
zephyr_final
可执行文件 - 将 Target remote args(目标远程实参)设置为
tcp:localhost:2331
- 将 GDB Server(GDB 服务器)设置为
- Mac:/usr/local/bin/JLinkGDBServer.
- Windows:C:Program Files (x86)SEGGERJLinkJLinkGDBServerCL.exe.
- 或者您的系统的适当路径。
- 将 GDB Server args(GDB 服务器实参)设置为
-device nrf52 -strict -timeout 0 -nogui -if swd -speed 4000 -endian little -s
- 请注意,您可能需要调整
-device
形参以匹配您的设备。 有一个完整的可用列表 – 从下拉菜单中选择 Nordic Semi,并对此形参使用相关的 Device name(设备名称)。
- 要避免 CLion/JLink GDB 服务器的已知问题,您可以绕过该问题。 按两次 Shift,输入“registry”,打开注册表,然后将“cidr.debugger.gdb.interrupt.signal”更改为“SIGTRAP”。
- 现在,您可以构建此目标,它将构建并刷写,或者您可以进行调试。 调试时,如果调试器启动时未命中断点,只需点击 Reset(重置)按钮并继续:
- 您还可以在调试时查看设备上外设的状态。 点击 Peripherals(外设)选项卡,然后点击 Load .svd file(加载 .svd 文件):
- 浏览到
<ncsroot>/modules/hal/nordic/nrfx/mdk
并为您的硬件选择 .svd 文件(对于 nRF52832,请使用 nrf52.svd),然后选择您要监控的外设。 当调试器暂停时,您将能够检查外设寄存器的值:
- 在 CLion 窗口的右上方,点击配置下拉菜单,选择 Edit Configurations(编辑配置)。 然后添加一个新的 Embedded GDB Server(嵌入式 GDB 服务器)配置:
- 除了使用 CLion 进行调试之外,使用 Segger Embedded Studio (SES) 有时也很有用。 这是 Nordic 正式支持的 IDE,所以如果您遇到问题,最好用它来测试。 此外,在调试时,无需配置即可直接在 IDE 中查看 RTT 输出。 使用 nRF Connect SDK,您可以按照指南中的说明,像打开任何示例项目一样打开您的项目。
- 与 Nordic 的教程一样,在本指南中,我们使用了 ZDebug 和 ZRelease 构建类型。 这可以避免 CMake 为 C 和 C++ 编译器标志使用内置默认值,这些默认值与 Zephyr 从 KConfig 定义的标志冲突。 如果您想使用标准的“Debug”和“Release”构建类型(例如,如果您添加到项目中的库使用了这些类型),请尽管使用。 但是,您必须重置 CMake 的默认标志,并禁用 Zephyr 发出的警告。
- 打开
CMakeLists.txt
文件。 在我们之前添加的CONF_FILE
行之后,插入:# CMake sets some default compiler flags in CMAKE_<LANG>_FLAGS_<CONFIG>. Zephyr sets all required flags from KConfig so # clear CMake defaults to avoid any conflicts. foreach(lang C CXX) set(CMAKE_${lang}_FLAGS "") foreach(type DEBUG RELEASE RELWITHDEBINFO MINSIZEREL) set(CMAKE_${lang}_FLAGS_${type} "") endforeach() endforeach() # Suppress a warning from Zephyr about a mismatch between CMAKE_<LANG>_FLAGS_<CONFIG> optimization flags (now empty) and # Zephyr's KConfig optimization flags. set(NO_BUILD_TYPE_WARNING ON)
- 在 CMakeLists.txt 中,将默认的构建类型从 ZDebug 更改为 Debug。
- 将
prj.ZDebug.conf
和prj.ZRelease.conf
重命名为prj.Debug.conf
和prj.Release.conf
- 在 CLion Settings/Preferences | Build, Execution, Deployment | CMake(设置/偏好设置 | 构建、执行、部署 | CMake)中,将您的配置文件中的 Build type(构建类型)更改为
Debug
和Release
。
- 打开
现在,我们已经完成在 CLion 中为 nRF Connect SDK 开发设置一个示例项目! 要详细了解 nRF Connect SDK 开发,您可能需要探索:
- nRF connect SDK 中的其他示例:
<ncsroot>/nrf/samples/bluetooth
– 蓝牙示例<ncsroot>/nrf/samples/sensor
– 传感器示例<ncsroot>/nrf/samples/sensor/bh1749
– I2C 示例
<ncsroot>/nrf/samples/bootloader
– Bootloader 示例
- 应用程序开发指南,其中介绍了您将在配置项目的示例中找到的文件。
- 设备树指南,其中介绍了在 Zephyr 中配置硬件的方式。
现在,您可以尝试一下了!
本博文英文原作者: