资讯动态

CMSIS_5 中的 LPC-Link2 CMSIS-DAP v2 固件:Bulk 端点架构、启动流程与 DAP_config.h 配置详解

发布时间:2026/10/14 17:02:50 来源:尧图企业网站定制
嵌入式RTOS深度学习【免费下载链接】CMSIS_5CMSIS Version 5 Development Repository项目地址https://gitcode.com/gh_mirrors/cm/CMSIS_5点击查看免费下载本文基于 CMSIS_5 仓库中CMSIS/DAP/Firmware/Examples/LPC-Link2/README.md这一固件说明文档展开结合项目源码深入剖析 NXP LPC-Link2 调试探头的 CMSIS-DAP v2 固件实现。读完后你将掌握该固件为何采用 USB Bulk 端点替代传统 HID、SWO 流式 Trace 的独立端点如何工作、固件的 RTOS 线程结构与启动时序以及 DAP_config.h 中各关键参数的含义与调试端口引脚映射为评估、移植或替换 CMSIS-DAP 调试器固件提供完整依据。固件概述两种目标形态LPC-Link2 固件说明 明确了两点核心设计CMSIS-DAP v2 使用 USB Bulk 端点与主机 PC 通信相比 v1 的 HID 接口速度更快可选支持 SWO 流式 Trace通过一个额外的 USB 端点实现。该固件支持两类目标形态目标说明项目中的体现LPC-Link2stand-alone独立调试探头MDK 目标LPC-Link2调试单元 MCU 为 LPC4370LPC-Link2 on-board评估板板载调试探头LPC55S69-EVK、MIMXRT1064-EVK 等MDK 目标LPC-Link2 on-board调试单元 MCU 为 LPC4322编译时定义TARGET_POWER_EN LPC_LINK2_ONBOARD从 CMSIS_DAP.uvprojx 的 Target 配置可以看到两个目标分别指定了设备LPC4370:Cortex-M4与LPC4322:Cortex-M4编译器均为 ARMCLANG V6.16且板载目标额外定义了LPC_LINK2_ONBOARD宏——这是区分两种形态的唯一编译开关。仓库同时提供了预编译固件 Objects/CMSIS_DAP.hex可直接刷写到 LPC-Link2 内部 MCU 使用。版本方面公共头文件 DAP.h 中通过DAP_FW_V1宏切换版本号v1 固件为1.3.0v2 固件为2.1.2。v2 的协议在 v1 命令集基础上增加了ID_DAP_SWO_ExtendedStatus0x1E、ID_DAP_UART_Transport/Configure/Control/Status/Transfer0x1F~0x23等命令并引入ID_DAP_QueueCommands/ID_DAP_ExecuteCommands0x7E/0x7F批量命令执行机制这些均可在 DAP.h 的命令 ID 定义中查到。USB 通信架构三个 Bulk 端点与 WinUSB 绑定端点规划固件基于 MDK 的 USB Device 中间件实现Custom Class 0 配置在 USBD_Config_CustomClass_0.h 中接口采用 Vendor Specific 类Class Code0xFF启用了三个 Bulk 端点端点地址方向用途Endpoint 1 OUT0x01OUT接收主机下发的 DAP 命令包Endpoint 1 IN0x81IN回传 DAP 命令响应Endpoint 2 IN0x82INSWO 流式 Trace 数据上报高速模式下每个 Bulk 端点的最大包长为 512 字节USBD_CUSTOM_CLASS0_IF0_EPx_HS_WMAXPACKETSIZE 512全速模式为 64 字节。接口描述字符串为LPC-Link2 CMSIS-DAP。WinUSB 免驱绑定为了让 Windows 主机免装驱动直接使用 Bulk 接口配置中启用了 Microsoft OS 扩展描述符compatibleID设为WINUSB使 Windows 自动绑定 WinUSB 驱动自定义属性DeviceInterfaceGUID设为{CDB3B5AD-293B-4663-AA36-1AAE46463776}调试器软件据此枚举设备。这正是 CMSIS-DAP v2 生态中免驱 Bulk 传输的实现方式无需 HID 报告描述符与 64/512 字节 HID 包约束主机端只需 WinUSB 即可按任意包长收发。环形缓冲区与线程交接USBD_User_CustomClass_0.c 定义了请求/响应两组环形缓冲区大小由DAP_PACKET_COUNT × DAP_PACKET_SIZE8 × 512 字节决定并放置到独立的.bss.USB_IO段static uint8_t USB_Request [DAP_PACKET_COUNT][DAP_PACKET_SIZE] __attribute__((section(.bss.USB_IO))); static uint8_t USB_Response[DAP_PACKET_COUNT][DAP_PACKET_SIZE] __attribute__((section(.bss.USB_IO)));在USBD_CustomClass0_Endpoint1_Event回调中USBD_User_CustomClass_0.c收到 OUT 数据后先检查包首字节是否为ID_DAP_TransferAbort若是则置位DAP_TransferAbort 1紧急中止 SWD/JTAG 传输否则环形索引前进并通过osThreadFlagsSet(DAP_ThreadId, 0x01)唤醒 DAP 线程环形队列未写满时立即调用USBD_EndpointRead预取下一包写满则置USB_RequestIdle暂停接收形成天然的 USB 流控IN 方向发送完成后继续投递下一份响应无待发数据时置USB_ResponseIdle。SWO 端点 2 的 IN 事件则直接调用SWO_TransferComplete()通知固件可以再次发送下一段 Trace 数据USBD_User_CustomClass_0.c。固件启动流程与 RTOS 线程结构固件运行在 CMSIS-RTOS2cmsis_os2.h之上。main.c 的main()完成时钟更新、内核初始化并创建app_main应用线程app_main中main.c的启动时序为DAP_Setup()—— 初始化调试端口 I/O 引脚、LED 与 NVICUSB0 中断优先级 1USBD_Initialize(0U)初始化 USB 设备板载形态下额外调用GetSerialNum()并通过USBD_SetSerialNumber(0U, ser_num)将设备序列号写入 USB 描述符USBD_Connect(0U)连接 USB 总线随后while (!USBD_Configured(0U))阻塞等待主机完成配置通过LED_CONNECTED_OUT/LED_RUNNING_OUT点亮再熄灭 LED 指示启动完成间隔 500 ms创建两个工作线程DAP_Thread处理 DAP 命令与SWO_Thread处理 SWO 数据搬运然后osDelay(osWaitForever)挂起应用线程。两个线程的优先级在 osObjects.h 中定义static const osThreadAttr_t DAP_ThreadAttr { .priority osPriorityNormal }; static const osThreadAttr_t SWO_ThreadAttr { .priority osPriorityAboveNormal };SWO 线程优先级高于 DAP 线程保证 Trace 数据搬运不会因调试命令处理而被长期抢占这与流式 Trace 对时延敏感的设计意图一致。DAP_config.h 关键参数解析DAP_config.h 是 CMSIS-DAP 固件中定义调试单元硬件参数的核心文件LPC-Link2 的取值如下宏取值含义CPU_CLOCK180 MHz调试单元 MCU 主频用于计算 SWD/JTAG 时钟LPC43xx 上限IO_PORT_WRITE_CYCLES2每次 GPIO 写操作的 CPU 周期数同样用于推导 SWD/JTAG 时钟上限DAP_SWD/DAP_JTAG1 / 1调试访问端口同时支持 SWD 与 JTAG 模式DAP_JTAG_DEV_CNT8扫描链上最大 JTAG 设备数合法范围 1..255影响固件 RAM 占用DAP_DEFAULT_PORT1DAP_Connect缺省端口1 SWD2 JTAGDAP_DEFAULT_SWJ_CLOCK1 MHz默认 SWD/JTAG 时钟频率可被DAP_SWJ_Clock命令改写DAP_PACKET_SIZE512命令/响应包最大字节数与高速 USB Bulk 端点 512 字节对齐DAP_PACKET_COUNT8命令/响应缓冲包数量即 USB 环形缓冲区深度SWO_UART/SWO_MANCHESTER1 / 0仅支持 UART 模式 SWO不支持 Manchester 编码SWO_UART_DRIVER1复用 Driver_USART1 实例接收目标 SWO 输出SWO_UART_MAX_BAUDRATE10 MHzSWO 最高波特率SWO_BUFFER_SIZE8192SWO 环形 Trace 缓冲区须为 2 的幂SWO_STREAM1使能流式 Trace即 README 所述的额外 USB 端点功能TIMESTAMP_CLOCK180 MHz时间戳时钟频率TIMESTAMP_GET读取 DWT 周期计数器DAP_UART1支持 UART 通信端口目标串口透传使用 Driver_USART0DAP_UART_RX/TX_BUFFER_SIZE1024UART 收发缓冲区大小DAP_UART_USB_COM_PORT1同时提供 USB CDC 虚拟串口作为 UART 数据的备用通道TARGET_FIXED1on-board/ 0stand-alone板载形态下调试单元固定连接已知目标两个值得注意的实现细节时间戳源TIMESTAMP_GET直接返回DWT-CYCCNTDAP_config.h即 DWT 周期计数器与 180 MHz 的TIMESTAMP_CLOCK配合为主机提供精确的测试域时间戳板载目标信息字符串TARGET_FIXED ! 0时DAP_GetTargetDeviceVendorString等内联函数会返回 DAP_config.h 中定义的NXP/Cortex-M/NXP/NXP board字符串供 IDE 在DAP_Info查询后自动选择器件stand-alone 形态一律返回 0未知目标。target.c 注释标明该文件是可打补丁的即更换板载目标器件时只需修改此文件中的四个字符串。板载模式LPC_LINK2_ONBOARD与序列号生成LPC_LINK2_ONBOARD宏由 MDK 板载目标自动定义带来三处行为差异TARGET_FIXED置 1上报固定目标器件信息DAP_GetSerNumString改为调用GetSerialNum()返回真实序列号main.c中将该序列号通过USBD_SetSerialNumber写入 USB 设备描述符使主机能区分多个板载探头。序列号算法在 ser_num.c 中实现通过 LPC43xx IAP位于0x10400100命令号 58IAP_READ_DEVICE_SERIAL_NUMBER读取芯片内部 16 字节唯一 ID对 16 字节 ID 计算 CRC32多项式0x04C11DB7初值0xFFFFFFFF序列号格式为固定前缀00A1 CRC32 的 8 位十六进制数例如00A1A3F2C1B4IAP 读取失败时返回 NULL固件退化为不设序列号。调试端口引脚映射与硬件初始化LPC-Link2 硬件上调试端口信号经过缓冲器引出DAP_config.h 给出了完整引脚映射信号连接器引脚GPIO备注SWCLK/TCKP1_17GPIO0[12]推挽输出SWDIO/TMSP1_6GPIO1[9]双向另有方向控制脚SWDIO 输出使能P1_5GPIO1[8]用于快速切换 SWDIO 输入/输出TDIP1_18GPIO0[13]推挽输出TDOP1_14GPIO1[7]仅输入nTRST——硬件上不存在PIN_nTRST_*为空实现nRESETP2_5GPIO5[5]开漏 上拉由 GPIO5[6] 作输出使能Connected LEDP1_1GPIO0[8]调试器连接指示Target Running LED——硬件上不存在LED_RUNNING_OUT为空实现由于缓冲器无法三态化源码注释明确指出 SWCLK/TCK、TDI 乃至 SWDIO 的输出均保持激活状态只有 nRESET 配置为开漏DAP_config.h。PORT_SWD_SETUP/PORT_JTAG_SETUP利用 LPC43xx GPIO 的 MASK 寄存器在 SWD 与 JTAG 模式间切换哪些脚参与调试信号SWD 模式屏蔽 TDIJTAG 模式屏蔽 SWDIO 数据位。DAP_SETUPDAP_config.h的初始化序列为打开 GPIO 时钟LPC_CCU1-CLK_M4_GPIO_CFG CCU_CLK_CFG_AUTO | CCU_CLK_CFG_RUN并等待CCU_CLK_STAT_RUN逐引脚配置 SCU 功能复用SFSP1_17、SFSP1_6、SFSP2_5等全部改为 GPIO 功能并使能输入缓冲仅 nRESET 带上拉将 SWCLK/TCK、SWDIO/TMS、SWDIO_OE、TDI 置高并设为输出TDO 设为输入nRESET 的锁存清零、使能脚清零即默认释放复位LED 配置为输出并熄灭NVIC_SetPriority(USB0_IRQn, 1U)设置 USB 中断优先级。文件末尾的RESET_TARGET当前返回 0表示未实现器件专用的复位/解锁时序DAP_config.hDAP_ResetTarget命令将回落到标准 nRESET 拉低-释放流程。SWO 流式 Trace 的落地方式README 提到的额外 USB 端点在源码中对应三条配置链DAP_config.h 中SWO_STREAM 1SWO_BUFFER_SIZE 8192声明固件具备流式 Trace 能力8 KB 环形缓冲区先于上报缓存目标侧 SWO 数据USBD_Config_CustomClass_0.h 中 Endpoint 2 IN0x82Bulk高速 512 字节作为 SWO 数据专用通道SWO_Thread以高于 DAP 线程的优先级运行USB 端点 2 发送完成事件触发SWO_TransferComplete()驱动固件从 SWO 缓冲区向端点 2 持续投递数据。主机侧则通过DAP_Info查询DAP_ID_SWO_BUFFER_SIZE0xFD等字段获知缓冲区能力再结合ID_DAP_SWO_TransportUART与ID_DAP_SWO_Control命令开启流式输出。由于 Trace 数据走独立端点不占用命令/响应通道SWD 调试与 Trace 采集可以并行进行。构建与刷写方式重新构建工程为 MDK5 工程 CMSIS_DAP.uvprojx需用 MDKARM Compiler 6V6.16 以上打开后选择LPC-Link2或LPC-Link2 on-board目标编译板载目标会在编译时自动附加TARGET_POWER_EN LPC_LINK2_ONBOARD宏定义。使用预编译固件仓库已提供 Objects/CMSIS_DAP.hexIntel HEX 格式可按 NXP 对 LPC-Link2 的固件升级流程将其刷写到探头内部 MCULPC4370/LPC4322。验证本仓库在 CMSIS/DAP/Firmware/Validation/MDK5/ 下提供 CMSIS-DAP 固件验证工程含test.bat、test.c可在固件刷写后对命令集做功能级回归。小结LPC-Link2 的 CMSIS-DAP v2 固件是协议层与硬件层解耦的典型样本协议行为Bulk 端点、512 字节包、8 包深环形缓冲、批量命令由 DAP.h 与 DAP.c 等公共源码定义硬件差异引脚、时钟、SWO 能力、板载目标串号则全部收敛在 DAP_config.h、ser_num.c 与 target.c 中并用LPC_LINK2_ONBOARD一个宏区分独立探头与板载探头两种形态。理解了这一结构读者即可评估将同类固件移植到其他 Cortex-M 调试单元 MCU 时需要同步修改的配置面。赞分享嵌入式RTOS深度学习【免费下载链接】CMSIS_5CMSIS Version 5 Development Repository项目地址https://gitcode.com/gh_mirrors/cm/CMSIS_5点击查看免费下载相关推荐Archinstall UEFI固件终极配置指南快速设置与安全启动详解Archinstall UEFI固件终极配置指南快速设置与安全启动详解 Archinstall作为Arch Linux的官方安装工具为UEFI固件的配置提供运维CLI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