深入解析STM32F103R6的USB与OTG_FS双模设计
1. 从两根线到智能切换STM32F103R6的USB双模设计到底是什么如果你玩过单片机肯定对串口、I2C、SPI这些通信接口不陌生。它们就像是设备之间说悄悄话的专用通道各有各的规矩。但说到USB那感觉就完全不一样了——它更像是一个万能、高速且自带“管家”的超级高速公路。我们今天要聊的STM32F103R6这颗经典的“蓝精灵”芯片它厉害的地方就在于不仅内置了这条“高速公路”还给了你一个可以随时切换角色的“收费站”这就是USB全速设备接口和USB OTG_FS的双模设计。简单来说你可以把STM32F103R6想象成一个多才多艺的演员。USB全速设备接口这个模块让它只能扮演一个固定的角色USB设备。比如你用它做一个U盘、一个鼠标或者一个自定义的传感器插到电脑上电脑是“主人”主机它就是个听话的“仆人”设备。这个模式很纯粹也很稳定是很多传统USB应用的首选。而OTG_FS模块就赋予了这颗芯片“双重人格”。OTG是“On-The-Go”的缩写直译就是“在路上”意味着它可以在没有电脑的情况下让两个设备直接对话。在这个模式下STM32F103R6既可以当“主人”主机模式去读取U盘、连接鼠标键盘也可以当“仆人”设备模式被其他主机识别。更酷的是它还能通过HNP主机协商协议和SRP会话请求协议这两个“暗号”根据连接情况自动协商谁来当主机谁来当设备。比如你用一根USB线把两个基于F103R6的开发板连起来它们自己就能商量好谁说了算完全不需要你手动设置跳线。所以这个双模设计到底适合谁呢如果你只是想做一个简单的、永远作为从设备的产品比如数据采集器、HID设备那么只用USB设备接口就足够了配置简单资源占用少。但如果你想做一个功能更灵活的产品比如既能从PC接收数据又能独立读取U盘里的配置文件或者实现两个嵌入式设备之间的直接数据交换那么OTG_FS的双重角色能力就是你的不二之选。它把选择权交给了你和你的应用场景让一个小小的微控制器也能拥有强大的连接智慧。2. 庖丁解牛深入USB与OTG_FS的硬件架构光知道它能干什么还不够我们得看看它内部是怎么搭的这样才能用好它。STM32F103R6把这两套系统都集成在了芯片内部但它们的“出身”和“职责”截然不同。2.1 USB全速设备接口一个专注的“执行者”这个模块的定位非常清晰做一个优秀的USB设备。它的硬件框图相对简洁高效。核心是一个符合USB 2.0全速12Mbps规范的设备控制器。它通过专用的D和D-这两根差分数据线与外界通信。这里有个硬件上的小细节决定了设备的身份在USB设备端如果是一个全速设备会在D线上通过一个1.5K的上拉电阻连接到3.3V如果是低速设备比如老式鼠标则电阻接在D-上。当设备插入主机时主机检测到D或D-被拉高就知道有设备接入并能识别其速度。STM32F103R6作为全速设备自然是在D上拉。这个模块与芯片内核比如Cortex-M3交互的核心是一个专用的数据缓冲区Packet Buffer。你可以把它理解为一个共享邮箱。USB外设负责与外部主机按照复杂的USB协议“握手”、打包/拆包数据、校验CRC所有这些底层脏活累活它都包了。处理好的数据它就放进这个“邮箱”CPU需要发送的数据也放到这个“邮箱”里由USB外设负责发送出去。这个“邮箱”的管理很精细。它最多可以支持16个单向端点或8个双向端点端点0控制端点默认存在。每个端点都对应一个缓冲区描述块由软件来配置告诉USB模块“我这个端点的数据放在内存的哪个地址缓冲区有多大这次要传多少字节”。当USB模块识别到主机发来的令牌包指定了地址和端点号它就会自动根据描述块去存取数据完成传输后产生中断通知CPU。整个过程CPU几乎不需要干预底层的比特流操作大大减轻了负担。ST官方提供的USB设备库就是帮我们配置好了这些描述块和处理中断让我们可以专注于应用层的数据逻辑。2.2 OTG_FS控制器一个全能的“调度中心”OTG_FS模块的硬件框图就复杂多了因为它要处理两种角色。首先在物理引脚上它除了同样有D、D-还多了一些关键信号比如ID线、VBUS感知线。ID线的电平直接决定了初始角色如果ID线接地通常通过Micro-AB插座设备初始为主机如果ID线悬空通过电阻上拉则初始为设备。VBUS是电源线在主机模式下需要芯片控制一个外部电荷泵来输出5V VBUS为外部设备供电在设备模式下则需要检测VBUS上的电压来判断是否连接到主机。其内部核心是一个支持OTG协议的完整双角色控制器。它包含两套逻辑一套主机控制器Host Controller和一套设备控制器Device Controller根据当前模式启用其中之一。它的数据缓冲区管理更为先进采用了多FIFO先进先出队列的结构来优化效率。在主机模式下它内部硬件集成了一个调度器。这个调度器维护着两个请求队列一个用于处理中断传输和同步传输这类对时间要求严格的周期性请求另一个用于处理控制传输和批量传输这类非周期性请求。对应的数据RAM区也被划分为三块一个公共的接收FIFO一个周期性发送FIFO一个非周期性发送FIFO。这种硬件调度和分FIFO的设计能确保音频、鼠标这类实时设备的数据流不被大文件传输阻塞非常智能。在设备模式下它的端点资源与独立的USB设备模块略有不同。它提供1个双向控制端点0以及3个IN端点设备到主机和3个OUT端点主机到设备这些端点可以灵活配置为批量、中断或同步传输。数据区管理为一个共享的接收FIFO存放所有OUT端点的数据以及最多4个专用的发送IN FIFO每个IN端点一个。专用发送FIFO的好处是应用程序可以提前把要发送的数据塞进对应端点的FIFO然后就可以去干别的事了硬件会在合适的时机自动发送减少了CPU轮询的负担。特性对比USB全速设备接口OTG_FS控制器角色仅设备 (Device)双重角色设备 (DRD)可作主机或设备协议支持USB 2.0 全速设备协议USB 2.0 全速协议 OTG 补充协议 (HNP/SRP)关键外部引脚D, D-D, D-, ID, VBUS (需外部电荷泵)端点资源最多 8个双向端点设备模式1控制端点 3 IN 3 OUT数据缓冲区管理共享Packet Buffer基于描述块多FIFO结构主机Rx, Tx-Per, Tx-NPer设备Rx, 专用Tx-IN硬件调度无主机模式下具备硬件调度器典型应用U盘、鼠标、键盘、自定义设备读卡器、手机连接、双设备直连、多功能工控设备3. 数据如何流动深入双模式下的传输机制理解了硬件结构我们再来看看数据在这两个模块里是怎么“跑”起来的。这是写出稳定USB程序的关键。3.1 设备模式下的数据传输以USB模块为例假设我们的STM32F103R6作为一个自定义的USB数据采集设备。当它插入电脑后电脑主机会发起一系列枚举过程这个过程主要是通过端点0控制端点完成的由硬件自动处理大部分握手包。枚举成功后主机就知道了我们设备有哪些端点每个端点支持什么传输类型。现在主机想通过端点1Bulk OUT给我们发送一条配置命令。流程是这样的主机发起主机发送一个OUT令牌包指定地址和端点1紧接着发送数据包。硬件处理STM32的USB模块识别到这个令牌包是属于已配置的端点1的它就会自动将数据包接收下来存放到端点1对应的缓冲区描述块所指向的专用数据缓冲区里。通知CPU数据接收完毕可能是一个完整的数据包或者是一个短包表示传输结束USB模块会置位一个状态标志并可能产生一个USB全局中断或端点1专用中断。软件响应我们的中断服务程序ISR被调用。在ISR里我们首先读取USB模块的状态寄存器发现是端点1的OUT事务完成了。数据搬运我们根据事先设置好的缓冲区描述知道数据被放在内存的哪个位置。然后我们从那个内存地址把命令数据读出来进行处理。缓冲区复位处理完后我们需要通过软件“使能”该端点缓冲区准备接收下一个数据包。硬件会自动更新缓冲区状态等待下一次传输。发送数据IN事务的过程类似只是方向相反我们把要上传的传感器数据写入端点2Bulk IN的发送缓冲区然后“使能”发送。当主机轮询到端点2并发送IN令牌包时硬件会自动将缓冲区里的数据打包发送出去完成后中断通知CPUCPU就可以准备下一包数据了。注意这里说的“使能”缓冲区在ST的库函数里通常体现为设置USB_COUNTn_TX或USB_COUNTn_RX寄存器以及操作USB_EPnR寄存器的STAT_TX/STAT_RX位。库函数帮我们封装了这些底层操作。3.2 主机模式下的数据传输OTG_FS当OTG_FS工作在主机模式下去读取一个U盘时角色完全反转STM32变成了主动方。这时OTG_FS内部的硬件调度器就大显身手了。假设我们要从U盘的批量OUT端点读取数据。这个过程不是“中断驱动”而是“事务调度”创建事务我们的应用程序决定要读取数据。它不会直接操作硬件而是通过驱动库向OTG_FS的主机通道比如通道1提交一个“事务请求”。这个请求包含了设备地址、端点号、端点类型Bulk OUT、数据缓冲区指针、要读取的数据长度等信息。入队调度这个事务请求被放入非周期性请求队列因为批量传输是非周期性的。硬件调度OTG_FS的调度器硬件按照USB的帧/微帧节奏1ms/125us开始工作。当轮到处理非周期性队列时它会取出我们提交的请求。执行事务调度器硬件自动生成并发送对应的OUT令牌包、数据包主机发送数据时或IN令牌包主机接收数据时。对于我们的读请求它会发送IN令牌包。接收与存储U盘设备回应数据包OTG_FS的PHY层接收数据硬件自动将其存放到接收FIFO中。完成通知整个事务可能包含多个数据包直到传输完成或遇到短包完成后硬件会产生一个主机通道中断。数据处理我们的中断服务程序根据通道号知道是哪个请求完成了。然后我们从接收FIFO的特定位置由驱动库管理把数据搬运到我们自己的应用程序缓冲区。整个过程中最复杂的主机协议调度、令牌生成、超时重试、错误处理都由硬件完成。我们只需要关注“发起请求”和“处理完成”这两个环节。对于同步或中断传输事务请求会被放入周期性请求队列调度器会保证在每个帧/微帧的特定时间点执行它们以满足实时性要求。这种硬件级的调度比用软件模拟USB主机要可靠和高效得多。4. 角色切换的魔法HNP与SRP协议实战解析OTG最精髓的功能就是角色切换。这依赖于两个协议SRP和HNP。我们用一个实际场景来理解一个带OTG功能的智能设备A-Device和一个U盘B-Device用OTG线连接。SRP会话请求协议这是关于“谁来供电”的协议。初始状态下作为A-Device的智能设备ID线接地是主机它应该提供VBUS电源。但为了省电它可能一开始没开VBUS。U盘B-Device想被识别但它自己没电。这时U盘可以通过先驱动数据线D或D-再驱动VBUS线的方式向主机发送一个“SRP请求”相当于说“嘿醒醒给我供个电” A-Device检测到这个请求后就会打开它的电荷泵输出VBUS会话开始。HNP主机协商协议这是关于“谁当主机”的协议。会话开始后A-Device是主机U盘是设备。但A-Device可能只是个手机它更想当设备让U盘当主机吗通常不会这个例子中HNP可能不发生。但如果是两个智能设备比如一个开发板和一个手机连接情况就不同了。假设初始是开发板A为主机手机B为设备。枚举完成后开发板的软件可以决定“我不想当主机了让手机来当吧。” 它会通过设置OTG控制寄存器主动断开作为主机的连接拉低D/D-。手机检测到连接断开后根据OTG协议它知道自己可以作为主机于是它通过上拉电阻宣告自己成为主机然后重新发起枚举过程这次手机成了主机开发板成了设备。这个过程完全是硬件和底层协议栈自动完成的对上层应用程序可能是透明的。在STM32的OTG_FS驱动库中这些协议都有相应的函数和回调函数来处理。例如在设备初始化时我们需要使能SRP和HNP能力。当检测到SRP请求时库会调用一个回调函数HAL_OTG_xxx_SessionRequestCallback我们在这个回调里启动VBUS电源即可。对于HNP库函数会自动处理状态切换并通过HAL_OTG_xxx_RoleChangedCallback通知应用程序当前的角色发生了变化。我们只需要根据新的角色主机或设备重新初始化对应的协议栈如主机类的MSC、HID或设备类的CDC、MSC即可。5. 从零开始基于CubeMX与HAL库的双模式快速部署理论说了这么多不上手试试都是空谈。ST的CubeMX和HAL库极大简化了我们的开发。下面我就以创建一个既能当USB串口设备CDC又能当U盘主机MSC Host的双角色工程为例带大家走一遍流程。5.1 硬件设计与CubeMX基础配置首先硬件上如果你要使用OTG_FS的主机模式必须外接一个VBUS电荷泵芯片比如常用的TPS2051B。将电荷泵的输入接5V输出接USB口的VBUS引脚使能脚连接到STM32的一个GPIO如PA8由STM32控制其开关。OTG_FS的ID引脚通常连接到Micro-AB插座的ID脚D和D-连接到插座对应引脚。打开CubeMX选择你的STM32F103R6型号。配置时钟确保系统时钟配置正确USB OTG FS模块的时钟需要是48MHz。通常由PLL提供。激活OTG_FS在Connectivity下找到USB_OTG_FS。模式选择为Device_Only或Host_Only可以固定角色。要实现双角色我们需要选择OTG_FS此时ID引脚和VBUS引脚的功能会自动配置。配置GPIO找到控制电荷泵使能的那个GPIO如PA8设置为GPIO_Output并给一个初始低电平VBUS关闭。中间件配置这是关键USB_DEVICE在Middleware区域激活USB_DEVICE。Class选择Communication Device Class (Virtual Port Com)这样我们就创建了一个USB转串口设备。USB_HOST同样在Middleware区域激活USB_HOST。Class选择Mass Storage Class (MSC)这样我们的主机就能识别U盘。生成工程设置好工程路径和工具链Keil/IAR等生成代码。5.2 设备模式CDC代码剖析生成的代码中设备侧的代码主要在Core/Src/usb_device.c和App目录下的usbd_cdc_if.c中。在usbd_cdc_if.c里我们需要关注几个关键函数CDC_Control_FS处理主机发来的控制请求比如设置波特率。CDC_Receive_FS这是一个回调函数。当主机通过虚拟串口发送数据过来时USB设备库在接收完成后会自动调用它。参数Buf就是接收到的数据指针Len是长度。我们通常在这里把数据拷贝到自己的环形缓冲区并设置一个信号量通知主程序。static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) { /* 将数据拷贝到应用缓冲区 */ memcpy(user_rx_buffer, Buf, *Len); user_rx_len *Len; /* 通知主循环有数据到达 */ data_received_flag 1; /* 重新使能OUT端点准备接收下一包数据 */ USBD_CDC_SetRxBuffer(hUsbDeviceFS, Buf[0]); USBD_CDC_ReceivePacket(hUsbDeviceFS); return (USBD_OK); }CDC_Transmit_FS这是我们主动发送数据的函数。把要发送的数据数组和长度传给它它会把数据填入发送缓冲区等待主机来取。uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) { uint8_t result USBD_OK; /* 调用库函数发送 */ result USBD_CDC_TransmitPacket(hUsbDeviceFS, Buf, Len); /* 注意这里是非阻塞的发送由USB库在后台完成 */ return result; }5.3 主机模式MSC代码剖析与角色切换逻辑主机侧的代码主要在USB_HOST/App目录下的usb_host.c和usbh_diskio.c如果你使用了FatFs中。主机的工作是枚举和轮询驱动的。在main.c的主循环里我们需要不断调用MX_USB_HOST_Process()函数这个函数会驱动主机状态机处理连接、枚举、类驱动加载等所有事情。角色切换是动态发生的。当OTG_FS检测到ID线状态变化或HNP协议触发角色变化时HAL库会先停用当前的模式主机或设备然后触发角色改变回调。我们需要在这个回调函数里进行模式的重置。void HAL_OTG_FS_RoleChangedCallback(USB_OTG_GlobalTypeDef *USBx, uint32_t role) { if(role USB_OTG_ROLE_HOST) { // 当前角色是主机 printf(Switched to HOST mode.\r\n); // 确保设备栈已停用 MX_USB_DEVICE_DeInit(); // 重新初始化主机栈 MX_USB_HOST_Init(); } else if (role USB_OTG_ROLE_DEVICE) { // 当前角色是设备 printf(Switched to DEVICE mode.\r\n); // 确保主机栈已停用 MX_USB_HOST_DeInit(); // 重新初始化设备栈 MX_USB_DEVICE_Init(); } }注意MX_USB_HOST_DeInit()和MX_USB_DEVICE_DeInit()需要我们自己根据生成的代码来编写主要就是调用HAL_xxx_DeInit函数来反初始化相关外设和句柄。在实际项目中你可能会根据ID引脚的电平使用HAL_GPIO_ReadPin读取来决定初始化的模式而不是同时初始化两个。例如检测到ID为低连接了OTG线缆的A端则初始化为主机模式并打开VBUS检测到ID为高或浮空则初始化为设备模式。5.4 避坑指南我踩过的那些雷时钟配置是生命线USB对48MHz时钟的精度要求很高。务必检查你的晶振配置、PLL倍频分频设置确保给USB模块的时钟是精确的48MHz。时钟不准会导致枚举失败或通信不稳定。电源与VBUS管理主机模式下VBUS必须由你控制的电荷泵提供。一定要在检测到设备连接或SRP请求后再开启VBUS并在设备断开后及时关闭。直接上电就开VBUS可能导致短路或设备识别异常。中断优先级USB中断OTG_FS中断通常需要较高的优先级确保它能及时响应。但也要注意如果使用了USB主机大容量存储并搭配文件系统如FatFs文件系统的读写操作可能在中断回调中进行要避免优先级嵌套过深或死锁。缓冲区大小USB设备端的缓冲区大小在usbd_conf.h中通过APP_RX_DATA_SIZE和APP_TX_DATA_SIZE定义。如果做高速数据流传输一定要设大一点否则会丢包。OTG主机端的FIFO大小在USBH_CONF.h中配置也需要根据同时连接的设备数量和传输类型进行调整。双模式切换的延迟切换角色特别是HNP触发的切换需要时间包括协议处理时间和软件重新初始化栈的时间。你的应用程序逻辑需要能容忍这个延迟不要假设连接状态是瞬间稳定的。库版本与兼容性ST的HAL库和USB库在持续更新。如果你从旧项目迁移代码或者混用不同版本的CubeMX生成的代码可能会遇到函数名变更、结构体成员变化等问题。最好基于同一个较新的CubeMX版本和HAL库版本进行开发。最后调试USB和OTG一个USB协议分析仪如Saleae、Beagle等是神器它能让你看到总线上的每一个数据包对于排查枚举失败、协议错误等问题有奇效。当然也可以充分利用ST-Link的printf重定向功能在关键状态切换处打印日志这是最经济实用的调试手段。

相关新闻

PyQt-Fluent-Widgets:打造现代化Fluent Design风格GUI应用的全方位解决方案

PyQt-Fluent-Widgets:打造现代化Fluent Design风格GUI应用的全方位解决方案

PyQt-Fluent-Widgets:打造现代化Fluent Design风格GUI应用的全方位解决方案 【免费下载链接】PyQt-Fluent-Widgets A fluent design widgets library based on C Qt/PyQt/PySide. Make Qt Great Again. 项目地址: https://gitcode.com/gh_mirrors/py/PyQt-Fluent-…

2026/7/6 0:38:19 阅读更多 →
7个高效技巧:Unity资源提取与管理完全指南

7个高效技巧:Unity资源提取与管理完全指南

7个高效技巧:Unity资源提取与管理完全指南 【免费下载链接】AssetStudio AssetStudio is a tool for exploring, extracting and exporting assets and assetbundles. 项目地址: https://gitcode.com/gh_mirrors/as/AssetStudio 在游戏开发和资源管理领域&am…

2026/7/5 4:20:54 阅读更多 →
Windows系统部署BERT文本分割模型:Anaconda虚拟环境配置教程

Windows系统部署BERT文本分割模型:Anaconda虚拟环境配置教程

Windows系统部署BERT文本分割模型:Anaconda虚拟环境配置教程 你是不是也想在Windows电脑上跑一跑BERT模型,试试文本分割的效果?但一看到复杂的Python环境、各种版本冲突的依赖库,是不是就有点头疼了? 别担心&#xf…

2026/7/5 15:30:16 阅读更多 →

最新新闻

Claude Code 实战:AI 结对编程如何真正提效,从简历表达讲到项目复盘

Claude Code 实战:AI 结对编程如何真正提效,从简历表达讲到项目复盘

聊《Claude Code 实战:AI 结对编程如何真正提效,从简历表达讲到项目复盘》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要这篇面向正在评估 Claude Code 的开发者,但不会把“…

2026/7/6 0:39:26 阅读更多 →
PyTorch CRF 实战:BERT-CRF 命名实体识别 F1 值提升 5% 的 3 个关键点

PyTorch CRF 实战:BERT-CRF 命名实体识别 F1 值提升 5% 的 3 个关键点

PyTorch CRF 实战:BERT-CRF 命名实体识别 F1 值提升 5% 的 3 个关键点在自然语言处理领域,命名实体识别(NER)一直是一项基础而重要的任务。随着预训练语言模型如BERT的广泛应用,基于BERT的序列标注模型已成为NER的主流…

2026/7/6 0:37:25 阅读更多 →
终极指南:5分钟快速上手浏览器端人体姿态搜索工具

终极指南:5分钟快速上手浏览器端人体姿态搜索工具

终极指南:5分钟快速上手浏览器端人体姿态搜索工具 【免费下载链接】pose-search x6ud.github.io/pose-search 项目地址: https://gitcode.com/gh_mirrors/po/pose-search 想要在浏览器中实现专业级的人体姿态识别与动作搜索功能吗?pose-search是一…

2026/7/6 0:37:25 阅读更多 →
74HC32与PIC18F45K50实现高效键盘管理方案

74HC32与PIC18F45K50实现高效键盘管理方案

1. 为什么需要74HC32配合PIC18F45K50管理键盘?在嵌入式系统设计中,IO资源永远是稀缺品。传统2x2矩阵键盘需要占用4个IO口(2行2列),而采用74HC32或门芯片后,仅需2个IO即可实现4个按键的独立检测——这正是该…

2026/7/6 0:35:25 阅读更多 →
openEuler/QoS-Deployment-Test:从零开始编写自定义测试用例的完整指南

openEuler/QoS-Deployment-Test:从零开始编写自定义测试用例的完整指南

openEuler/QoS-Deployment-Test:从零开始编写自定义测试用例的完整指南 【免费下载链接】QoS-Deployment-Test Docker-based openEuler Online-Offline Co-scheduling Test Suite. 项目地址: https://gitcode.com/openeuler/QoS-Deployment-Test 前往项目官网…

2026/7/6 0:35:25 阅读更多 →
故障复盘——让失败“变成财富“

故障复盘——让失败“变成财富“

故障复盘——让失败"变成财富" 你有没有过考试错题本? 生活场景:错题本的作用 没有错题本 你考试考砸了: 错了3道题 订正了 忘了为什么错 下次考类似的,还是错 没有复盘,错误会重复。 有错题本 你考试考砸了: 错题记到本子上 分析错误原因 总结解题方法 …

2026/7/6 0:35:25 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