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

image description

Discover more