Tips & Tricks

教程:将 nRF52 与 nRF Connect SDK、CMake 和 CLion 一起使用

Read this post in other languages:

大约一年前,我们的嘉宾,NRB Tech 的创始人 Nick Brook 解释了如何将 CLion 用于 nRF52。 今天,Nick 带着新的教程回来了,重点讨论如何在 CLion 中使用基于 CMake 的 nRF Connect SDK。 请阅读 Nick 的这篇教程,并使用 CLion 尝试一下!

Nick Brook 物联网顾问和 NRB Tech 创始人
Nick 于 2018 年创立了 NRB Tech,通过结合深入的硬件、软件和用户体验专业知识,构建实用和可持续的 IoT(物联网)产品。

在此之前,我们确定了如何将 Nordic 的 nRF5 SDK 与 CMakeCLion 一起使用。 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 项目创建一个自定义项目。

  1. <ncsroot>/nrf/samples 目录中找到 SDK 中的相关示例。 将其复制到系统上一个方便的位置。 如果愿意,可以重命名该目录。 如果您对 nRF52 非常陌生,建议使用 peripheral_hids_mouse 示例。 该示例模拟了一个普通的计算机鼠标。 有关详情,请参阅示例的 README.rst 文件。
  2. 在 CLion 中打开该项目。 暂时忽略所有错误。
  3. 在 CLion 偏好设置中,转到 Build, Execution, Deployment | Toolchains(构建、执行、部署 | 工具链),并添加一个新的工具链。 按如下所示进行配置:
    NRF 工具链

    1. 名称:“nRF Connect SDK <version>”,将 <version> 替换为您正在使用的 SDK 版本
    2. CMake:<ncsroot>/bin/cmake
    3. C 编译器:<ncsroot>/bin/arm-none-eabi-gcc
    4. C++ 编译器:<ncsroot>/bin/arm-none-eabi-g++
    5. 调试器:<ncsroot>/bin/arm-none-eabi-gdb
    6. 点击 Apply(应用)
  4. 在 CLion 偏好设置中,转到 Build, Execution, Deployment | CMake(构建、执行、部署 | CMake),然后选择现有的“Debug”配置文件。
    1. Build type(构建类型)设置为 ZDebug(这一点将在本文最后进一步解释)
    2. Toolchain(工具链)设置为我们刚刚创建的 nRF Connect SDK <version> 工具链
    3. CMake options(CMake 选项)中添加 -G Ninja。 Ninja 是 Zephyr 的推荐生成器,可以防止 Windows 上出现问题。
  5. 为了向 Zephyr 提供所需的系统和项目特定配置,我们必须设置环境变量。 我们需要在 CLion 配置文件中设置环境变量,因为这会将它们传播到由 CMake 启动的进程,这样,使用 west 的目标将能够正常工作。 如果我们在 CMakeLists.txt 中设置环境变量,它们将不会传播到已启动的进程。
    1. 如果您正在使用工具链管理器,请点击已安装的 NCS 版本旁边的向下箭头,然后:
      1. 在 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
      2. 在 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(环境)框中。

    2. 如果您已手动安装,请将以下内容粘贴到 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
      1. 修改 ZEPHYR_BASEGIT_EXEC_PATHGNUARMEMB_TOOLCHAIN_PATH,替换 <ncsroot>
      2. PATH 变量中,NCS 工具链必须在其他路径之前。 CLion 暂不支持环境变量中的变量扩展,因此需要输入完整路径,替换 <existing path>。 为了获取要使用的路径,请在 shell(macOS 和 Linux)中输入 echo $PATH,或在命令提示符 (Windows) 中输入 echo %PATH%
    3. 如果要使用 nRF52 DK 以外的开发板,则需要将 BOARD 环境变量修改为要使用的开发板。 此处的 Build target(构建目标)列中定义了可用开发板。 您还可以按照在线讲座指南创建自定义开发板。
      CMake 配置文件
  6. 复制 ZDebug 配置文件并将新配置文件的 Build type(构建类型)修改为“ZRelease”。 点击 OK(确定)。
  7. 大多数项目配置在 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
  8. 创建新文件 prj.ZDebug.conf 并添加:
    # Optimize for debug
    CONFIG_DEBUG_OPTIMIZATIONS=y
  9. 创建新文件 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
  10. 打开 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")
  11. 点击 Tools | CMake | Reset Cache and Reload Project(工具 | CMake | 重置缓存并重新加载项目)
  12. 您现在可以使用 zephyr_final目标构建 <project dir>/cmake-build-<profile>/zephyr.hex,使用 flash 目标构建并刷写到开发板上。
  13. 您可以按照 Nordic 的使用示例应用程序进行测试指南中的步骤获得 RTT 输出。 基本上,在安装 JLink 软件和文档包之后,运行:
    • 在 Windows 上:JLinkRTTViewer.exe
    • 在 macOS 上:open /usr/local/bin/JLinkRTTViewer.app
    • 在 Linux 上:JLinkRTTViewerExe

    然后,选择您正在使用的 Nordic SOC;其他使用默认值即可。

  14. 接下来,我们将设置调试。
    1. 在 CLion 窗口的右上方,点击配置下拉菜单,选择 Edit Configurations(编辑配置)。 然后添加一个新的 Embedded GDB Server(嵌入式 GDB 服务器)配置:
      嵌入式 GDB 配置
    2. 按如下所示进行配置:
      配置详细信息

      1. 设置名称
      2. 勾选 Store as project file(存储为项目文件)以与您的项目的其他 CLion 用户共享此文件
      3. 选择 zephyr_final 目标
      4. 选择 zephyr_final 可执行文件
      5. Target remote args(目标远程实参)设置为 tcp:localhost:2331
      6. 将 GDB Server(GDB 服务器)设置为
        • Mac:/usr/local/bin/JLinkGDBServer.
        • Windows:C:Program Files (x86)SEGGERJLinkJLinkGDBServerCL.exe.
        • 或者您的系统的适当路径。
      7. GDB Server args(GDB 服务器实参)设置为
        -device nrf52 -strict -timeout 0 -nogui -if swd -speed 4000 -endian little -s
      8. 请注意,您可能需要调整 -device 形参以匹配您的设备。 有一个完整的可用列表 – 从下拉菜单中选择 Nordic Semi,并对此形参使用相关的 Device name(设备名称)。
    3. 要避免 CLion/JLink GDB 服务器的已知问题,您可以绕过该问题。 按两次 Shift,输入“registry”,打开注册表,然后将“cidr.debugger.gdb.interrupt.signal”更改为“SIGTRAP”。
    4. 现在,您可以构建此目标,它将构建并刷写,或者您可以进行调试。 调试时,如果调试器启动时未命中断点,只需点击 Reset(重置)按钮并继续:
      调试进程
    5. 您还可以在调试时查看设备上外设的状态。 点击 Peripherals(外设)选项卡,然后点击 Load .svd file(加载 .svd 文件):
      加载 SVD
    6. 浏览到 <ncsroot>/modules/hal/nordic/nrfx/mdk 并为您的硬件选择 .svd 文件(对于 nRF52832,请使用 nrf52.svd),然后选择您要监控的外设。 当调试器暂停时,您将能够检查外设寄存器的值:
      “外设”视图
  15. 除了使用 CLion 进行调试之外,使用 Segger Embedded Studio (SES) 有时也很有用。 这是 Nordic 正式支持的 IDE,所以如果您遇到问题,最好用它来测试。 此外,在调试时,无需配置即可直接在 IDE 中查看 RTT 输出。 使用 nRF Connect SDK,您可以按照指南中的说明,像打开任何示例项目一样打开您的项目。
  16. 与 Nordic 的教程一样,在本指南中,我们使用了 ZDebug 和 ZRelease 构建类型。 这可以避免 CMake 为 C 和 C++ 编译器标志使用内置默认值,这些默认值与 Zephyr 从 KConfig 定义的标志冲突。 如果您想使用标准的“Debug”和“Release”构建类型(例如,如果您添加到项目中的库使用了这些类型),请尽管使用。 但是,您必须重置 CMake 的默认标志,并禁用 Zephyr 发出的警告。
    1. 打开 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)
    2. CMakeLists.txt 中,将默认的构建类型从 ZDebug 更改为 Debug
    3. prj.ZDebug.confprj.ZRelease.conf 重命名为 prj.Debug.confprj.Release.conf
    4. 在 CLion Settings/Preferences | Build, Execution, Deployment | CMake(设置/偏好设置 | 构建、执行、部署 | CMake)中,将您的配置文件中的 Build type(构建类型)更改为 DebugRelease

