[活动] Nordic nRF7002开发板试用体验

[复制链接]
 楼主| zhanzr21 发表于 2023-9-25 21:36 | 显示全部楼层 |阅读模式
本帖最后由 zhanzr21 于 2023-9-25 21:36 编辑

#有奖活动# #申请原创#
开发板开箱/硬件资源
在21ic上看到Nordic举办开发板评测活动,有幸参与,把自己的一些体会和经历记录下来,分享给大家。这是第一篇,板子的内容较多,后续内容会继续写。
首先不能免俗来个开箱照片吧。
开发板的资源较多, 主要的功能围绕三个芯片为核心:
  • 一个nRF5340是调试器,烧写成Segger JLink,这个暂时不详细研究,只当做工具来使用;
  • 一个nRF5340是主MCU,也就是开发板的主角,提供蓝牙\NFC等功能;
  • 一个nRF7002,提供WiFi功能,这个芯片本身作为一个外设挂在主MCU上的。
所以开发板主要编程的对象是主MCU:nRF5340。
nRF5340芯片本身也是一个双核心的SoC,两个核心都是Cortex®-M33 :
主核心带DSP增强指令, FPU,Armv8-M安全扩展(如TrustZone),最高频率128 MHz,称为应用核(App Core);
次核心没有DSP/FPU,频率固定在64 MHz,称为网络核(Net Core)。
具体在该开发板子,应用核的资源如下:

Interface
Controller
Driver/Component
ADC
on-chip
adc
CLOCK
on-chip
clock_control
FLASH
on-chip
flash
GPIO
on-chip
gpio
I2C(M)
on-chip
i2c
MPU
on-chip
arch/arm
NVIC
on-chip
arch/arm
PWM
on-chip
pwm
RTC
on-chip
system clock
RTT
Segger
console
RADIO
nrf7002
Wi-Fi 6 (802.11ax)
QSPI
on-chip
qspi
SPI(M/S)
on-chip
spi
SPU
on-chip
system protection
UARTE
on-chip
serial
USB
on-chip
usb
WDT
on-chip
watchdog
网络核的资源如下:

Interface
Controller
Driver/Component
CLOCK
on-chip
clock_control
FLASH
on-chip
flash
GPIO
on-chip
gpio
I2C(M)
on-chip
i2c
MPU
on-chip
arch/arm
NVIC
on-chip
arch/arm
RADIO
on-chip
Bluetooth, ieee802154
RTC
on-chip
system clock
RTT
Segger
console
QSPI
on-chip
qspi
SPI(M/S)
on-chip
spi
UARTE
on-chip
serial
WDT
on-chip
watchdog
这种配置类似于桌面/移动处理器的大小核组合,两核通过共享内存或者IPC通信,核间通信的细节以后再详细写。
顺便提一句,该开发板开发环境配置支持多种操作系统(Win/MacOS/Linux),但是如同大多数嵌入式开发环境,最推荐使用Windows开发机器了,因为官方的教程大多都是以Windows为例子。把开发板子插到电脑上,驱动安装好之后(驱动安装相关内容在下一节),打开设备详情可以看到以下内容。
这里啰嗦一下子,为什么这个板载调试器叫做Segger J-Link?
是因为Segger公司收费后向Nordic授权了J-Link商标和软件的使用权。调试这个标准Cortex-M内核的芯片使用开源的DAP Link也可以,但是显而易见的是J-Link的功能/速度都远远超过开源的公版调试器。作为开发者而言, 很感激这种设计。
笔者本人有很多开发板,有些自费购买的,有些活动赠送的。相对而言,配置了好的板载调试器的板子使用起来效率高很多。某些开发板为了成本或者体积的考虑,不配置调试器,或者让开发者外面插线,或者用那种别扭的USB/串口来刷固件。非常影响开发和学习效率。
开发环境配置
如同上文所述,开发环境选择Windows机器。主要参考官方的一个视频教程合集:

https://www.youtube.com/watch?v= ... NordicSemiconductor


这个教程比较全面,看完之后就可以上手开发了。
但注意两点:
一、需要特殊的网络配置,
二、原文是英文,很多工程师可能更习惯有母语视频。

本人倒是有心自己做一个这样的视频教程放在便于访问的平台上,暂时时间有限,只做了个比较简短的。

安装nRF Command Line Tools

