十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

在 RIOT OS 中使用 nRF5340DK 应用核心:nrf5340dk-app 板卡完全指南

在 RIOT OS 中使用 nRF5340DK 应用核心:nrf5340dk-app 板卡完全指南 在 RIOT OS 中使用 nRF5340DK 应用核心nrf5340dk-app 板卡完全指南【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT导读本文以 RIOT 仓库中 boards/nrf5340dk-app/doc.md 为骨架结合 board.h、periph_conf.h、board.c 等源码系统讲解如何在 RIOT OS 中为 Nordic nRF5340DK 双核开发板构建、烧录与调试应用。读完本文你将掌握该板卡在 RIOT 中的支持边界仅应用核心可用、板载外设的引脚映射与时钟配置、SPI NOR Flash 与文件系统接入方式以及make flash/make term的完整实战流程。板卡概览双核 Cortex-M33 的 nRF5340DKnRF5340DK 是 Nordic Semiconductor 基于 nRF5340 芯片的官方开发板。nRF5340 的独特之处在于其双核 Cortex-M33架构包含两个独立运行的核心应用核心Application core高性能核负责主要应用逻辑网络核心Network core低功耗核专门处理无线协议栈。按照 boards/nrf5340dk-app/doc.md 的说明网络核心能够承载Bluetooth 5.3、BLE、mesh、NFC仅标签模拟不支持读卡器、Thread 和 Zigbee等无线连接协议而当前 RIOT OS 仅支持使用应用核心——这是使用该板卡前需要明确的第一条边界。从构建系统看boards/nrf5340dk-app/Makefile.features 中明确了板卡对应的 CPU 型号与体系CPU_MODEL nrf5340_app CPU nrf53同时声明了板卡提供的外设特性periph_i2c、periph_pwm、periph_rtt、periph_spi、periph_timer、periph_uart、periph_uart_hw_fc与periph_usbdev。这些特性会参与 RIOT 的依赖解析与特性检查确保只有该板卡具备的外设才会被启用。板卡正面提供了4 个用户 LED、4 个用户按钮/开关以及 1 个复位按钮它们的引脚定义全部集中在 boards/nrf5340dk-app/include/board.h。板载外设引脚映射LED 与按键LED 引脚与操作宏四个 LED 全部挂在 GPIOP0 端口的高四位P0.28 ~ P0.31相关定义见 board.h符号引脚说明LED0_PINGPIO_PIN(0, 28)LED0 引脚LED1_PINGPIO_PIN(0, 29)LED1 引脚LED2_PINGPIO_PIN(0, 30)LED2 引脚LED3_PINGPIO_PIN(0, 31)LED3 引脚LED_PORTNRF_P0_S默认 LED 端口寄存器每个 LED 都配套了LEDx_ON、LEDx_OFF、LEDx_TOGGLE三个宏通过操作端口寄存器OUTCLR/OUTSET/OUT实现开关与翻转。例如#define LED0_ON (LED_PORT-OUTCLR LED0_MASK) /** LED0 ON macro */ #define LED0_OFF (LED_PORT-OUTSET LED0_MASK) /** LED0 OFF macro */ #define LED0_TOGGLE (LED_PORT-OUT ^ LED0_MASK) /** LED0 toggle macro */LEDx_MASK是对应的端口位掩码如LED0_MASK (1 28)。在应用代码中只需#include board.h即可直接使用LED0_TOGGLE之类的宏点亮或翻转 LED。按钮引脚与默认模式四个用户按键的定义见 board.h均配置为上拉输入模式符号引脚默认模式BTN0_PINGPIO_PIN(0, 23)GPIO_IN_PUBTN1_PINGPIO_PIN(0, 24)GPIO_IN_PUBTN2_PINGPIO_PIN(0, 8)GPIO_IN_PUBTN3_PINGPIO_PIN(0, 9)GPIO_IN_PU按键默认启用内部上拉GPIO_IN_PU因此读取时按下为低电平、释放为高电平。这一点与 SAUL GPIO 配置中的SAUL_GPIO_INVERTED标志相互印证详见下文 SAUL 章节。时钟配置128 MHz 应用核心与 HFXO/LFXO 选择board.h 定义了系统核心时钟与高/低频时钟源#define CLOCK_CORECLOCK MHZ(128) /* 系统核心时钟适用于所有 NRF53 应用核心 */ #define CLOCK_HFCLK (CLOCK_HFCLKSRC_SRC_HFXO) /* HFCLK 源外部 32 MHz 晶振 */ #define CLOCK_LFCLK (CLOCK_LFCLKSRC_SRC_LFXO) /* LFCLK 源32.768 kHz 晶振 */CLOCK_CORECLOCK应用核心主频为128 MHzCLOCK_HFCLK高频时钟HFCLK可选CLOCK_HFCLKSRC_SRC_HFXO外部 32 MHz 晶振或CLOCK_HFCLKSRC_SRC_HFINT内部 RC 振荡器板卡默认使用外部晶振 HFXO 以获得更稳定的频率CLOCK_LFCLK低频时钟LFCLK有三档可选源码注释给出了完整的候选集合CLOCK_LFCLKSRC_SRC_LFRC32.768 kHz RC 振荡器CLOCK_LFCLKSRC_SRC_LFXO32.768 kHz 晶振CLOCK_LFCLKSRC_SRC_LFSYNT由 HFCLK 合成的 32.768 kHz 时钟。板卡默认使用LFXO 外部晶振。低频时钟同时是 RTC/RTT 的时基直接决定了后文 RTT 配置的 32768 Hz 参考频率。外设配置纵览periph_conf.h 中的资源分配boards/nrf5340dk-app/include/periph_conf.h 是理解该板卡资源布局的核心文件。RIOT 的periph系列外设抽象在此落地为具体的 Nordic 硬件实例。Timer两个 32 位 TIMER系统为应用核心配置了两个定时器均使用 32 位位宽、5 个比较/捕获通道实例硬件位宽通道IRQTimer 0NRF_TIMER0_S32 位5TIMER0_IRQnTimer 1NRF_TIMER1_S32 位5TIMER1_IRQn中断服务函数通过TIMER_0_ISR/TIMER_1_ISR分别映射到isr_timer0/isr_timer1。应用可通过TIMER_NUMOF得知可用定时器数量为 2。UARTUARTE0 用于 STDIOstatic const uart_conf_t uart_config[] { { .dev NRF_UARTE0_S, .rx_pin GPIO_PIN(1, 0), .tx_pin GPIO_PIN(1, 1), .irqn SERIAL0_IRQn, }, };串口使用 P1.00RX/ P1.01TX映射到 UARTE0中断号为SERIAL0_IRQn。该串口正是板载 USB 桥接后文 STDIO 章节所对应的物理串口。若启用了MODULE_PERIPH_UART_HW_FC硬件流控模块rts_pin/cts_pin被显式设为GPIO_UNDEF即该板卡未连接硬件流控引脚——尽管periph_uart_hw_fc特性被声明实际并不启用流控线。RTT24 位实时计数器RTTReal-Time Timer基于NRF_RTC0_S配置参数如下见 periph_conf.h参数值说明RTT_MAX_VALUE0x00ffffff24 位计数上限RTT_MAX_FREQUENCY32768 Hz最大计数频率RTT_MIN_FREQUENCY8 Hz最小计数频率RTT_CLOCK_FREQUENCY32768 Hz时钟源频率LFCLKRTT_FREQUENCY1024 Hz默认实际工作频率值得注意的是RTT 实际工作频率默认被降频到1024 Hz而非直接采用 LFCLK 的 32768 Hz这样设计是为了在定时精度与功耗之间取得平衡应用可以通过覆盖RTT_FREQUENCY宏调整。PWM直接驱动 4 个 LEDPWM 使用NRF_PWM0_S其四个输出通道恰好接到四个 LED 引脚static const pwm_conf_t pwm_config[] { { .dev NRF_PWM0_S, .pin { LED0_PIN, LED1_PIN, LED2_PIN, LED3_PIN }, }, };这意味着除了开关式点亮开发者还可以借助periph_pwm对四个 LED 实现呼吸灯、亮度渐变等模拟效果。SPISPIM1 外接 SPI NOR Flashstatic const spi_conf_t spi_config[] { { .dev NRF_SPIM1_S, .sclk GPIO_PIN(0, 17), .mosi GPIO_PIN(0, 13), .miso GPIO_PIN(0, 14), }, };SPI 总线位于 SPIM1引脚为 SCLKP0.17、MOSIP0.13、MISOP0.14。这条总线在板载逻辑上用于驱动外部 SPI NOR Flash见 board.c 章节。I2CTWIM2 用于传感器扩展static const i2c_conf_t i2c_config[] { { .dev NRF_TWIM2_S, .scl GPIO_PIN(1, 3), .sda GPIO_PIN(1, 2), .speed I2C_SPEED_NORMAL, }, };I2C 位于 TWIM2SCLP1.03、SDAP1.02默认速率为I2C_SPEED_NORMAL100 kbit/s适合连接板载或扩展的低速传感器。外部 SPI NOR Flash 与文件系统board.cboards/nrf5340dk-app/board.c 中实现了板卡特有的存储初始化逻辑。在启用MODULE_MTD_SPI_NOR时板载的MX25R64 SPI NOR Flash会被注册为 MTD 设备static const mtd_spi_nor_params_t _nrf5340_nor_params { .opcode mtd_spi_nor_opcode_default, .wait_chip_erase 240 * US_PER_SEC, .wait_64k_erase 800 * US_PER_MS, .wait_sector_erase 240 * US_PER_MS, .wait_chip_wake_up 1 * US_PER_MS, .clk MHZ(54), .flag SPI_NOR_F_SECT_4K | SPI_NOR_F_SECT_64K, .spi SPI_DEV(0), .mode SPI_MODE_0, .cs BOARD_QSPI_PIN_CS, .wp BOARD_QSPI_PIN_WP, .hold BOARD_QSPI_PIN_HOLD, };关键细节包括时钟频率54 MHz、SPI 模式 0、复用 SPI 设备 0即上文 SPIM1支持 4K 与 64K 两种扇区擦除粒度SPI_NOR_F_SECT_4K | SPI_NOR_F_SECT_64K片选、写保护、HOLD 引脚分别对应 board.h 中的BOARD_QSPI_PIN_CSP0.18、BOARD_QSPI_PIN_WPP0.15、BOARD_QSPI_PIN_HOLDP0.16芯片级擦除、64K 擦除、扇区擦除、唤醒的等待时间均有明确配置240 s / 800 ms / 240 ms / 1 ms。Flash 设备通过MTD_XFA_ADD(nrf5340_nor_dev, 0)注册为 MTD 设备 0MTD_0即mtd_dev_get(0)。在此基础上若同时启用了MODULE_VFS_DEFAULT还会通过VFS_AUTO_MOUNT将littlefs2文件系统自动挂载到默认 NVM 挂载点VFS_DEFAULT_NVM(0)实现开箱即用的掉电持久存储。依赖关系在 Makefile.dep 中自动补齐ifneq (,$(filter mtd,$(USEMODULE))) USEMODULE mtd_spi_nor endif # default to using littlefs2 on the external flash ifneq (,$(filter vfs_default,$(USEMODULE))) USEPKG littlefs2 USEMODULE mtd endif也就是说应用只需声明USEMODULE vfs_default或mtd构建系统就会自动引入littlefs2软件包与mtd_spi_nor驱动。SAUL GPIO把按键与 LED 暴露给统一传感器框架boards/nrf5340dk-app/include/gpio_params.h 将 4 个按键与 4 个 LED 注册为 SAUL GPIO 设备saul_gpio_params数组启用saul_default模块时通过 Makefile.dep 自动加入saul_gpio4 个按键Button 1~4以SAUL_GPIO_INVERTED标志注册读取方向为输入4 个 LEDLED1~LED4以SAUL_GPIO_INVERTED | SAUL_GPIO_INIT_CLEAR注册输出方向初始化时清零。SAUL_GPIO_INVERTED意味着逻辑值与电气电平相反按键按下为逻辑 1、LED 高电平点亮SAUL_GPIO_INIT_CLEAR保证上电时 LED 处于熄灭状态。接入 SAUL 后这些引脚可以被saul_reg工具链如saulshell 命令、libcoap资源暴露统一枚举和访问。构建、烧录与串口使用实战构建与烧录make flash该板卡支持通过J-Link或nrfjprog工具烧录二者需要预先安装。烧录过程已集成进 RIOT 的标准make flash目标无需手工调用烧录器命令。典型用法make BOARDnrf5340dk-app -C examples/basic/hello-world flash其中BOARDnrf5340dk-app显式指定目标板卡不指定时examples/basic/hello-world/Makefile 会回退到默认的native板卡。RIOT 会依据板卡配置自动选择合适的烧录后端。通过 USB 串口访问 STDIO板卡的 STDIO 通过 USB 端口直接暴露。在 Linux 主机上串口设备通常映射为/dev/ttyACM0。连接串口使用标准的term目标make BOARDnrf5340dk-app -C examples/basic/hello-world term该命令会调用 RIOT 的串口终端工具默认为pyterm自动解析板卡默认波特率并打开/dev/ttyACM0与板卡交互。flash与term组合起来即是完整的「烧录 观察输出」开发循环。板卡目录结构与 Kconfig 集成整个板卡支持位于 boards/nrf5340dk-app 目录文件职责如下文件职责doc.md板卡官方文档本文骨架include/board.h时钟、LED、按键、Flash 引脚定义include/periph_conf.hTimer/UART/RTT/PWM/SPI/I2C 外设配置include/gpio_params.hSAUL GPIO 映射board.cSPI NOR Flash MTD 设备与 VFS 挂载Makefile、Makefile.features、Makefile.dep、Makefile.include构建系统集成KconfigKconfig 配置入口在 Kconfig 体系中boards/nrf5340dk-app/Kconfig 定义了BOARD_NRF5340DK_APP选项并在选中时自动select CPU_MODEL_NRF5340_APP从而与CPU nrf53的 CPU 模型见 cpu/nrf53建立绑定关系。小结在 RIOT OS 中nRF5340DK 的支持边界非常明确应用核心128 MHz Cortex-M33承担全部 RIOT 应用网络核心专司无线协议栈。板卡侧 RIOT 提供了完整的外设抽象Timer/UART/RTT/PWM/SPI/I2C、四路 LED 与按键的多种操作方式宏、PWM、SAUL以及基于 MX25R64 的 MTD littlefs2 持久存储方案。开发者只需遵循「make BOARDnrf5340dk-app」的统一构建约定即可完成从编译、烧录到串口调试的完整闭环。更多外设细节可继续查阅 periph_conf.h 与 board.h 中的注释与宏定义。【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表