现在,我们已经完成在 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 中配置硬件的方式。

现在,您可以尝试一下了!

下载 CLION

本博文英文原作者:

Sue

Anastasia Kazakova

Discover more

使用 CLion 进行 Arduino 开发:从业余爱好到专业项目 – 第一部分

如今,许多开发者都在尝试基于 Arduino 的项目。 Arduino 很容易上手,通过灯光闪烁或机器人移动看到自己的编码成果是一种令人愉快的体验。 但大多数 Arduino 开发者止步于此。 他们像周末勇士一样从事自己的项目,只是把它们当作小爱好和编外项目。 在这一系列博文中,我们会探讨如何将您的私人兴趣项目提升到更专业的水平,以及像 CLion 这样的 IDE 如何帮助您实现这一目标。 我们要构建什么 我们为这个项目设定了一个宏大的目标。 我们将构建一个电子气压计,这是一种测量气压并将其绘制在图表上以预测未来几个小时天气状况的设备。 这比传统的气压计更有用,因为跟踪压强变化比跟踪绝对值更重要。 该设备应当由电池供电,充一次电应当可以工作几周。 我们将从构建经典项目 DIY 气压计开始。我们将使用: Bosch BMP085 气压传感器。 我们将使用 GY-65 模块,不过也可以用 BMP180 (GY-68) 代替。 Arduino Uno 开发板。 我们使用 DFRduino UNO R3,因为它有彩色连接器 :) Waveshare 4.2 英寸电子纸屏幕。 导线、USB 线缆、几个塑料 PCB 支架、M3 螺栓和螺母。 IKEA 塑料平板电脑支架,用于将所有原型部件固定在一起。 听起来很有趣,对吗? 我们开始吧! 从原型开始 电子装置安装 我们首先在平板电脑