https://www.nordicsemi.com/Produ ... Line-Tools/Download
安装好后内容:
  1. .
  2. ├── bin
  3. │   ├── highlevelnrfjprog.dll
  4. │   ├── jlinkarm_nrf_worker.exe
  5. │   ├── jlinkarm_nrf51_nrfjprog.dll
  6. │   ├── jlinkarm_nrf52_nrfjprog.dll
  7. │   ├── jlinkarm_nrf53_nrfjprog.dll
  8. │   ├── jlinkarm_nrf91_nrfjprog.dll­
  9. │   ├── jlinkarm_unknown_nrfjprog.dll
  10. │   ├── mergehex.exe
  11. │   ├── nrfdfu.dll
  12. │   ├── nrfjprog.dll
  13. │   └── nrfjprog.exe
  14. ├── include
  15. │   ├── DllCommonDefinitions.h
  16. │   ├── highlevelnrfjprogdll.h
  17. │   ├── mergehex.h
  18. │   ├── nrfdfu.h
  19. │   ├── nrfjprog.h
  20. │   └── nrfjprogdll.h
  21. ├── lib
  22. │   ├── highlevelnrfjprog.lib
  23. │   ├── jlinkarm_nrf51_nrfjprog.lib
  24. │   ├── jlinkarm_nrf52_nrfjprog.lib
  25. │   ├── jlinkarm_nrf53_nrfjprog.lib
  26. │   ├── jlinkarm_nrf91_nrfjprog.lib
  27. │   ├── jlinkarm_unknown_nrfjprog.lib
  28. │   ├── nrfdfu.lib
  29. │   └── nrfjprog.lib
  30. ├── LICENSE.rtf
  31. ├── LICENSE.txt
  32. ├── mergehex_release_notes.txt
  33. ├── nrfjprog_release_notes.txt
  34. ├── python
  35. │   ├── __init__.py
  36. │   ├── LICENSE
  37. │   ├── MANIFEST.in
  38. │   ├── pynrfjprog
  39. │   │   ├── __init__.py
  40. │   │   ├── API.py
  41. │   │   ├── APIError.py
  42. │   │   ├── config.toml
  43. │   │   ├── docs
  44. │   │   │   ├── __init__.py
  45. │   │   │   ├── highlevelnrfjprogdll.h
  46. │   │   │   ├── nrfdfu.h
  47. │   │   │   ├── nrfjprog_release_notes.txt
  48. │   │   │   └── nrfjprogdll.h
  49. │   │   ├── examples
  50. │   │   │   ├── __init__.py
  51. │   │   │   ├── hex_files
  52. │   │   │   │   ├── __init__.py
  53. │   │   │   │   ├── nrf51_dk_blinky.hex
  54. │   │   │   │   ├── nrf51_dk_rtt.hex
  55. │   │   │   │   ├── nrf52_dk_blinky.hex
  56. │   │   │   │   ├── nrf52_dk_rtt.hex
  57. │   │   │   │   ├── nrf52840_dk_blinky.hex
  58. │   │   │   │   ├── nrf53_dk_blinky.hex
  59. │   │   │   │   ├── nrf53_dk_rtt.hex
  60. │   │   │   │   ├── nrf91_dk_blinky.hex
  61. │   │   │   │   ├── nrf91_dk_rtt.hex
  62. │   │   │   │   └── nrf9160_pca20035_firmware_upgrade_app_0.1.0.hex
  63. │   │   │   ├── highlevel_memory_read_write.py
  64. │   │   │   ├── highlevel_program_hex.py
  65. │   │   │   ├── memory_read_write.py
  66. │   │   │   ├── nrf9160_pca20035_modem_upgrade_over_serial.py
  67. │   │   │   ├── program_hex.py
  68. │   │   │   ├── python_help.py
  69. │   │   │   ├── rtt_asyncio.py
  70. │   │   │   ├── rtt_callback.py
  71. │   │   │   └── rtt_synchronous.py
  72. │   │   ├── Hex.py
  73. │   │   ├── HighLevel.py
  74. │   │   ├── JLink.py
  75. │   │   ├── lib_arm64
  76. │   │   │   └── __init__.py
  77. │   │   ├── lib_armhf
  78. │   │   │   └── __init__.py
  79. │   │   ├── lib_x64
  80. │   │   │   ├── __init__.py
  81. │   │   │   ├── highlevelnrfjprog.dll
  82. │   │   │   ├── highlevelnrfjprog.lib
  83. │   │   │   ├── jlinkarm_nrf_worker.exe
  84. │   │   │   ├── nrfdfu.dll
  85. │   │   │   ├── nrfdfu.lib
  86. │   │   │   ├── nrfjprog.dll
  87. │   │   │   └── nrfjprog.lib
  88. │   │   ├── lib_x86
  89. │   │   │   └── __init__.py
  90. │   │   ├── LowLevel.py
  91. │   │   ├── MultiAPI.py
  92. │   │   ├── Parameters.py
  93. │   │   ├── QspiDefault.ini
  94. │   │   └── RTTAsyncIO.py
  95. │   ├── pyproject.toml
  96. │   └── README.md
  97. └── share
  98.     ├── config.toml
  99.     ├── firmware
  100.     │   └── nrf9160_pca20035_firmware_upgrade_app_0.1.1.hex
  101.     ├── NRFCommandLineTools
  102.     │   ├── NRFCommandLineToolsConfig.cmake
  103.     │   ├── NRFCommandLineToolsConfigVersion.cmake
  104.     │   ├── NRFCommandLineToolsTargets.cmake
  105.     │   └── NRFCommandLineToolsTargets-release.cmake
  106.     ├── nrfjprog.ini
  107.     └── QspiDefault.ini

