
嵌入式驱动开发物联网【免费下载链接】CherryUSBCherryUSB is a tiny and beautiful, high performance and portable USB host and device stack for embedded system with USB IP项目地址https://gitcode.com/gh_mirrors/ch/CherryUSB点击查看免费下载CherryUSB 是一款面向嵌入式系统的轻量级、高性能 USB 主机与设备协议栈。其全部行为——日志输出、数据缓存一致性、端点缓冲、MSC 读写调度、RNDIS 网络对接、主机枚举容量与超时策略——都由集中式配置文件中的 CONFIG 宏决定。本文以官方配置说明文档docs/zh/api/api_config.rst为主体结合仓库源码与配置模板逐项讲解每类 CONFIG 的含义、默认值、影响范围与实战调整建议。读完本文你将能够根据芯片特性、应用场景与资源预算正确地裁剪和调优 CherryUSB 的整套配置。配置文件的组织方式CherryUSB 的所有配置项都以CONFIG_前缀的宏形式存在默认值集中定义在仓库根目录的 cherryusb_config_template.h 中。使用时将该模板复制到你的工程并重命名为usb_config.h或按各移植层惯例命名按需开启、关闭或修改宏即可协议栈源码内部大量使用#ifndef ... #define ...的保护写法因此未定义的宏会自动回退到模板默认值。配置文件按职责划分为三大区域通用 CONFIG与日志、数据一致性、内存对齐相关设备端和主机端共用设备协议栈 CONFIG控制 EP0 控制传输缓冲、MSC 类驱动、RNDIS 类驱动等设备端行为主机协议栈 CONFIG控制枚举容量、类驱动实例数量、插拔线程与各类超时。此外仓库为 RT-Thread 提供了 Kconfig.rtt / Kconfig.rttpkg 菜单化配置入口使用 RT-Thread 的工程可以直接通过 menuconfig 图形化修改这些宏。通用 CONFIG日志、缓存一致性与对齐通用 CONFIG 是所有 USB 功能的基础直接影响调试效率与数据传输的正确性。CONFIG_USB_PRINTFUSB log 的底层输出接口USB log 默认重定向到printf。协议栈内部所有日志USB_LOG_DBG/USB_LOG_INFO/USB_LOG_WRN/USB_LOG_ERR最终都通过该宏输出。必须注意USB log 会在中断上下文中被调用因此重定向的目标 API 不允许阻塞。模板头文件给出了跨 RTOS 的示例#ifdef __RTTHREAD__ #include rtthread.h #define CONFIG_USB_PRINTF(...) rt_kprintf(__VA_ARGS__) #else #define CONFIG_USB_PRINTF(...) printf(__VA_ARGS__) #endif即使用 RT-Thread 时应替换为rt_kprintf非阻塞实现裸机或其他 RTOS 下则可继续使用printf。若你的平台printf本身会阻塞例如等待串口空闲就必须在中断频繁的 USB 场景下更换实现否则可能导致中断处理延迟甚至系统异常。相关源码见 common/usb_log.h 中对CONFIG_USB_PRINTF的所有调用点。CONFIG_USB_DBG_LEVEL控制日志打印级别该宏控制 log 的打印级别共四级定义于 common/usb_log.h级别宏值对应输出宏含义USB_DBG_ERROR0USB_LOG_ERR仅错误USB_DBG_WARNING1USB_LOG_WRN警告及以上USB_DBG_INFO2USB_LOG_INFO信息及以上默认USB_DBG_LOG3USB_LOG_DBG全量调试模板默认CONFIG_USB_DBG_LEVEL为USB_DBG_INFO。实际配置时若需要排查底层细节可临时提升到USB_DBG_LOG发布时建议降级以减小代码体积与运行开销——级别不足时对应的打印宏会被编译为空操作。CONFIG_USB_PRINTF_COLOR_ENABLElog 颜色打印默认开启。开启后日志会携带终端 ANSI 颜色码INFO 为绿色、WARNING 为黄色、ERROR 为红色见 common/usb_log.h 中的颜色定义。若日志输出到不支持颜色的串口工具或文件系统可关闭此宏以去掉转义序列。CONFIG_USB_DCACHE_ENABLE 与 USB_NOCACHE_RAM_SECTION数据一致性保证这两项解决的是同一个问题USB 控制器DMA与 CPU 之间如何保证缓存数据一致。USB_NOCACHE_RAM_SECTION将 USB 输入输出 buffer 放入无缓存 RAM。若芯片有 cache则 buffer 必须放在 nocache ram 中保证一致性若芯片没有 cache 功能此宏无效。模板中的定义是把变量放入.noncacheable段#define USB_NOCACHE_RAM_SECTION __attribute__((section(.noncacheable)))CONFIG_USB_DCACHE_ENABLE在不使用 nocache ram 的情况下通过软件维护 cache 一致性clean / invalidate / flush来保证数据一致。开启后协议栈会在 DMA 传输前后调用 common/usb_dcache.h 中声明的usb_dcache_clean、usb_dcache_invalidate、usb_dcache_flush这些接口需要在移植层按芯片实现。官方文档特别强调使用 EHCI 时即使开启 CONFIG_USB_DCACHE_ENABLE内部依旧需要使用 nocache ram因为 EHCI 的描述符与数据结构会被控制器直接读取。因此带 cache 的芯片推荐优先为 USB buffer 分配 nocache 内存段软件 cache 维护作为补充手段。CONFIG_USB_ALIGN_SIZEbuffer 对齐大小USB buffer 的对齐大小默认 4。IP 在 DMA 模式下可能对输入 buffer 有对齐要求一般为 4若芯片要求其他对齐方式请修改此值。模板中给出了联动逻辑#ifdef CONFIG_USB_DCACHE_ENABLE #define CONFIG_USB_ALIGN_SIZE 32 // 32 or 64 #else #define CONFIG_USB_ALIGN_SIZE 4 #endif即开启 dcache 维护时默认对齐到 cache line32 或 64 字节common/usb_dcache.h 中还有编译期检查CONFIG_USB_ALIGN_SIZE必须是 32 的倍数否则直接报错。协议栈中所有USB_MEM_ALIGNX修饰的缓冲都会按此值对齐参见 core/usbd_core.c 中对 EP0req_data的USB_ALIGN_UP处理。设备协议栈 CONFIG设备协议栈配置主要围绕 EP0 控制传输、MSC 类驱动与 RNDIS 类驱动展开。CONFIG_USBDEV_REQUEST_BUFFER_LEN控制传输缓冲长度控制传输Setup 之后的 Data Stage接收和发送 buffer 的最大长度默认 512。在 core/usbd_core.c 中该 buffer 被声明为USB_MEM_ALIGNX uint8_t req_data[USB_ALIGN_UP(CONFIG_USBDEV_REQUEST_BUFFER_LEN, CONFIG_USB_ALIGN_SIZE)];当 setup 请求的wLength或实际传输长度超过该值时协议栈会按溢出处理如标准请求描述符长度检查。绝大多数标准请求Get Descriptor 等都远小于 512因此默认值基本够用若你的类驱动需要更大的控制传输载荷再按需增大同时注意该 buffer 是静态分配的会占用 RAM。CONFIG_USBDEV_SETUP_LOG_PRINTsetup 包 dump默认关闭。开启后当标准/类/厂商请求处理出错时协议栈会通过 core/usbd_core.c 中的usbd_print_setup打印完整的 setup 包字段Setup: bmRequestType 0x00, bRequest 0x06, wValue 0x0200, wIndex 0x0000, wLength 0x0012这是调试设备枚举失败 / 主机发来意外请求类问题的利器排查阶段建议打开正式发布关闭。CONFIG_USBDEV_DESC_CHECK 与 CONFIG_USBDEV_TEST_MODECONFIG_USBDEV_DESC_CHECK官方文档明确标注暂时没有实现模板中也只是注释预留不要依赖它做描述符校验。CONFIG_USBDEV_TEST_MODE使能或关闭 USB test mode高速信号质量测试模式配合 USBCV 等一致性测试工具使用。开启后协议栈会响应 SET_FEATURE(TEST_MODE) 请求见 core/usbd_core.c 中CONFIG_USBDEV_TEST_MODE相关分支。日常开发保持关闭。MSC 类驱动配置缓冲区、字符串与读写调度MSCMass Storage Class是设备协议栈中配置项最多的类直接影响 U 盘读写的速度与实时性。CONFIG_USBDEV_MSC_MAX_BUFSIZEMSC 缓存最大长度默认 512 字节。该值直接决定 class/msc/usbd_msc.c 中block_buffer的大小USB_MEM_ALIGNX uint8_t block_buffer[CONFIG_USBDEV_MSC_MAX_BUFSIZE];缓存越大USB 速度越高——因为存储介质如 SD 卡多 block 连续读写的吞吐远高于单 block 读写。文档给出的调整建议默认 512如果介质是 flash建议改成 4K缓存大小必须是介质 block size 的整数倍否则协议栈会在初始化时打印CONFIG_USBDEV_MSC_MAX_BUFSIZE must be a multiple of block size并进入死循环见 class/msc/usbd_msc.c 末尾的容量检查逻辑。CONFIG_USBDEV_MSC_MANUFACTURER_STRING / PRODUCT_STRING / VERSION_STRINGSCSI 查询字符串这三个宏分别对应 SCSI INQUIRY 响应中的厂商、产品与版本字段。在 class/msc/usbd_msc.c 中直接拷贝到 INQUIRY 数据区memcpy(inquiry[8], CONFIG_USBDEV_MSC_MANUFACTURER_STRING, strlen(CONFIG_USBDEV_MSC_MANUFACTURER_STRING)); memcpy(inquiry[16], CONFIG_USBDEV_MSC_PRODUCT_STRING, strlen(CONFIG_USBDEV_MSC_PRODUCT_STRING)); memcpy(inquiry[32], CONFIG_USBDEV_MSC_VERSION_STRING, strlen(CONFIG_USBDEV_MSC_VERSION_STRING));模板默认厂商与产品为空串、版本为0.01。注意各字段有固定字节位宽厂商 8 字节起、产品 16 字节起、版本 32 字节起字符串过长会越界应控制在字段容量内。CONFIG_USBDEV_MSC_POLLING裸机轮询模式开启后usbd_msc_sector_read和usbd_msc_sector_write的介质操作不再在中断中执行而是通过事件标志由主循环处理。使用方式是在while(1)中调用 class/msc/usbd_msc.h 声明的void usbd_msc_polling(uint8_t busid);该模式专为裸机设计无 RTOS 时避免在中断里做耗时介质读写。配套模板注释也提示move msc read write from isr to while(1), you should call usbd_msc_polling in while(1)。CONFIG_USBDEV_MSC_THREADMSC 读写线程默认关闭。默认情况下usbd_msc_sector_read/usbd_msc_sector_write在中断中执行开启 OS 后建议开启此宏让介质读写转入专用线程。开启后协议栈在 class/msc/usbd_msc.c 中创建消息队列与线程中断只负责投递事件g_usbd_msc[busid].usbd_msc_thread usb_osal_thread_create(usbd_msc, CONFIG_USBDEV_MSC_STACKSIZE, CONFIG_USBDEV_MSC_PRIO, usbdev_msc_thread, ...);CONFIG_USBDEV_MSC_PRIO / CONFIG_USBDEV_MSC_STACKSIZE线程参数MSC 读写线程的优先级默认 4数值越小优先级越高堆栈默认 2K 字节。若介质读写路径调用较深的文件系统栈可适当调大堆栈若系统对读盘实时性敏感可调高优先级数值调小。补充关联宏 CONFIG_USBDEV_MSC_MAX_LUN模板中还定义了默认 1 的 LUN 数量CONFIG_USBDEV_MSC_MAX_LUN它与CONFIG_USBDEV_MSC_MAX_BUFSIZE共同决定 MSC 内部结构体大小多 LUN 场景下需同步调整见 class/msc/usbd_msc.c 中scsi_blk_size[CONFIG_USBDEV_MSC_MAX_LUN]的定义。RNDIS 类驱动配置网络帧与控制响应RNDISRemote NDIS用于把设备模拟成 USB 网卡其配置集中在 class/wireless/usbd_rndis.c。CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZERNDIS 控制传输最大接收和发送长度。最小长度由 RNDIS options list 决定默认要大于等于 156。协议栈对此做了强制下限保护#if CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 #undef CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE #define CONFIG_USBDEV_RNDIS_RESP_BUFFER_SIZE 156 #endifCONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZERNDIS 以太网帧的最大长度默认 1580协议栈同样有小于 1580 则强制回退的保护。该值同时决定了设备端 RX/TX buffer 大小与上报给主机的MaxTransferSize、MaxPacketsPerTransferCONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE / 1580见 class/wireless/usbd_rndis.c。模板注释提示 rndis transfer buffer 需为(1536 44)的倍数1580 正是 153644。CONFIG_USBDEV_RNDIS_VENDOR_ID / CONFIG_USBDEV_RNDIS_VENDOR_DESCRNDIS 查询响应RNDIS_QUERY OID 0x00010101 厂商信息中上报的厂商 ID 与描述字符串默认分别为0x0000ffff与CherryUSB主机端 lwip/网络管理工具可读到。某些 Windows 驱动对厂商 ID 有识别要求可按需修改。CONFIG_USBDEV_RNDIS_USING_LWIPRNDIS 与 lwip 接口的对接开关。开启后 class/wireless/usbd_rndis.c 会以USB_NOCACHE_RAM_SECTION方式分配g_rndis_rx_buffer/g_rndis_tx_buffer并接入 lwip 的 netif 收发回调不使用 lwip 时如对接裸机网络栈可关闭。模板默认开启同时默认开启 CDC ECM 的 lwip 对接宏CONFIG_USBDEV_CDC_ECM_USING_LWIP。主机协议栈 CONFIG主机协议栈的配置分为容量/数量类决定 RAM 占用与线程/超时类决定运行行为两大部分。拓扑容量参数支持多少 hub、接口与端点以下参数决定了支持的最大外部 hub 数量、接口数、每个接口的端点数和 altsetting 数量更改此值会影响 RAM 大小建议根据实际情况调整#define CONFIG_USBHOST_MAX_RHPORTS 1 #define CONFIG_USBHOST_MAX_EXTHUBS 1 #define CONFIG_USBHOST_MAX_EHPORTS 4 #define CONFIG_USBHOST_MAX_INTERFACES 6 #define CONFIG_USBHOST_MAX_INTF_ALTSETTINGS 1 #define CONFIG_USBHOST_MAX_ENDPOINTS 4这些宏直接决定了 core/usbh_core.h 中核心数据结构数组维度的大小CONFIG_USBHOST_MAX_EXTHUBS 1与CONFIG_USBHOST_MAX_EHPORTS构成 setup 缓冲数组维度core/usbh_core.c 中g_setup_buffer[CONFIG_USBHOST_MAX_BUS][CONFIG_USBHOST_MAX_EXTHUBS 1][CONFIG_USBHOST_MAX_EHPORTS]CONFIG_USBHOST_MAX_INTERFACES决定每个配置描述符最多可解析的接口数struct usbh_configuration.intf[]CONFIG_USBHOST_MAX_INTF_ALTSETTINGS决定每接口的 altsetting 数量struct usbh_interface.altsetting[]CONFIG_USBHOST_MAX_ENDPOINTS决定每个 altsetting 内端点描述符数组大小struct usbh_interface_altsetting.ep[]CONFIG_USBHOST_MAX_EHPORTS同时决定每个根或外部hub 下挂接的子端口数struct usbh_hubport.child[]。在 core/usbh_core.c 的描述符解析流程中一旦枚举到的设备超过这些上限如接口数 CONFIG_USBHOST_MAX_INTERFACES、端点 CONFIG_USBHOST_MAX_ENDPOINTS、altsetting CONFIG_USBHOST_MAX_INTF_ALTSETTINGS解析会直接中止。因此插入复杂复合设备多接口、多配置时若枚举失败应优先排查这些容量宏是否过小。模板默认值MAX_INTERFACES 8、MAX_INTF_ALTSETTINGS 2比文档示例稍大属于通用折中对 RAM 敏感的产品应按实际接入的设备类型精确裁剪。类驱动数量参数支持几路 class 实例以下参数决定支持的类驱动实例数目同样影响 RAM#define CONFIG_USBHOST_MAX_SERIAL_CLASS 4 #define CONFIG_USBHOST_MAX_HID_CLASS 4 #define CONFIG_USBHOST_MAX_MSC_CLASS 2 #define CONFIG_USBHOST_MAX_AUDIO_CLASS 1 #define CONFIG_USBHOST_MAX_VIDEO_CLASS 1例如CONFIG_USBHOST_MAX_MSC_CLASS 2表示同一时刻最多挂载 2 个 U 盘每个实例都有独立的 CBW/CSW 缓冲见 class/msc/usbh_msc.c 中g_msc_cbw_csw[msc_class-sdchar - a]的数组设计。若你的产品只接一个 USB 摄像头或一个串口芯片把对应数量收小即可显著节省 RAM若需要同时挂多个同类设备则必须调大。模板中还预留了CONFIG_USBHOST_MAX_XBOX_CLASS等扩展项可按需放开注释。CONFIG_USBHOST_PSC_PRIO / CONFIG_USBHOST_PSC_STACKSIZE插拔线程参数主机插拔hub 轮询线程的优先级默认 0数值越小优先级越高、堆栈默认 2K 字节。该线程在 class/hub/usbh_hub.c 中创建bus-hub_thread usb_osal_thread_create(thread_name, CONFIG_USBHOST_PSC_STACKSIZE, CONFIG_USBHOST_PSC_PRIO, usbh_hub_thread, bus);由于插拔线程负责设备连接/断开检测若系统中插拔响应迟钝可调高其优先级。此外仓库中各类驱动线程如usbh_msc_thread、usbh_hid_thread、各类网卡 RX 线程均以CONFIG_USBHOST_PSC_PRIO 1创建见 demo/usb_host.c、platform/lwip/usbh_lwip.c即所有类驱动线程的优先级相对插拔线程整体平移——调整CONFIG_USBHOST_PSC_PRIO会影响主机栈全部线程的优先级排布。注意部分平台移植如 port/pusb2/freertos/usb_config.h将堆栈调大到了 8K多控制器CONFIG_USBHOST_MULT_HC或复杂拓扑场景可参考。CONFIG_USBHOST_REQUEST_BUFFER_LEN主机控制传输缓冲控制传输能够接收或发送的最大长度默认 512。主机端 EP0 缓冲在 core/usbh_core.c 中声明USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t ep0_request_buffer[CONFIG_USBHOST_MAX_BUS][USB_ALIGN_UP(CONFIG_USBHOST_REQUEST_BUFFER_LEN, CONFIG_USB_ALIGN_SIZE)];配置描述符解析前会先校验wTotalLength是否超出该值if (wTotalLength CONFIG_USBHOST_REQUEST_BUFFER_LEN) { USB_LOG_ERR(wTotalLength %d is overflow, default is %d\r\n, ...); }因此若你的主机需要枚举描述符总长超过 512 字节的复杂设备多接口复合设备常接近此上限应适当调大该宏。CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT 与 CONFIG_USBHOST_MSC_TIMEOUT超时控制CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT控制传输发送/接收的超时时间默认 500 ms。主机端所有控制传输usbh_control_transfer及其 URB 填充见 core/usbh_core.c都使用该值。响应慢的设备如冷启动的某些 U 盘主控若频繁控制传输超时可适当增大。CONFIG_USBHOST_MSC_TIMEOUTMSC 读写传输的超时时间默认 5 s模板中为5000毫秒。SCSI 命令TEST UNIT READY、REQUEST SENSE、INQUIRY、READ CAPACITY、READ10/WRITE10 等都通过usbh_bulk_cbw_csw_xfer(..., CONFIG_USBHOST_MSC_TIMEOUT)执行见 class/msc/usbh_msc.c。当外接机械硬盘或低速 U 盘出现读卡死时优先调大此值。配置实战从哪里改、怎么改修改入口直接改头文件将 cherryusb_config_template.h 复制为工程的usb_config.h所有宏集中在此修改。模板内每个宏都带中文/英文注释是查阅默认值的第一手资料。RT-Thread menuconfig通过 Kconfig.rtt 图形化配置其中包含CONFIG_USBDEV_MSC_MAX_BUFSIZE、CONFIG_USBHOST_REQUEST_BUFFER_LEN、CONFIG_USBHOST_CONTROL_TRANSFER_TIMEOUT、CONFIG_USBHOST_PSC_PRIO、CONFIG_USBHOST_PSC_STACKSIZE等选项配置结果由 Kconfig 生成宏定义。按移植层覆盖各移植平台自带的 tests/hpmicro/inc/usb_config.h、port/pusb3/freertos/usb_config.h 等文件展示了不同芯片/平台对默认值的调整方式可作为参考模板。典型调优场景场景建议调整裸机跑 MSC无 RTOS开启CONFIG_USBDEV_MSC_POLLING在主循环调用usbd_msc_polling(busid)带 RTOS 跑 MSC介质为 SD 卡开启CONFIG_USBDEV_MSC_THREADCONFIG_USBDEV_MSC_MAX_BUFSIZE设为 block size如 512/1024的整数倍追求速度可增大到 4K 以上介质为 NOR/NAND flashCONFIG_USBDEV_MSC_MAX_BUFSIZE改为 4Kflash 擦写页/块粒度并保证是 block size 整数倍带 cache 的 MCU如部分 ARM Cortex-M 平台优先用USB_NOCACHE_RAM_SECTION放置 buffer无法使用 nocache ram 时开启CONFIG_USB_DCACHE_ENABLE并将CONFIG_USB_ALIGN_SIZE设为 32/64使用 EHCI 主机控制器即使开启 dcache 维护内部描述符区仍需 nocache ram文档明确要求枚举复杂复合设备失败检查并调大CONFIG_USBHOST_REQUEST_BUFFER_LEN、CONFIG_USBHOST_MAX_INTERFACES、CONFIG_USBHOST_MAX_ENDPOINTS、CONFIG_USBHOST_MAX_INTF_ALTSETTINGS同时挂多个同类设备调大对应CONFIG_USBHOST_MAX_XXX_CLASSserial/hid/msc/audio/video设备端排查枚举失败打开CONFIG_USBDEV_SETUP_LOG_PRINT观察 setup 包 dump将CONFIG_USB_DBG_LEVEL提到USB_DBG_LOGUSB 网卡RNDIS/CDC ECM性能不佳设备端调大CONFIG_USBDEV_RNDIS_ETH_MAX_FRAME_SIZE主机端按模板注释将CONFIG_USBHOST_RNDIS_ETH_MAX_RX_SIZE等调整到大于 TCP 接收窗口2K~16K调参时的 RAM 预算意识主机协议栈的所有容量宏都对应编译期静态数组改动直接影响.bss/.data大小CONFIG_USBHOST_MAX_INTERFACES、CONFIG_USBHOST_MAX_ENDPOINTS、CONFIG_USBHOST_MAX_INTF_ALTSETTINGS决定接口/端点描述符结构体数组CONFIG_USBHOST_MAX_SERIAL_CLASS等决定类驱动实例缓冲CONFIG_USBHOST_REQUEST_BUFFER_LEN决定 EP0 缓冲CONFIG_USBDEV_REQUEST_BUFFER_LEN与CONFIG_USBDEV_MSC_MAX_BUFSIZE分别决定设备端 EP0 与 MSC 块缓冲。文档和模板反复强调建议根据实际情况更改即不要盲目使用大值——在 RAM 紧张的芯片上应精确统计实际接入的设备拓扑与类实例数量后按需裁剪。小结CherryUSB 的配置体系层次清晰通用 CONFIG 管好日志与数据一致性这条基线设备端 CONFIG 聚焦 EP0 与 MSC/RNDIS 类驱动的缓冲与调度主机端 CONFIG 则通过容量宏精确刻画拓扑与类实例的上限、通过线程与超时宏控制运行行为。所有默认值都集中在 cherryusb_config_template.h官方说明见 docs/zh/api/api_config.rst两者结合源码core/usbd_core.c、core/usbh_core.c、class/msc/usbd_msc.c、class/wireless/usbd_rndis.c 等即可做到按需裁剪、精准调优在功能、性能与 RAM 占用之间取得平衡。赞分享嵌入式驱动开发物联网【免费下载链接】CherryUSBCherryUSB is a tiny and beautiful, high performance and portable USB host and device stack for embedded system with USB IP项目地址https://gitcode.com/gh_mirrors/ch/CherryUSB点击查看免费下载相关推荐CherryUSB usb_config.h 配置详解通用、设备协议栈与主机协议栈宏参数完整指南CherryUSB usb_config.h 配置详解通用、设备协议栈与主机协议栈宏参数完整指南 CherryUSB 的所有行为都由一个配置头文件 usb_c嵌入式驱动开发物联网CherryUSB嵌入式USB协议栈构建高效USB设备与主机的终极指南CherryUSB嵌入式USB协议栈构建高效USB设备与主机的终极指南 还在为嵌入式系统中复杂的USB通信而烦恼吗CherryUSB提供了一个轻量级、可移植嵌入式驱动开发物联网CherryUSB嵌入式USB协议栈从零构建专业级USB设备与主机应用的完整指南CherryUSB嵌入式USB协议栈从零构建专业级USB设备与主机应用的完整指南 在嵌入式系统开发中USB接口的实现往往是最具挑战性的任务之一。传统的USB嵌入式驱动开发物联网上一篇Radix Primitives react-context-menu 2.3.x 演进全解析版本变更、受控状态与源码实现深度剖析下一篇如何解决MKRingProgressView的10个常见问题从安装到高级定制完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考