Zephyr 下 nRF9160 innblue21 蜂窝物联网开发板实战:硬件资源、TrustZone 安全启动与 Secure/Non-Secure 应用构建
【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr
innblue21 是一块基于 Nordic nRF9160 SiP(System-in-Package)的蜂窝物联网传感器开发板,支持 NB-IoT 与 LTE-M 连接,板载加速度计、湿度传感器、Qi 无线充电与电池电量计等丰富外设。本文以 boards/innblue/innblue21/doc/index.rst 为骨架,结合仓库内该板的设备树、Kconfig 与构建配置,系统讲解 innblue21 的硬件资源、引脚映射、安全特性,以及如何在 Zephyr 中完成 Secure / Non-Secure(TrustZone-M)应用构建、烧录与调试。
innblue21 板级概览
innblue21 的核心是一颗 nRF9160 SiP,它在单一封装内集成了应用处理器(Arm Cortex-M33)、LTE-M/NB-IoT 调制解调器、射频前端以及电源管理单元,非常适合低功耗蜂窝物联网传感器节点类产品。在 Zephyr 中该板标识为innblue21,对应 SoC 为 nRF9160 SICA 变体(见 Kconfig.innblue21 中的select SOC_NRF9160_SICA),板级名称与兼容字符串定义于 innblue21_common.dtsi(model = "innblue v21 Dev Kit"、compatible = "innblue,innblue21")。
板载硬件
开发板内置了以下传感器与功能器件:
| 类别 | 器件 | 说明 |
|---|---|---|
| 加速度计 | ST LIS2DH12 | 三轴加速度计,I2C 接口,地址0x19 |
| CryptoElement | Microchip ATECC608a | 安全加密芯片,用于密钥存储与认证 |
| 湿度传感器 | ST HTS221 | 相对湿度与温度传感器,I2C 地址0x5f |
| Qi 无线充电 | TI BQ51013 | 无线充电接收端 |
| 电池电量计 | TI BQ27421 | 电池燃料电量计 |
需要说明的是,设备树 innblue21_common.dtsi 中 I2C 总线上实际使能并绑定了更多传感器节点,除文档列出的 LIS2DH12 与 HTS221 外,还包括:
- ST LPS22HB 气压计(
lps22hb-press@5c); - AMS CCS811 空气质量传感器(
ccs811@5a); - Bosch BME680 环境传感器(
bme680@76)。
这些节点均挂接在i2c2(Nordic TWIM 实例)下,时钟频率配置为I2C_BITRATE_FAST(400 kHz)。传感器使能时,Kconfig.defconfig中REGULATOR会默认开启(default y if SENSOR),配合板载的 3.3V 传感器电源与 5V 升压电源开关使用。
支持的 Zephyr 功能
从设备树与默认配置可以确认,该板在 Zephyr 中支持以下驱动与子系统:
- GPIO(
CONFIG_GPIO=y)、GPIOTE 事件控制器; - UART 串口(
CONFIG_SERIAL=y)、控制台(CONFIG_CONSOLE=y、CONFIG_UART_CONSOLE=y),默认波特率 115200; - I2C(TWIM)与多类传感器驱动;
- PWM(两个实例,分别驱动 RGB LED 与模式 LED);
- 看门狗 WDT、固定稳压器 regulator、TrustZone-M(
CONFIG_ARM_TRUSTZONE_M=y)与 MPU(CONFIG_ARM_MPU=y)。
以上驱动能力由 innblue21_nrf9160_defconfig 等配置文件在构建时统一开启。
引脚连接与 IO 映射
LED
板载 4 颗 LED,其中 3 颗组成 RGB 通道、1 颗为模式指示灯,均通过 GPIO 高电平驱动,引脚分配如下:
| LED | 颜色 | GPIO |
|---|---|---|
| LED1 | 红(RGB 红色通道) | P0.7 |
| LED2 | 绿(RGB 绿色通道) | P0.6 |
| LED3 | 蓝(RGB 蓝色通道) | P0.5 |
| LED4 | 红(模式红色通道) | P0.4 |
在设备树中它们被声明为gpio-leds节点red_led、green_led、blue_led与mode_led,并通过 aliases 映射为led0~led3,以便兼容各类示例程序(见 innblue21_common.dtsi)。同时 aliases 提供了rgb-pwm = &pwm0、mode-pwm = &pwm1,意味着可以直接用 PWM 做呼吸灯等效果——pinctrl 中 PWM 输出引脚(P0.5/P0.6/P0.7 与 P0.4/P0.9)配置了nordic,invert反向标志,与共阳/共阴 LED 的驱动极性相对应。
按键与开关
- BUTTON1 = P0.31,设备树中声明为
gpio-keys节点button0,配置GPIO_PULL_UP上拉并关联INPUT_KEY_0输入事件码,aliases 映射为sw0。
其他关键引脚
从 innblue21_common-pinctrl.dtsi 可进一步梳理出串口、I2C 与 PWM 的完整引脚复用:
| 外设 | 功能 | 引脚 |
|---|---|---|
| UART0(默认控制台) | TX / RX | P0.29 / P0.30 |
| UART1 | TX / RX | P0.14 / P0.15 |
| UART2 | TX / RX | P0.18 / P0.19 |
| I2C2(TWIM) | SDA / SCL | P0.25 / P0.26 |
| PWM0 | OUT0/OUT1/OUT2 | P0.5 / P0.6 / P0.7 |
| PWM1 | OUT0/OUT1 | P0.4 / P0.9 |
所有外设都定义了default与sleep两套 pinctrl 状态,sleep 状态通过low-power-enable在空闲时降低引脚功耗,这是典型的低功耗蜂窝节点设计考量。此外,en_3v3_sensor(P0.12)与en_5v0_boost(P0.21)两个固定稳压器节点负责为传感器与 5V 升压轨供电,均配置了regulator-boot-on上电即开启,并带 10 ms 启动延时。
安全特性:IDAU/SPU 与安全启动
innblue21 基于 Armv8-M 安全扩展构建,文档明确列出两项安全特性:
- Implementation Defined Attribution Unit(IDAU):通过 System Protection Unit(SPU)实现,用于划分 Secure 与 Non-Secure 内存映射。默认情况下,全部内存空间(Flash、SRAM 及外设地址空间)仅允许 Secure 访问,Non-Secure 侧需要由 Secure 固件显式放行。
- Secure boot:固件默认从 Secure 状态启动。
这一设计决定了 innblue21 在 Zephyr 中存在两种板级目标:
innblue21(Secure):使用 innblue21_nrf9160.dts,包含nordic/nrf9160_sica.dtsi,code partition 指向slot0_partition;innblue21/nrf9160/ns(Non-Secure):使用 innblue21_nrf9160_ns.dts,包含arm/nordic/nrf9160_ns_sica.dtsi,SRAM 指向sram0_ns_app、code partition 指向slot0_ns_partition。
两种目标的差异还体现在 Kconfig 上:innblue21_nrf9160_ns_defconfig 额外设置了CONFIG_TRUSTED_EXECUTION_NONSECURE=y;而 Kconfig.defconfig 中USE_DT_CODE_PARTITION仅在 NS 目标下被 select,保证 Non-Secure 固件无论如何都链接到设备树定义的 code partition 内。
构建 Secure / Non-Secure 应用
构建安全应用需要 Secure 与 Non-Secure 两个镜像配合,流程如下:
- 构建 Secure Zephyr 应用:使用
-DBOARD=innblue21,并在应用项目的 prj.conf 中设置CONFIG_TRUSTED_EXECUTION_SECURE=y; - 构建 Non-Secure Zephyr 应用:使用
-DBOARD=innblue21/nrf9160/ns(NS 目标默认即非安全固件); - 合并两个二进制镜像:将 Secure 与 Non-Secure 固件按分区布局合并后烧录。
其中关键约束是:Secure 应用必须预先配置 IDAU(SPU),将 Non-Secure 固件所需的所有 CPU 资源(Flash、SRAM、外设)开放给 Non-Secure 侧访问,并且 SPU 配置必须在跳转到 Non-Secure 应用之前完成。也就是说,Secure 镜像承担着“信任根 + 资源放行”的职责。
Secure 镜像自身也有大小限制——Kconfig.defconfig 中的注释明确说明:当 Secure 固件要与 Non-Secure 镜像合并(TRUSTED_EXECUTION_SECURE=y)时,Secure 固件镜像必须始终被限制在其 code partition 的大小范围内,否则会覆盖 Non-Secure 分区。
构建 Secure-only 应用
如果不需要 Non-Secure 侧(例如仅运行一个受信任的传感器采集程序),则按常规方式构建即可:
west build -b innblue21 samples/hello_world此时整个应用运行在 Secure 状态,无需考虑分区与镜像合并问题。
烧录(Flashing)
innblue21 的烧录走 Nordic 标准工具链。从 board.cmake 可以看到该板注册了三种 runner:
board_runner_args(jlink "--device=nRF9160_xxAA" "--speed=4000") include(${ZEPHYR_BASE}/boards/common/nrfutil.board.cmake) include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake)即同时支持nrfutil、nrfjprog与J-Link三种烧录方式,其中 J-Link 明确指定器件型号为nRF9160_xxAA、调试时钟 4000 kHz。使用前需参照 Nordic 官方 Segger 相关文档安装并配置好 nrfjprog / nrfutil 与 J-Link 软件。
烧录前先打开终端监听串口输出(默认控制台为 UART0,波特率 115200):
minicom -D /dev/ttyACM0 -b 115200将/dev/ttyACM0替换为 innblue21 在系统中的实际串口设备(Linux 下通常形如/dev/ttyACM0)。随后构建并烧录示例应用:
west build -b innblue21 samples/hello_world west flashwest flash会自动选择可用的 runner(优先 nrfutil),完成后即可在 minicom 中看到串口输出。
调试(Debugging)
innblue21 板载 Segger 调试接口,调试方式与 Nordic 其他开发板一致:参照 Segger 相关页面配置 J-Link 调试器与 GDB,即可进行断点调试、寄存器与内存查看。调试会话同样通过west与 J-Link 配合启动(runner 参数中的--speed=4000即针对该板的调试时钟配置),可结合 Secure/Non-Secure 目标分别对两个镜像进行调试。
小结
从本文可以看出,innblue21 在 Zephyr 中是一个完整支持 TrustZone-M 安全模型的双目标开发板:硬件上以 nRF9160 SiP 提供蜂窝连接与丰富传感器资源,软件上通过innblue21(Secure)与innblue21/nrf9160/ns(Non-Secure)两个板级目标,配合CONFIG_TRUSTED_EXECUTION_SECURE/CONFIG_TRUSTED_EXECUTION_NONSECURE与 SPU 分区放行机制,实现安全启动与可信执行环境。对于需要 NB-IoT/LTE-M 连接且对安全敏感的低功耗物联网产品,这套“硬件传感器 + 蜂窝模组 + 双镜像安全架构”的组合可直接作为开发起点,相关配置均可在仓库 boards/innblue/innblue21 目录下对照查阅。
【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考