主要内容是烧写工具和驱动,HEX文件工具,烧写工具集成API. 安装好后会自动配置系统路径。

  1. C:\Users\Lenovo>where nrfjprog.exe
  2. D:\Nordic Semiconductor\nrf-command-line-tools\bin\nrfjprog.exe

如果不是手工进行自定义环境开发,这个工具就是安装好后面的工具可以通过PATH环境变量找到它,直接使用。开发者可以暂时不必关心。
安装nRF Connect for Desktop
https://www.nordicsemi.com/Products/Development-tools/nRF-Connect-for-Desktop/Download
这个工具相当于一个总体管理工具,后面的SDK/Programmer都通过这个工具来管理。
安装ToolChain Manager/Programmer
打开刚刚安装好nRF Connect for  Desktop工具,按个人需要安装相关的组件,Toolchain manager和Programmer一般都需要。
安装nRF Connect SDK
打开刚刚安装好的Toolchain manager,选择最新的SDK,安装上。
这里对网络需求比较高,否则很容易安装不成功。关于这一点,21ic告知,Nordic厂家的工程师已经在做优化:  如Toolchain和SDK分开管理,将一些文件打包供整体下载等举措。可以预料的是不久的将来,相关软件安装的体验会极大增强。目前而言需要开发者多一点耐心。
Toolchains目录里面放着工具链, v开头的是SDK,downloads里面放着下载好的工具链安装包。
工具链与SDK之间有一定匹配规则,不是某版本的SDK可以与任意版本的工具链组合。据21ic透露,Nordic工程师也在考虑发布工具链和SDK的兼容矩阵表格,相信这样会提高开发者的效率。
安装VS Code/Extension
安装好了SDK后,点Open VS Code,会检测机器上的VS Code,如果机器上没有安装,会提示安装VS Code。
等安装好VS Code,再点这个按钮,如果还缺哪些Extensions,会提示相关的VS Code Extension,如果都安装好了可以直接启动VS Code。
到这里,需要下载安装的必要软件就都好了。
创建工程
创建工程/构建/下载整个过程本人录制了个小视频,供参考:



有两种工程类型:
  • Freestanding:使用安装好的SDK,工程本身仅包含应用代码。
  • Workspace:工程包含使用的SDK,占用的磁盘空间大,易于分享和发布。
可以简单理解: 如果是开发阶段,选Freestanding类型。如果代码到了生产环境,就应该使用workspace类型将SDK(最好是连同toolchain)版本一起固化起来。
这里选择一个blinky为应用模版,就是简单的LED闪烁。
默认使用板子上的LED1,在DeviceTree中是LED0。本文的例子中增加了另外一个LED一起闪烁,以验证整个操作流程。
构建配置
选择板子,构建配置。主要是选择使用的板子,如果板子为自定义的(比如自己画的)则需要创建一个开发板配置。官方发布的板子都有现成的开发板配置。
下载
直接点这里下载即可。
也可以自己打开Programmer工具手撸hex文件自行下载。
初始工程代码:
  1. /*
  2. * Copyright (c) 2016 Intel Corporation
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */

  6. #include <zephyr/kernel.h>
  7. #include <zephyr/drivers/gpio.h>

  8. /* 1000 msec = 1 sec */
  9. #define SLEEP_TIME_MS   1000

  10. /* The devicetree node identifier for the "led0" alias. */
  11. #define LED0_NODE DT_ALIAS(led0)

  12. /*
  13. * A build error on this line means your board is unsupported.
  14. * See the sample documentation for information on how to fix this.
  15. */
  16. static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);

  17. int main(void)
  18. {
  19.     int ret;

  20.     if (!gpio_is_ready_dt(&led)) {
  21.         return 0;
  22.     }

  23.     ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
  24.     if (ret < 0) {
  25.         return 0;
  26.     }

  27.     int tmp_cnt = 0;
  28.     while (1) {
  29.         ret = gpio_pin_toggle_dt(&led);
  30.         if (ret < 0) {
  31.             return 0;
  32.         }

  33.         k_msleep(SLEEP_TIME_MS);
  34.     }
  35.     return 0;
  36. }