想要无线刷写和调试 MCU 吗? 只需使用您的 Raspberry Pi

嵌入式开发者如何设置进行编程所需的一切? 典型的有线设置包括放在开发者桌上的设备,以及将其连接到调试探头的带状线缆,调试探头又通过 USB 线缆连接到开发者的计算机。 计算机运行探头专用软件和 IDE。 在许多情况下,这种设置可以正常工作。 但嵌入式设备需要处理现实世界问题。 有时,我们会使用基于 MCU 的控制板管理高压或危险设备。 有时,这些设备安装在户外。 设备可能会在轮子上移动,也可能漂浮在水面上。 它们甚至可能安装在某个远程位置。 在这些情况下使用线缆进行设置通常不太方便,甚至可能会有危险。 当我开始开发户外设备时,我立即遇到了这个问题。 该如何解决呢? 我盘点了一下手头上的东西,发现了一块 Raspberry Pi 开发板。 我花了几个小时将它设置为无线调试探头,现在它运行得很棒。 最简单的无线设置原则 哪种开发板更合适? Raspberry PI 操作系统和连接 OpenOCD 安装 最终 Raspberry 设置 设置示例项目 硬件接线 启动 附加内容 – JTAG 和 RISC-V 最简单的无线设置原则 每个基于 ARM 的 MCU 都有一个双线调试接口 (SWD) 和一条复位线。 这三条线都应该连接到调试探头。 在我的无线设置中,我使用 Raspberry Pi GPIO 排针直接连接到设备。 在软件方面,我的 Raspberry Pi 运行开源的片上刷写和

CLion 中的自定义编译器:关于在 CLion 中使用任意编译器的快速指南

作为一款 IDE,CLion 提供了许多功能来帮助开发者。 它可以显示文档弹出窗口、实时检测错误、建议修复等。 内部代码分析器始终在后台运行,在您输入时分析 C 和 C++ 代码。 对于自动分析器来说,C 和 C++ 是具有挑战性的语言,因为需要特定于编译器的数据才能正确解析代码。 引擎需要知道标题搜索路径、预定义的宏定义和其他一些详细信息。 对于一组预定义的已知编译器,CLion 会使用特殊选项运行项目的编译器,并在解析项目时收集所需信息。 当然,这只适用于有限数量的编译器,如 GCC、Clang、MSVC、IAR 及其衍生工具。 如果某个项目使用特定的自定义编译器、很少使用的编译器或我们无权访问的专有编译器来正确集成,则 CLion 无法通过其标准过程进行使用。 在这种情况下,您可以选择使用自定义编译器功能。 要在 CLion 中使用自定义编译器,您需要一个包含必要编译器数据的 YAML 文件。 此类文件应包含一个或多个小节,每个小节描述一个特定的编译器或编译器变体。 每个小节应有一个描述、一个或多个匹配记录,以及多个信息记录。 当 CLion 解析项目并遇到针对项目文件的编译器时,CLion 会逐节扫描,并检查编译器是否与记录匹配。 匹配会使用一个或多个匹配记录来完成。 可用的匹配记录包括: match-compiler-exe 是正则表达式,用来检查编译器名称。 一个与平