☰
Tock OS 在 Wio WM1110 开发板上的部署指南:基于 nRF52840 与 Semtech LR1110 的多模无线定位板
2026/10/8 1:51:41 网站建设 项目流程
  • 操作系统
  • 嵌入式
  • 嵌入式OS

【免费下载链接】tock

A secure embedded operating system for microcontrollers

项目地址:https://gitcode.com/gh_mirrors/to/tock
点击查看免费下载

本文以 Tock 仓库中 boards/wm1110dev/README.md 为核心,系统讲解 Wio WM1110 开发板的硬件构成、Tock 内核移植要点,以及如何借助 Tock Bootloader 与 nRF52840dk 完成烧录和日常编程。读完本文,你将掌握 WM1110 的完整刷机链路(跳线连接 → 烧录 Bootloader → tockloader 刷内核与 App),并理解该板在内核源码中的引脚分配、内存布局与驱动注册方式。

一、Wio WM1110 开发板是什么

Wio WM1110 Development Board 是 Seeed Studio 推出的一款多模无线定位开发板,定位是LoRa 与位置服务(location services)应用。它基于 Nordic nRF52840 SoC,并集成了 Semtech LR1110 射频前端芯片,属于 Tock 官方支持的板级平台之一,对应内核入口为 boards/wm1110dev/src/main.rs。

从硬件构成上看,这块板集成了三类关键器件:

器件类型用途
LIS3DHTR3 轴加速度计运动检测、姿态感知
SHT41温湿度传感器环境温湿度采集
Semtech LR1110多模射频前端LoRaWAN、GNSS(GPS 定位)、WiFi AP 扫描

其中 LR1110 是这块板的核心卖点:它通过一颗芯片同时支持 LoRaWAN 长距离通信、GNSS 卫星定位与 WiFi AP 扫描辅助定位,配合 nRF52840 的 Cortex-M4F 主控与丰富外设,天然适合做资产追踪、环境监测等低功耗物联网场景。

1.1 源码中的板级资源确认