新增一个LED配置,修改后代码如下:
  1. #include <zephyr/kernel.h>
  2. #include <zephyr/drivers/gpio.h>

  3. /* 1000 msec = 1 sec */
  4. #define SLEEP_TIME_MS   200

  5. /* The devicetree node identifier for the "led0" alias. */
  6. #define LED0_NODE DT_ALIAS(led0)
  7. #define LED1_NODE DT_ALIAS(led1)

  8. /*
  9. * A build error on this line means your board is unsupported.
  10. * See the sample documentation for information on how to fix this.
  11. */
  12. static const struct gpio_dt_spec led0 = GPIO_DT_SPEC_GET(LED0_NODE, gpios);
  13. static const struct gpio_dt_spec led1 = GPIO_DT_SPEC_GET(LED1_NODE, gpios);

  14. int main(void)
  15. {
  16.     int ret;

  17.     if (!gpio_is_ready_dt(&led0)) {
  18.         return 0;
  19.     }

  20.     ret = gpio_pin_configure_dt(&led0, GPIO_OUTPUT_ACTIVE);
  21.     if (ret < 0) {
  22.         return 0;
  23.     }

  24.     if (!gpio_is_ready_dt(&led1)) {
  25.         return 0;
  26.     }

  27.     ret = gpio_pin_configure_dt(&led1, GPIO_OUTPUT_ACTIVE);
  28.     if (ret < 0) {
  29.         return 0;
  30.     }

  31.     while (1) {
  32.         ret = gpio_pin_toggle_dt(&led0);
  33.         if (ret < 0) {
  34.             return 0;
  35.         }
  36.         k_msleep(SLEEP_TIME_MS);

  37.         ret = gpio_pin_toggle_dt(&led1);
  38.         if (ret < 0) {
  39.             return 0;
  40.         }
  41.         k_msleep(SLEEP_TIME_MS);
  42.     }
  43.     return 0;
  44. }


保存\再次构建后下载观察是否有两个LED闪烁,如果是则整个流程无误。
调试
调试的话,注意在build时带上debug 选项。其余操作与其他工具差距不大,不赘述。
工程之二-连接WiFi
工程模版选择sta即可。(注意:截止本文,SDK不支持AP模式)
查看使用的WiFi接入点的配置,主要是加密选项:
配置prj.conf中的WIFI名称和密码:
  1. # Below configs need to be modified based on security
  2. # CONFIG_STA_KEY_MGMT_NONE=y
  3. CONFIG_STA_KEY_MGMT_WPA2=y
  4. # CONFIG_STA_KEY_MGMT_WPA2_256=y
  5. # CONFIG_STA_KEY_MGMT_WPA3=y
  6. CONFIG_STA_SAMPLE_SSID="wssid_name"
  7. CONFIG_STA_SAMPLE_PASSWORD="password"

配置默认的IP地址,假如DHCP失败的情况可以使用这个:
  1. CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.168.2.110"
  2. CONFIG_NET_CONFIG_MY_IPV4_NETMASK="255.255.255.0"
  3. CONFIG_NET_CONFIG_MY_IPV4_GW="192.168.2.100"

