RIOT cc2650-launchpad 板级支持详解:TI CC2650 LaunchPad 的构建、烧录与外设配置
2026/9/17 8:05:22 网站建设 项目流程

RIOT cc2650-launchpad 板级支持详解:TI CC2650 LaunchPad 的构建、烧录与外设配置

【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT

本篇基于 RIOT 仓库中 boards/cc2650-launchpad/doc.md 的原始板级文档展开,完整覆盖 TI SimpleLink CC2650 LaunchPad(LAUNCHXL-CC2650)开发套件在 RIOT 中的硬件规格、构建系统集成、外设映射与烧录调试全流程。读完后你将能够独立完成该开发板的编译、通过板载 XDS110 调试器烧录固件,并在应用代码中使用其 LED、按键与串口等外设。

一、开发板概述:CC2650 SoC 与双核架构

TI CC2650 LaunchPad(LAUNCHXL-CC2650)是 Texas Instruments 面向 CC2650 SoC 的开发套件。CC2650 的架构特点是:

  • 一颗ARM Cortex-M3主核负责应用逻辑;
  • 一颗专用Cortex-M0协处理器负责控制片上射频(802.15.4)无线电,即原文档所述 "dedicated Cortex-M0 to control the radio"。

原文档给出的硬件规格表如下,可直接作为选型参考:

项目规格
MCUCC2650
核心家族ARM Cortex-M3
厂商Texas Instruments
RAM20KiB
Flash128KiB
主频48MHz
FPU
定时器4
ADC1 路 12-bit
UART1
SPI2
I2C1
供电 Vcc1.8V – 3.8V

原文档还引用了 TI 官方的 Datasheet、Reference Manual 以及《CC2650 Quick Start Guide》(默认板级引脚图出处)。这些为 TI 站外文档,本文不重复链接,需要完整引脚默认值时查阅该 Quick Start Guide 即可。

二、RIOT 构建系统中的板级集成

cc2650-launchpad 在 RIOT 中通过标准 board 模块目录组织,关键文件与职责如下:

2.1 模块声明:Makefile.features

Makefile.features 定义了该板依赖的 CPU 与提供的外设特性:

CPU = cc26x0_cc13x0 CPU_MODEL = cc26x0f128 # Put defined MCU peripherals here (in alphabetical order) FEATURES_PROVIDED += periph_gpio periph_gpio_irq FEATURES_PROVIDED += periph_timer FEATURES_PROVIDED += periph_uart FEATURES_PROVIDED += periph_i2c

要点:

  • CPU = cc26x0_cc13x0:复用 CC26x0/CC13x0 共用 CPU 目录 cpu/cc26x0_cc13x0,其中的 cpu.c 与periph/子目录提供时钟、GPIO、定时器、UART、I2C 等底层驱动;
  • CPU_MODEL = cc26x0f128:具体到 CC2650 的 128KiB Flash 型号变体,该型号还会决定烧录工具的 OpenOCD 配置选择(见第四节);
  • FEATURES_PROVIDED列表与periph_conf.h中的实际配置一一对应:GPIO、GPIO 中断、定时器、UART、I2C。应用侧通过USEMODULE += periph_xxx拉取这些特性即可获得统一的 RIOT periph 抽象接口。

2.2 Kconfig 与调试器声明

Kconfig 将板卡与 CPU 型号绑定:

config BOARD_CC2650_LAUNCHPAD bool default y select CPU_MODEL_CC26X0F128

Makefile.include 则声明调试适配器并复用同系列板卡的烧录配置:

XDEBUGGER = XDS110 # configure the flash tool include $(RIOTBOARD)/common/cc26xx_cc13xx/Makefile.include

XDEBUGGER = XDS110指明该板自带 TI XDS110 片上调试器,这是make flash/make debug的工作基础;第二行 include 的公共文件 boards/common/cc26xx_cc13xx/Makefile.include 承载了全部烧录器选择逻辑,下文详述。

2.3 依赖与 SAUL 支持

Makefile.dep 处理了 SAUL 传感器/外设框架的默认映射依赖:

ifneq (,$(filter saul_default,$(USEMODULE))) USEMODULE += saul_gpio endif

即只要应用启用了saul_default,就自动把saul_gpio模块加入构建,从而让 SAUL 的默认设备枚举生效(见下一节的gpio_params.h)。

三、板载外设配置:LED、按键、xtimer、UART 与 I2C

3.1 LED 与按键:include/board.h

include/board.h 定义了板上可直接操控的用户外设:

/** * @name xtimer configuration * @{ */ #define XTIMER_WIDTH (16) #define XTIMER_BACKOFF (25) #define XTIMER_ISR_BACKOFF (20) /** @} */ /** * @name On-board button configuration * @{ */ #define BTN0_PIN GPIO_PIN(0, 13) #define BTN0_MODE GPIO_IN_PU #define BTN1_PIN GPIO_PIN(0, 14) #define BTN1_MODE GPIO_IN_PU /** @} */ #define LED0_PIN GPIO_PIN(0, 6) /**< red */ #define LED1_PIN GPIO_PIN(0, 7) /**< green */ #define LED0_ON gpio_set(LED0_PIN) #define LED0_OFF gpio_clear(LED0_PIN) #define LED0_TOGGLE gpio_toggle(LED0_PIN) /* LED1 同理 ... */

说明:

  • xtimer 参数:CC2650 使用 16 位宽的 xtimer(XTIMER_WIDTH 16),并给出了XTIMER_BACKOFF 25/XTIMER_ISR_BACKOFF 20的中断回退常量,用于规避定时器回绕竞态;
  • 按键:两个板载按键位于 P0.13 / P0.14,配置为上拉输入(GPIO_IN_PU),按下时为低电平;
  • LED:红色 LED 在 P0.6,绿色 LED 在 P0.7,直接通过gpio_set/clear/toggle宏控制。

3.2 时钟、定时器与串行接口:include/periph_conf.h

include/periph_conf.h 是 RIOT periph 抽象层读取的核心配置,内容要点:

/* the main clock is fixed to 48MHZ */ #define CLOCK_CORECLOCK (48000000U)

与硬件规格表中的 48MHz 主频一致——CC2650 主时钟固定为 48MHz,无需 PLL 配置。

通用定时器:4 个 GPT 按顺序无间隔配置,共 4 份条目:

static const timer_conf_t timer_config[] = { { .cfg = GPT_CFG_16T, .chn = 2 }, { .cfg = GPT_CFG_32T, .chn = 1 }, { .cfg = GPT_CFG_16T, .chn = 2 }, { .cfg = GPT_CFG_32T, .chn = 1 }, }; #define TIMER_NUMOF ARRAY_SIZE(timer_config)

即前两个定时器配为 16 位、各 2 个捕获通道,后两个配为 32 位、各 1 个通道,满足periph_timer特性的多精度需求。

UART:CC26x0 系列 CPU 只有一路 UART,因此只需配置 TX/RX 引脚:

static const uart_conf_t uart_config[] = { { .regs = UART0, .tx_pin = 3, .rx_pin = 2, #ifdef MODULE_PERIPH_UART_HW_FC .rts_pin = GPIO_UNDEF, .cts_pin = GPIO_UNDEF, #endif .intn = UART0_IRQN } }; #define UART_NUMOF ARRAY_SIZE(uart_config)

TX 使用 P0.3、RX 使用 P0.2(对应板载 USB-UART 桥)。文件注释同时说明:可选启用硬件流控——构建时加上USEMODULE += periph_uart_hw_fc,并在此处定义cts_pin/rts_pin(默认GPIO_UNDEF即未接)。

I2C:单路 I2C 总线映射到两个 GPIO 引脚:

#define I2C_NUMOF (1) #define I2C_SDA_PIN (14) #define I2C_SCL_PIN (15)

SDA = P0.14、SCL = P0.15,这是板载 I2C 扩展口的位置,接外部传感器时可直接使用periph_i2c接口。

3.3 SAUL 直接映射:include/gpio_params.h

include/gpio_params.h 将板上 4 个用户外设注册进 SAUL 框架:

static const saul_gpio_params_t saul_gpio_params[] = { { .name = "LED(red)", .pin = LED0_PIN, .mode = GPIO_OUT }, { .name = "LED(green)", .pin = LED1_PIN, .mode = GPIO_OUT }, { .name = "Button(BTN-1)", .pin = BTN0_PIN, .mode = BTN0_MODE, .flags = SAUL_GPIO_INVERTED }, { .name = "Button(BTN-2)", .pin = BTN1_PIN, .mode = BTN1_MODE, .flags = SAUL_GPIO_INVERTED }, };

LED 为普通输出;两个按键标记SAUL_GPIO_INVERTED,补偿了“按下为低”的硬件极性与 SAUL 逻辑电平的差异。配合第 2.3 节的saul_default → saul_gpio依赖,应用可以按名称(如LED(red))枚举并读写这些设备。

四、烧录与调试:XDS110、Uniflash 与 OpenOCD

4.1 基本流程

原文档给出的烧录流程非常直接:板上集成 XDS110 调试探针,通过 Micro-USB 口提供编程、烧录和调试能力。安装 TI Uniflash 或 OpenOCD 之一后,用 Micro-USB 连接开发板,然后执行:

BOARD=cc2650-launchpad make flash

默认走 Uniflash;若想改用 OpenOCD,只需设置PROGRAMMER环境变量:

export PROGRAMMER=openocd

之后make flashmake debug都会通过 OpenOCD 完成。原文档同时指向共享的 CC26xx/CC13xx 文档组(\ref cc26xx_cc13xx_riot),其中涵盖该系列 MCU 的编译与烧录工具安装细节。

4.2 烧录器选择逻辑(源码级)

上述行为的实现集中在 boards/common/cc26xx_cc13xx/Makefile.include:

# configure the flash tool ifneq (,$(UNIFLASH_PATH)) PROGRAMMER ?= uniflash else PROGRAMMER ?= openocd endif # uniflash and openocd programmers are supported PROGRAMMERS_SUPPORTED += openocd uniflash

可以确认两点默认行为:系统上能找到 Uniflash(UNIFLASH_PATH非空)时默认用 uniflash,否则回落到 openocd;且这两个烧录器均在支持列表内。因此第 4.1 节的export PROGRAMMER=openocd正是利用?=的弱赋值被环境变量覆盖。

此外该文件还定义了:

TTY_BOARD_FILTER := --model XDS110 --iface-num 0 OPENOCD_DEBUG_ADAPTER ?= xds110 OPENOCD_CMD_RESET_HALT ?= -c 'halt'
  • TTY_BOARD_FILTER:当启用MOST_RECENT_PORT=1的串口自动探测时,只筛选 XDS110 调试器的 USB-UART 桥接口,避免误选其他串口设备;
  • OPENOCD_DEBUG_ADAPTER:指定 OpenOCD 使用 XDS110 适配器;
  • OPENOCD_CMD_RESET_HALT:注释说明这是针对 CC26xx/CC13xx 的一个 bug 的规避——reset halt会触发该 bug,因此改用单独的halt命令让设备保持可烧录状态;这是一种有意识的取舍(可能与目标固件安装的中断处理竞争),但换来了烧录基本不失败。

4.3 OpenOCD 配置与 CC2650 目标文件

OpenOCD 的配置文件按 CPU 型号自动选择。对本板(CPU_MODEL = cc26x0f128),匹配cc26x0%分支:

ifneq (,$(filter cc26x0%,$(CPU_MODEL))) DEFAULT_OPENOCD_CONFIG := $(RIOTBASE)/boards/common/cc26xx_cc13xx/dist/openocd_cc26x0.cfg DEFAULT_JLINK_DEVICE := CC26xx endif

boards/common/cc26xx_cc13xx/dist/openocd_cc26x0.cfg 内容只有一行,指向 OpenOCD 自带目标描述:

source [find target/ti_cc26x0.cfg]

同一dist/目录还提供 XDS110 连接器的描述与数据文件,例如 cc26x0f128_XDS110.ccxml 与对应的.datgdb.conf文件,供 TI 系工具链识别目标;JLINK_DEVICE = CC26xx则保证使用 J-Link 调试器时也能选对芯片型号(JLINK_IF默认为 jtag)。

五、上手路径小结

在 RIOT 仓库中针对本开发板的完整工作流可归纳为:

  1. 编译BOARD=cc2650-launchpad make -C examples/gnrc_networking(或任意示例),构建系统按 Makefile.features 拉取cc26x0_cc13x0CPU 支持与periph_*特性;
  2. 烧录:确认安装了 Uniflash 或 OpenOCD 后BOARD=cc2650-launchpad make flash;需要 OpenOCD 时先export PROGRAMMER=openocd
  3. 调试BOARD=cc2650-launchpad make debug,由同一套 XDS110/OpenOCD 配置进入 GDB;
  4. 使用外设:应用直接引用board.hLED0_PINBTN0_PIN等宏,或使用periph_uart(P0.2/P0.3)、periph_i2c(P0.14/P0.15)、periph_timer(4 个 GPT)以及 SAUL 具名设备;
  5. 扩展:需要硬件流控时加USEMODULE += periph_uart_hw_fc并补全cts_pin/rts_pin;需要 SAUL 枚举时加USEMODULE += saul_default

板级文档、构建文件与外设头文件的完整位置为:boards/cc2650-launchpad/doc.md、boards/cc2650-launchpad/Kconfig、boards/cc2650-launchpad/include/board.h、boards/cc2650-launchpad/include/periph_conf.h、boards/common/cc26xx_cc13xx/Makefile.include。以上所有烧录行为以当前仓库 boards/common/cc26xx_cc13xx/dist 中的 XDS110/CC26x0 目标文件为前提,适用于搭载 XDS110 片上调试器的 LAUNCHXL-CC2650 套件。

【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT

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

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

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

立即咨询