在 boards/wm1110dev/src/main.rs 中,可以看到 Tock 为这块板注册的完整驱动集合。Platform结构体(main.rs#L118-L132)与SyscallDriverLookup实现(main.rs#L134-L156)把以下能力暴露给用户态进程:

  • console(串口控制台,capsules_core::console::DRIVER_NUM)
  • gpio(通用 IO,引脚 D2~D7)
  • alarm(定时器/闹钟)
  • led(三色 LED 中的绿、红两路)
  • rng(真随机数,基于 nRF52840 TRNG)
  • nonvolatile_storage(非易失存储驱动)
  • temperature / humidity(基于 SHT41 的温湿度驱动)
  • LoRa SPI 驱动(LoRaPhySPI)与LoRa GPIO 驱动(LoRaPhyGPIO),分别对应 capsules/core/src/driver.rs#L44-L45 中定义的系统调用号0x30003与0x30004
  • IPC(进程间通信)

这些驱动号与 doc/syscalls 目录下的系统调用文档一一对应,读者可以结合 doc/syscalls/README.md 查看每个驱动的用户态接口。

二、准备工作:环境与前置条件

2.1 安装 Tock 工具链

在开始任何烧录工作之前,请先按照 Tock 官方的 Getting Started 指南 完成环境搭建。核心依赖包括:

  1. Rust(nightly 版本,仓库的 rust-toolchain.toml 会固定具体日期版本,构建系统会自动校验并安装对应 nightly);
  2. rustup(版本 ≥ 1.23.0),用于管理多个 Rust 工具链;
  3. 宿主机工具链(gcc、glibc);
  4. make、find 等命令行工具。

快速安装(以 Ubuntu 为例):

$ sudo apt install -y build-essential python3-pip curl $ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh $ pipx install tockloader $ pipx ensurepath

其中tockloader是 Tock 生态的烧录与 App 管理工具,稍后刷内核、装应用都靠它。

2.2 两种烧录路径的取舍

WM1110 开发板在设计上默认使用外部 JLink 编程器进行烧录。Tock 团队希望摆脱这个依赖,因此选择使用Tock Bootloader:它允许通过 UART 串口直接烧录内核与应用,日常开发不再需要 JLink。不过有两点需要明确:

  • Bootloader 本身仍需借助 JLink 编程器烧录一次(一次性操作);
  • 之后的内核、应用烧录全部走 Bootloader + tockloader,无需再碰 JLink。

最简单的 JLink 来源就是一块现成的nRF52840dk开发板——它板载 J-Link OB 调试器,可以直接充当外部编程器。

三、把 nRF52840dk 连接到 WM1110-dev

3.1 跳线连接图

在烧录 Bootloader 之前,先用杜邦线(跳线)把 nRF52840dk 与 WM1110-dev 连起来。官方连接示意图如下:

图中展示了四组点对点跳线连接,把 nRF52840dk 板载的 J-Link 调试排针信号引到 WM1110-dev 上。

3.2 引脚映射表

对应 README 中的官方引脚映射如下:

nRF52840dkWM1110-dev
GNDGND
SWD SEL3V3
SWD CLKCLK
SWD IODIO

连接完成后的正确姿势是:nRF52840dk 与 WM1110-dev 两块板各自通过一条 USB 线连接到电脑(共两条 USB 线)。

只有一条 USB 线怎么办?官方给出的替代方案:把唯一的 USB 线插在 nRF52840dk 上,然后额外跳两根线:

  • 3V3 (wm1110dev) <-> VDD (nrf)
  • SWD SEL (nrf) <-> VDD (nrf)

其余跳线保持不变。这样由 nRF52840dk 的 USB 同时为两块板供电,并通过 VDD 回灌点亮 WM1110 的调试链路。

3.3 底层原理:SWD 调试链路

理解这几根线的作用,能帮你排查连接问题:

  • SWD SEL / 3V3:SWD SEL 是 SWD 调试使能信号,拉高到 3.3V 后 WM1110 的 SWD 调试接口才会被激活,J-Link 才能访问目标芯片;
  • SWD CLK / CLK:SWD 时钟线,由 J-Link 驱动;
  • SWD IO / DIO:SWD 双向数据线,承载调试协议的数据收发;
  • GND / GND:共地,所有信号都必须以它为参考。

nRF52840dk 板载的 J-Link OB 正是通过这四根线以标准 SWD 协议与 WM1110 的 nRF52840 芯片通信。

四、一次性烧录 Tock Bootloader

4.1 执行烧录命令

跳线接好、两块板都通电之后,进入 WM1110 的板级目录执行:

$ cd boards/wm1110dev $ make flash-bootloader

这条命令会调用JLinkExe,借助 nRF52840dk 板载的 JTag 硬件把 Bootloader 写入 WM1110。整个操作对 JLinkExe 的依赖体现在 Makefile 的flash-bootloader目标中(boards/wm1110dev/Makefile#L22-L26):

.PHONY: flash-bootloader flash-bootloader: curl -L --output /tmp/wm1110_dev-bootloader_v1.1.3.bin https://github.com/tock/tock-bootloader/releases/download/v1.1.3/wm1110_dev-bootloader_v1.1.3.bin tockloader flash --address 0 /tmp/wm1110_dev-bootloader_v1.1.3.bin rm /tmp/wm1110_dev-bootloader_v1.1.3.bin

从源码可以拆解出这条目标实际做了三件事:

  1. 用curl从 Tock Bootloader 的 release 页面下载 WM1110 专用的 Bootloader 镜像(版本 v1.1.3),临时存放在/tmp/wm1110_dev-bootloader_v1.1.3.bin;
  2. 用tockloader flash --address 0把它烧录到芯片地址 0(即 Flash 起始位置);
  3. 烧录完成后删除临时文件。

需要强调的是:此时 nRF52840dk 必须已连接且其 J-Link 可被 JLinkExe 识别。若JLinkExe尚未安装,请参考 doc/Getting_Started.md 中的 Programming Adapter 一节,安装 "J-Link Software and Documentation Pack"(版本 ≥ 5.0)。

4.2 为什么 Bootloader 要放在地址 0

查看 WM1110 的链接脚本 boards/wm1110dev/layout.ld 可以更清楚地理解这个设计:

MEMORY { rom (rx) : ORIGIN = 0x00010000, LENGTH = 256K prog (rx) : ORIGIN = 0x00050000, LENGTH = 704K-16K ram (rwx) : ORIGIN = 0x20000000, LENGTH = 256K }
  • rom 段从0x10000(64KB 偏移)开始——这正是给 Tock Bootloader 预留的 64KB 空间,Bootloader 常驻0x00000 ~ 0x0FFFF;
  • Tock 内核(rom 段)起始于0x10000,长度 256KB;
  • 应用区(prog 段)起始于0x50000,长度 704K−16K,末尾保留 16KB 给非易失存储。

与之呼应,WM1110 的program目标把内核烧录到--address 0x10000(boards/wm1110dev/Makefile#L18-L20):

.PHONY: program program: $(TOCK_ROOT_DIRECTORY)target/$(TARGET)/release/$(PLATFORM).bin tockloader flash --address 0x10000 $<

也就是说,Flash 的布局为:Bootloader(0x0)→ 内核(0x10000)→ 应用(0x50000 起)。这也是flash-bootloader必须烧在--address 0的原因。

4.3 用户态非易失存储

nrf52840 芯片的 main.rs#L489-L501 中,NonvolatileStorageComponent把 Flash 末尾区域开放给用户态进程使用:起始地址0xFC000、长度 16 个页(每页 4KB,共 64KB),内核自身不占用这部分("No kernel access")。这与 layout.ld 中 prog 段704K-16K的预留完全一致,App 可以在系统调用层访问这块区域做持久化存储。

五、Bootloader 的激活与日常使用

5.1 如何进入 Bootloader 模式

Bootloader 烧录完成后,日常烧录不再需要 JLink。它的激活方式是硬件操作:

快速连续按下两次复位(Reset)按钮,Bootloader 即被激活;激活后绿色 LED 常亮作为指示。

一旦绿灯常亮,说明设备已进入 Bootloader 模式,等待主机通过 UART 接收固件。这个绿灯正是 main.rs#L32-L33 中定义的LED_GREEN_PIN(P0_13),它和红色 LED(P0_14)共同组成三色 LED 中由 Tock 内核驱动的两路:

// Three-color LED. const LED_RED_PIN: Pin = Pin::P0_14; const LED_GREEN_PIN: Pin = Pin::P0_13;

另外,板上的复位按键对应BUTTON_RST_PIN(P0_18),由NrfStartupComponent接管(main.rs#L240-L246)。在 boards/wm1110dev/src/main.rs 中,这两个 LED 以LedHigh方式注册进LedsComponent,用户态可通过 LED 驱动系统调用点灭它们;同时它们也被注册为内核调试 GPIO(debug_gpio!宏可用)。

5.2 Bootloader 就位后,tockloader 即可正常工作

进入 Bootloader 模式后,tockloader 会像在其他支持 Bootloader 的 Tock 板卡上一样正常工作。这意味着你可以:

  1. 编译并烧录内核:在 boards/wm1110dev 目录下执行make install(等价于make program),tockloader 会把编译产物target/thumbv7em-none-eabihf/release/wm1110dev.bin通过 UART 烧到0x10000;
  2. 安装示例应用:例如tockloader install blink,应用会被烧入应用区并自动启动;
  3. 管理应用:tockloader list查看已装应用、tockloader erase-apps清空应用区、tockloader uninstall卸载指定应用等。

编译内核的通用目标与其他板卡一致(boards/Makefile.common 与 doc/Getting_Started.md 均有说明):

目标作用
make(默认 all)编译 release 版内核
make debug编译带调试信息的版本
make doc生成该板的 Rust 文档
make clean清理构建产物
make install通过 tockloader 烧录内核到板子
make flash-bootloader一次性烧录 Tock Bootloader(需 JLink)

若在make install时指定串口,可通过make install PORT=/dev/ttyUSB0传入(Makefile 中PORT变量会转成tockloader --port <port>参数)。

六、WM1110 板级源码导读(可选深入)

如果读者想进一步理解这块板在 Tock 中的实现,以下几个文件值得精读:

  • boards/wm1110dev/src/main.rs:板级入口。定义了全部引脚常量(main.rs#L32-L62):
    • UART:TX=P0_24、RX=P0_22(UART_TX_PIN/UART_RX_PIN),用于 console 与调试输出,波特率 115200;
    • I2C:SDA=P0_27、SCL=P0_26,挂载 SHT41;另有I2C_PWR(P0_07)作为 I2C 总线与传感器的电源开关,启动时由内核拉高供电(main.rs#L361-L363);
    • SPI:SCK=P1_13、MOSI=P1_14、MISO=P1_15、CS=P1_12,连接 LR1110;
    • LR1110 控制脚:BUSY=P1_11、RESET=P1_10、DIO9=P1_08,通过LoRaPhyGPIO(0x30004)暴露给用户态;
    • GPIO D2~D7 分别映射 P0_17/P0_16/P0_15/P1_09/P1_04/P1_03。
  • boards/wm1110dev/src/io.rs:panic 处理。内核崩溃时点亮红色 LED(P0_14)并通过 UART(115200、8N1)打印调试信息;
  • boards/wm1110dev/Makefile:烧录相关全部目标;
  • boards/wm1110dev/layout.ld:内存布局,Bootloader/内核/应用/存储分区一目了然;
  • boards/wm1110dev/Cargo.toml:板级 crate 依赖,主要引入cortexm4、kernel、nrf52、nrf52840、components、capsules-core/capsules-extra/capsules-system等。

七、小结:完整上手指南

把整个流程串起来,WM1110 从零到跑起 Tock 的完整路径是:

  1. 装环境:Rust nightly + rustup + tockloader(参考 doc/Getting_Started.md);
  2. 接线:按引脚映射表把 nRF52840dk 与 WM1110-dev 用跳线连好,两块板各接一条 USB;
  3. 烧 Bootloader(一次性):在boards/wm1110dev下执行make flash-bootloader,借助 nRF52840dk 的 J-Link 完成;
  4. 进入 Bootloader 模式:快速双击复位键,绿灯常亮即成功;
  5. 日常烧录:make install烧内核,tockloader install blink装应用,从此无需 JLink。

这套 "JLink 只用来烧一次 Bootloader,之后全走 UART" 的方案,是 WM1110 这类无板载调试器板卡的典型 Tock 部署模式,也让该板成为 LoRaWAN/GNSS 场景下体验 Tock 的安全嵌入式开发流程的低门槛选择。

  • 操作系统
  • 嵌入式
  • 嵌入式OS

【免费下载链接】tock

A secure embedded operating system for microcontrollers

项目地址:https://gitcode.com/gh_mirrors/to/tock
点击查看免费下载
上一篇:构建多平台直播抓取与视频处理架构:48tools技术实现深度解析
下一篇:48tools多平台直播抓取架构:从口袋48到抖音的技术实现深度解析

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询