之后构建下载,如果连接成功,LED会闪烁,且有串口输出。
  1. [00:00:00.426,910] <inf> wifi_nrf: Firmware (v1.2.8.1) booted successfully

  2. *** Booting Zephyr OS build v3.3.99-ncs1-1 ***
  3. [00:00:00.582,183] <inf> net_config: Initializing network
  4. [00:00:00.582,183] <inf> net_config: Waiting interface 1 (0x20001430) to be up...
  5. [00:00:00.583,892] <inf> net_config: IPv4 address: 192.168.2.110
  6. [00:00:00.583,953] <inf> net_config: Running dhcpv4 client...
  7. [00:00:00.585,876] <inf> sta: Starting nrf7002dk_nrf5340_cpuapp with CPU frequency: 64 MHz
  8. [00:00:01.585,937] <inf> sta: QSPI Encryption disabled
  9. [00:00:01.586,029] <inf> sta: Static IP address (overridable): 192.168.2.110/255.255.255.0 -> 192.168.2.100
  10. [00:00:03.130,706] <inf> sta: Connection requested
  11. [00:00:03.430,877] <inf> sta: ==================
  12. [00:00:03.430,908] <inf> sta: State: SCANNING
  13. [00:00:03.731,018] <inf> sta: ==================
  14. [00:00:07.449,859] <inf> wifi_nrf: wifi_nrf_wpa_supp_authenticate:Authentication request sent successfully

  15. [00:00:07.632,873] <inf> sta: ==================
  16. [00:00:07.632,904] <inf> sta: State: AUTHENTICATING
  17. [00:00:07.722,320] <inf> wifi_nrf: wifi_nrf_wpa_supp_associate: Association request sent successfully

  18. [00:00:07.805,023] <inf> sta: Connected
  19. [00:00:07.946,563] <inf> sta: ==================
  20. [00:00:07.946,594] <inf> sta: State: COMPLETED
  21. [00:00:07.946,624] <inf> sta: Interface Mode: STATION
  22. [00:00:07.946,624] <inf> sta: Link Mode: WIFI 4 (802.11n/HT)
  23. [00:00:07.946,655] <inf> sta: SSID: ssid_name
  24. [00:00:07.946,685] <inf> sta: BSSID: xx:xx:xx:xx:xx:xx
  25. [00:00:07.946,716] <inf> sta: Band: 2.4GHz
  26. [00:00:07.946,716] <inf> sta: Channel: 4
  27. [00:00:07.946,746] <inf> sta: Security: WPA2-PSK
  28. [00:00:07.946,777] <inf> sta: MFP: Optional
  29. [00:00:07.946,777] <inf> sta: RSSI: -65


连接之后可以ping通:
  1. C:\Users\Lenovo>ping 192.168.2.110

  2. 正在 Ping 192.168.2.110 具有 32 字节的数据:
  3. 来自 192.168.2.110 的回复: 字节=32 时间=38ms TTL=64
  4. 来自 192.168.2.110 的回复: 字节=32 时间=149ms TTL=64
  5. 来自 192.168.2.110 的回复: 字节=32 时间=161ms TTL=64
  6. 来自 192.168.2.110 的回复: 字节=32 时间=174ms TTL=64

  7. 192.168.2.110 的 Ping 统计信息:
  8.     数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
  9. 往返行程的估计时间(以毫秒为单位):
  10.     最短 = 38ms,最长 = 174ms,平均 = 130ms


不过本人这个示例中DHCP过程没有完成,只能使用默认配置的静态地址通信。原因应该是跟本人使用的路由器的兼容性问题,还在排查中。
示例工程之三-双核通信
工程模版:entroy_nrf53
如前所述,nRF5340芯片上有两个核心:AppCore和Net Core
IPC是两核心之间的一个通信手段。
这个例子中App Core通过IPC向NetCore请求熵值, NetCore这边使用随机数生成器生成熵值返回。这个示例有两个工程,会生成两个hex文件,可以分别烧写,也可以合并后一起烧写。两个核心的Flash空间不重合。AppCore以0x00000000起始,NetCore以0x01000000起始。
AppCore的IPC通道:
NetCore的IPC通道:
两个hex烧写后,App Core输出:
  1. Init begin
  2. Init done
  3. *** Booting Zephyr OS build v3.3.99-ncs1-1 ***
  4. Entropy sample started[APP Core].
  5. Remote init send
  6.   0x68  0x44  0x62  0xcc  0x44  0x00  0x39  0xd5  0xfb  0x36
  7.   0x68  0x44  0x62  0xcc  0x44  0x00  0x39  0xd5  0xfb  0x36

Net Core输出:
  1. Init begin
  2. Init done
  3. *** Booting Zephyr OS build v3.3.99-ncs1-1 ***
  4. Entropy sample started[NET Core].
  5. [00:00:00.518,524] <inf> sync_rtc: Updated timestamp to synchronized RTC by 8304 ticks (253417us)

小结
由于各种原因,本人对该开发板的特性还没有完全测试透,目前仅仅是把开发流程走通了。后续会继续测试、写贴。本人最感兴趣的还是该开发板的网络功能和双核架构。
今后的研究方向也会在这些方面,还有就是把教学视频做一个适合本土工程师的版本。
参考
官方文档首页
https://developer.nordicsemi.com ... h_nrf/nrf70/gs.html
官方视频教程频道
https://www.youtube.com/watch?v= ... NordicSemiconductor
本人做的简短操作流程视频
https://v.youku.com/v_show/id_XNjAwMzkyMDcxMg==.html

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

@zhyrq :做了一些测试 没有整理出来 如果大伙对哪部分有感兴趣的 可以整理一下  发表于 2023-10-27 22:17
后续有吗?  发表于 2023-10-27 10:57
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:每天都進步

91

主题

1017

帖子

34

粉丝
快速回复 在线客服 返回列表 返回顶部