STM32F411 USART串口配置实战:从零搭建调试打印系统
1. 从零开始为什么我们需要串口调试打印刚拿到一块STM32F411开发板看着密密麻麻的引脚和芯片是不是有点无从下手我刚开始学嵌入式的时候也是这样最头疼的就是程序跑起来但不知道它里面到底发生了什么。是卡在初始化了还是变量算错了总不能每次都点个LED灯来猜吧。这时候一个能打印信息的“嘴巴”就显得至关重要了。对于STM32来说这个“嘴巴”最常用、最方便的就是USART串口。你可以把串口想象成芯片和电脑之间的一条“电话线”。STM32通过这根线可以把程序运行时的状态、变量的值、调试信息“说”给电脑听。我们在电脑上用一个串口助手软件比如SecureCRT、Putty或者MobaXterm就能实时看到这些信息。这比单纯看灯闪烁要直观一万倍绝对是嵌入式开发从入门到精通的必备技能。STM32F411这款芯片性能不错性价比高很多开发板都在用。它内部集成了多个USART模块我们这次就用最常用的USART1来实战。它的发送TX和接收RX引脚固定在了PA9和PA10上接线非常明确。整个流程其实就像搭积木先给积木块供电配置时钟再把正确的积木块放到正确的位置配置GPIO复用然后设置积木块之间沟通的规则配置USART参数最后教会积木块说我们听得懂的话重定向printf。下面我就带你一步步把这套“调试打印系统”搭起来保证你跟着做一遍就能成功看到“Hello World”。2. 工程创建与基础环境搭建2.1 创建你的第一个工程文件工欲善其事必先利其器。我们首先得在Keil MDK我这里用Keil5里创建一个新工程。打开Keil选择Project - New uVision Project...给你的工程起个名字比如STM32F411_USART_Demo选个好找的文件夹存起来。接下来是关键一步选择设备。在弹出的“Select Device for Target”窗口里找到STMicroelectronics下面的STM32F411CEU6如果你的芯片型号略有不同比如是RET6选择对应的即可。点击OK后Keil会弹出一个管理运行时环境Manage Run-Time Environment的窗口。这里我们采用标准库Standard Peripheral Library开发所以需要在Device栏下勾选StdPeriph Drivers下的GPIO和USART。当然为了后续方便Framework下的CMSIS-CORE和Device下的Startup也是必须勾选的。勾选好后点击OKKeil就会自动帮你把必要的标准库文件添加到工程里了。这时你的工程管理器里应该已经有了Device、CMSIS、StdPeriph Drivers等分组。我习惯自己整理一下在项目根目录下新建两个文件夹User和Library。把StdPeriph Drivers里相关的.c文件如stm32f4xx_gpio.c,stm32f4xx_usart.c,stm32f4xx_rcc.c的路径链接到Library文件夹实际文件还在Keil安装目录这里只是链接。然后在User文件夹里我们右键Source Group 1选择Add New Item to Group新建两个文件usart1.c和usart1.h。这就是我们即将编写串口驱动代码的地方。同样的也可以新建main.c和main.h。别忘了在Keil的Options for Target-C/C-Include Paths里把我们自己创建的User文件夹路径添加进去这样编译器才能找到我们的头文件。2.2 理解时钟树让芯片“脉搏”跳动起来在配置任何外设之前必须让芯片的时钟系统正确工作。STM32的时钟就像人的脉搏所有外设都依赖时钟信号来同步工作。STM32F411的时钟源可以来自内部RC振荡器HSI或者外部晶振HSE。为了获得更稳定、更精确的串口波特率我们通常使用外部晶振。根据你提供的原始文章开发板用的是25MHz的外部晶振。我们需要通过配置寄存器将这个25MHz的输入时钟通过锁相环PLL倍频到芯片工作的主频。原始文章里给出的配置目标是系统时钟SYSCLK96MHzAHB总线时钟HCLK96MHzAPB1低速外设时钟PCLK148MHzAPB2高速外设时钟PCLK296MHz。USART1是挂在APB2总线上的所以它的时钟源就是PCLK2也就是96MHz。这个频率会直接影响到我们后面计算波特率的准确性。虽然标准库提供了一套完善的时钟配置函数SystemInit()通常在启动文件里调用它会根据system_stm32f4xx.c中的宏定义来配置但我们最好知其然也知其所以然。你可以打开system_stm32f4xx.c文件找到SystemInit()函数和SetSysClock()函数看看里面关于PLL倍频系数、分频系数的计算。不过作为新手我们暂时可以不用深究每一步只需要确保在工程中正确定义了HSE_VALUE为2500000025MHz并且使用的标准库版本与芯片型号匹配启动时就会自动配置好这个时钟树。你可以在main函数一开始调用SystemInit()来确保时钟就绪实际上启动阶段已经调用了这是一个好习惯。3. 硬件连接与GPIO的复用模式配置3.1 硬件接线连接开发板与电脑在写代码之前先把硬件连好。我们需要一根USB转TTL串口线通常芯片是CH340、CP2102或FT232。这种线一般有四个引脚VCC、GND、TX、RX。这里有一个非常关键的坑点我踩过一定要交叉连接即开发板的TXPA9接串口线的RX开发板的RXPA10接串口线的TX。VCC接3.3V切记不要接5V可能会烧坏芯片GND接GND。接好后把USB端插到电脑上。然后在电脑上打开设备管理器查看“端口COM和LPT”一项应该能看到一个新的COM口比如“USB-SERIAL CH340 (COM3)”记下这个COM口编号。等下我们用的串口助手软件就需要选择这个端口。3.2 深入GPIO复用让引脚变身串口功能STM32的引脚功能非常强大一个引脚可以通过配置扮演多种角色这就是“复用功能”。PA9和PA10的默认功能是普通的输入输出GPIO我们要把它们变成USART1的发送和接收引脚就需要进行“复用”配置。首先就像开灯需要先打开电闸一样使用任何外设前都要先开启它的时钟。GPIOA挂载在AHB1总线上所以我们需要使能AHB1总线上GPIOA的时钟。在标准库里使用RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);这条语句来完成。接下来是重头戏配置GPIO的工作模式。很多新手在这里会迷糊为什么TX引脚要配置为复用推挽输出而RX引脚配置为复用上拉输入我们可以这样理解TX发送引脚芯片需要主动向外部“推”出高低电平信号形成数据波形。所以它必须是一个“输出”引脚。推挽输出模式能提供较强的驱动能力输出高电平和低电平都很稳定是数字信号输出的首选。RX接收引脚芯片需要从外部“读取”电平信号。所以它必须是一个“输入”引脚。加上上拉电阻内部上拉是为了让引脚在空闲时保持一个确定的高电平状态避免因外界干扰产生误判。在串口协议中空闲状态就是高电平。具体代码怎么写呢我们打开usart1.c文件先来实现GPIO配置函数#include stm32f4xx.h #include usart1.h void USART1_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; // 1. 开启GPIOA的时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 2. 将PA9引脚复用为USART1_TX GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); // 3. 将PA10引脚复用为USART1_RX GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1); // 4. 配置PA9为复用推挽输出 GPIO_InitStructure.GPIO_Pin GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF; // 复用模式 GPIO_InitStructure.GPIO_OType GPIO_OType_PP; // 推挽输出 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // 高速模式 GPIO_InitStructure.GPIO_PuPd GPIO_PuPd_NOPULL; // 不需要上拉下拉 GPIO_Init(GPIOA, GPIO_InitStructure); // 5. 配置PA10为复用上拉输入 GPIO_InitStructure.GPIO_Pin GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF; // 复用模式 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // 速度对输入模式意义不大可保持一致 GPIO_InitStructure.GPIO_PuPd GPIO_PuPd_UP; // 上拉输入 // 注意输入模式不需要配置OType GPIO_Init(GPIOA, GPIO_InitStructure); }注意看GPIO_PinAFConfig这个函数就是实现引脚功能复用的关键它告诉芯片“PA9这个引脚别当普通IO口了去连接USART1的发送模块吧”。GPIO_AF_USART1是一个预定义的宏代表USART1的复用功能编号。4. USART模块的初始化与参数详解4.1 初始化USART设置通信规则GPIO准备好之后接下来就是配置USART模块本身了。同样先开时钟USART1挂在APB2总线上所以使用RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);。USART的配置集中在初始化结构体USART_InitTypeDef里。这个过程就像和对方约定好打电话的规则用多大的声音说话波特率、说什么语言数据格式、要不要等对方回应再说下一句流控制。我们来逐一拆解void USART1_Init(uint32_t baudrate) { USART_InitTypeDef USART_InitStructure; // 调用前面写好的GPIO配置函数 USART1_GPIO_Config(); // 开启USART1的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 填充初始化结构体 USART_InitStructure.USART_BaudRate baudrate; // 波特率常用115200 USART_InitStructure.USART_WordLength USART_WordLength_8b; // 数据位8位 USART_InitStructure.USART_StopBits USART_StopBits_1; // 停止位1位 USART_InitStructure.USART_Parity USART_Parity_No; // 无奇偶校验位 USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx; // 同时使能接收和发送模式 USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None; // 无硬件流控制 // 初始化USART1 USART_Init(USART1, USART_InitStructure); // 最后使能USART1模块 USART_Cmd(USART1, ENABLE); }这个函数接收一个baudrate参数这样我们就能方便地修改波特率比如传入9600或115200。4.2 关键参数选择波特率、数据位与停止位这些参数不是随便设的必须和电脑端串口助手的设置完全一致否则收到的就是乱码。波特率 (BaudRate)这是最重要的参数表示每秒传输的符号数。常见的波特率有9600, 19200, 38400, 57600, 115200等。波特率越高传输越快但对时钟精度和线路抗干扰能力要求也越高。对于调试打印115200是个很好的平衡点速度够快兼容性也广。STM32的波特率发生器会根据你传入的值和模块的输入时钟PCLK2自动计算分频系数。如果计算出的波特率与实际有微小误差通常小于2%通信一般还是稳定的。数据位 (WordLength)表示一个字符用多少位数据来表示。ASCII码用7位就够了但通常我们用8位数据位这样可以传输0-255的任意字节数据兼容性最好。所以选择USART_WordLength_8b。停止位 (StopBits)表示一个字符帧结束的标志。通常用1位停止位USART_StopBits_1就够了。1.5位或2位停止位在某些老式设备上可能会用到。奇偶校验位 (Parity)用于简单的错误检测。如果选择奇校验或偶校验会在数据位后增加1位使得整个数据帧含校验位中“1”的个数为奇数或偶数。接收方会检查这个规律如果不符就认为传输有误。对于调试打印这种非关键应用通常选择USART_Parity_No无校验这样数据帧更短效率更高。硬件流控制 (HardwareFlowControl)包括RTS请求发送和CTS清除发送用于在数据传输过快时让接收方通知发送方暂停。我们直接用串口线连接电脑线路很短数据量也不大完全用不到这个功能所以选择USART_HardwareFlowControl_None。如果将来连接蓝牙模块、4G模块等可能会需要用到。5. 重定向printf让C库函数为我们工作5.1 揭秘fputc连接printf与串口配置好USART我们已经可以用USART_SendData(USART1, ‘A‘);这样的函数手动发送一个字符了。但这太不方便了。我们更希望能直接用printf(“Value %d\r\n”, value);这样的格式化输出函数。C语言标准库中的printf函数默认是将字符输出到标准输出通常是显示器在嵌入式环境中我们需要把它“重定向”到我们的串口上。怎么重定向呢printf底层会调用一个叫fputc的函数来输出每一个字符。我们只要在工程里重新实现覆盖这个fputc函数在里面写上通过串口发送字符的代码那么所有printf的输出就自然跑到串口去了。这就是“重定向”的本质。在usart1.c文件中添加以下代码#include stdio.h // 必须包含这个头文件 // 重定向C库函数printf到USART1 int fputc(int ch, FILE *f) { // 将字符ch发送到USART1 USART_SendData(USART1, (uint8_t)ch); // 等待发送完成。USART_FLAG_TXE标志位表示发送数据寄存器为空可以写入新数据 // 也可以等待TC发送完成标志但TXE效率更高 while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) RESET) { // 空循环等待标志位置位 } return ch; // 返回发送的字符 } // 可选重定向scanf/getchar等输入函数到USART1 int fgetc(FILE *f) { // 等待接收到数据。USART_FLAG_RXNE标志位表示接收数据寄存器非空有数据可读 while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) RESET) { // 空循环等待标志位置位 } return (int)USART_ReceiveData(USART1); // 返回接收到的字符 }这段代码就是整个调试系统的灵魂。fputc里的while循环是阻塞式等待直到上一个字符发送完毕才会发送下一个。对于调试信息输出这种方式简单可靠。如果你在中断服务函数里调用printf要注意这个等待可能会占用较长时间。5.2 解决工程设置使用微库MicroLib默认情况下Keil使用标准C库它功能全面但体积较大。为了实现我们的重定向并且减小代码体积我强烈建议在嵌入式项目中使用MicroLib。这是一个为嵌入式系统高度优化的简化C库它直接支持了我们这种fputc重定向的方式。设置方法很简单打开Options for Target-Target选项卡在右下角的Code Generation区域勾选Use MicroLIB。然后你还需要在Options for Target-Linker选项卡中取消勾选Use Memory Layout from Target Dialog如果勾选了的话以确保链接器使用我们自己的分散加载文件通常不用动。使用MicroLib后编译出的代码会小很多。6. 整合测试与实战验证6.1 编写头文件与主函数现在我们来完善usart1.h头文件它非常简单主要就是函数声明#ifndef __USART1_H #define __USART1_H #include stm32f4xx.h void USART1_GPIO_Config(void); void USART1_Init(uint32_t baudrate); #endif /* __USART1_H */接下来是main.c文件这里我们把所有功能串联起来#include stm32f4xx.h #include usart1.h #include stdio.h // 为了使用printf // 一个简单的延时函数用于闪烁LED void Delay(__IO uint32_t nCount) { for(; nCount ! 0; nCount--); } int main(void) { // 系统时钟初始化通常启动文件已调用这里显式调用确保无误 SystemInit(); // 初始化USART1波特率设置为115200 USART1_Init(115200); // 初始化一个LED灯假设连接在PC13这是很多开发板上的用户LED RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin GPIO_Pin_13; GPIO_InitStruct.GPIO_Mode GPIO_Mode_OUT; GPIO_InitStruct.GPIO_OType GPIO_OType_PP; GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_PuPd GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, GPIO_InitStruct); printf(\r\n***** USART1 Printf Demo Started *****\r\n); printf(System Clock: %ld Hz\r\n, SystemCoreClock); // 打印系统时钟频率 printf(Hello, STM32F411!\r\n); printf(This message is from your board via USART1.\r\n); uint32_t counter 0; while (1) { // 翻转LED状态 GPIO_ToggleBits(GPIOC, GPIO_Pin_13); // 通过printf发送计数信息 printf(Loop counter: %lu\r\n, counter); // 延时约1秒根据主频调整 Delay(10000000); } }6.2 编译、下载与串口助手验证代码写完了点击Keil的Rebuild按钮或按F7编译工程。确保0错误0警告。然后将开发板通过ST-Link或DAP-Link等调试器连接到电脑点击Load按钮或按F8将程序下载到芯片中。接下来打开电脑上的串口助手软件以SecureCRT为例。新建一个串口连接选择你之前在设备管理器里看到的COM口如COM3波特率设置为115200数据位8停止位1无校验无流控制。然后点击连接。最后给开发板复位或重新上电。你应该立刻在串口助手窗口看到如下信息***** USART1 Printf Demo Started ***** System Clock: 96000000 Hz Hello, STM32F411! This message is from your board via USART1. Loop counter: 0 Loop counter: 1 Loop counter: 2 ...同时开发板上的LED灯也会以大约1秒的间隔闪烁。恭喜你你的STM32F411调试打印系统已经成功运行了。7. 进阶技巧与常见问题排查7.1 提升稳定性添加接收中断与缓冲区我们上面的例子只实现了发送而且是阻塞式发送。在实际项目中我们经常需要接收数据。使用fgetc函数轮询接收会占用大量CPU资源。更好的方法是使用接收中断。当USART收到一个字节数据时会产生一个中断我们在中断服务函数里把这个字节存入一个缓冲区比如一个数组。主程序只需要定期去检查这个缓冲区里有没有新数据即可。这种方式非阻塞效率高。配置中断的步骤大致如下在USART1_Init函数中使能接收中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);在NVIC嵌套向量中断控制器中配置USART1中断的优先级并使能。编写USART1的中断服务函数void USART1_IRQHandler(void)在里面判断是否是接收中断然后读取数据USART_ReceiveData(USART1)并存入缓冲区。记得在中断服务函数里清除中断标志位。7.2 常见问题与解决方案收不到任何数据全是乱码首要检查波特率、数据位、停止位、校验位是否与串口助手设置完全一致。这是99%问题的根源。检查硬件接线TX-RX是否交叉连接GND是否共地USB转TTL模块的电压是否是3.3V检查代码中的时钟配置SystemCoreClock打印出来是多少如果是0或者不对说明系统时钟没配置成功波特率计算自然就错了。确保外部晶振频率HSE_VALUE定义正确并且启动文件正确调用了时钟配置。能收到数据但字符不对或丢失可能是波特率误差太大。虽然STM32的USART波特率发生器精度很高但如果你的外部晶振不是25MHz或者PLL配置不同计算出的实际波特率可能与目标有偏差。尝试降低波特率到9600试试。检查fputc函数中的等待标志位。如果错用了USART_FLAG_TC发送完成标志在连续发送时可能会丢失数据。使用USART_FLAG_TXE发送数据寄存器空更安全。程序下载后没反应printf没输出检查是否勾选了Use MicroLIB。检查usart1.c和usart1.h是否被正确添加到工程并参与编译。在main函数最开始加一句USART1_Init(115200);之后直接调用USART_SendData(USART1, ‘A‘);试试如果这个能收到说明硬件和基础配置是好的问题出在printf重定向或MicroLib上。代码编译通过但下载失败检查调试器连接是否正常驱动是否安装。检查Keil中Debug设置里选择的调试器型号是否正确。检查芯片是否进入了休眠模式或写保护状态尝试先进行全片擦除。这套从零搭建的串口调试系统是我在STM32开发中最依赖的工具之一。它不仅仅是打印一个“Hello World”更是你未来调试更复杂功能比如传感器数据读取、算法状态监控、网络通信协议分析的眼睛和嘴巴。一开始配置可能会遇到一些小麻烦但一旦跑通你会发现嵌入式开发的世界瞬间清晰了许多。以后无论做哪个项目第一件事可能就是先把串口打印给配好这绝对是一个事半功倍的好习惯。

相关新闻

Redis(二)实战:五大数据类型在消息队列与排行榜中的应用

Redis(二)实战:五大数据类型在消息队列与排行榜中的应用

1. 从入门到实战:为什么Redis的五大数据类型是“瑞士军刀”? 上次我们聊了Redis五大数据类型的基本操作,就像认识了工具箱里的锤子、螺丝刀、扳手。但光知道工具叫什么名字、长什么样,离真正修好家里的水管或者组装好一个书架还差…

2026/7/5 1:27:16 阅读更多 →
Qwen3-ForcedAligner-0.6B惊艳效果:中日双语演讲音频的跨语言对齐能力

Qwen3-ForcedAligner-0.6B惊艳效果:中日双语演讲音频的跨语言对齐能力

Qwen3-ForcedAligner-0.6B惊艳效果:中日双语演讲音频的跨语言对齐能力 1. 引言:当音频遇见文字,精准对齐的魔法 你有没有遇到过这样的场景? 一段精彩的演讲录音,你想为它配上精准的字幕,但手动一句一句去…

2026/7/5 1:27:16 阅读更多 →
3步打造高效桌面:NoFences效率工具让混乱图标秒变有序

3步打造高效桌面:NoFences效率工具让混乱图标秒变有序

3步打造高效桌面:NoFences效率工具让混乱图标秒变有序 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 每天面对布满数十个图标的电脑桌面,寻找一个文件…

2026/7/4 20:21:34 阅读更多 →

最新新闻

AI 压测数据回放:让模型读报告之前先校准口径

AI 压测数据回放:让模型读报告之前先校准口径

AI 压测数据回放:让模型读报告之前先校准口径 一、压测报告不能直接丢给模型 AI 可以帮助分析压测结果,但前提是输入数据口径清楚。很多压测报告里混着预热阶段、限流阶段、错误重试、下游故障和业务噪声。如果直接让模型总结,很容易得到一段…

2026/7/5 1:22:14 阅读更多 →
AI工具链选型:GitHub Copilot与Cursor、Codeium企业开发场景实测对比

AI工具链选型:GitHub Copilot与Cursor、Codeium企业开发场景实测对比

AI工具链选型:GitHub Copilot与Cursor、Codeium企业开发场景实测对比 一、评测体系设计与方法论 AI编码助手已成为开发效率的关键杠杆。本次评测聚焦三项主流工具的实际表现。从四个维度建立可复现的量化评测框架。 %%{init: {theme: base}}%% radartitle AI编码助手…

2026/7/5 1:20:14 阅读更多 →
PyTorch 数据加载瓶颈:GPU 空等时先看 DataLoader

PyTorch 数据加载瓶颈:GPU 空等时先看 DataLoader

PyTorch 数据加载瓶颈:GPU 空等时先看 DataLoader 一、训练慢不一定是模型慢 PyTorch 训练时,很多人看到速度慢就先改模型、调 batch size、换显卡。但如果 GPU 利用率忽高忽低,可能瓶颈根本不在模型,而在数据加载。图片解码、文本…

2026/7/5 1:20:14 阅读更多 →
群晖DSM 7.2.2视频管理终极解决方案:免费恢复Video Station完整功能

群晖DSM 7.2.2视频管理终极解决方案:免费恢复Video Station完整功能

群晖DSM 7.2.2视频管理终极解决方案:免费恢复Video Station完整功能 【免费下载链接】Video_Station_for_DSM_722 Script to install Video Station in DSM 7.2.2 and DSM 7.3 项目地址: https://gitcode.com/gh_mirrors/vi/Video_Station_for_DSM_722 你是否…

2026/7/5 1:20:14 阅读更多 →
云原生可观测性:构建全链路监控体系

云原生可观测性:构建全链路监控体系

引言在微服务架构和容器化部署成为主流的当下,系统的复杂性呈指数级增长。一个请求可能跨越数十个服务实例,传统的日志查看和单点监控已无法满足故障排查的需求。云原生可观测性(Observability)应运而生,它通过Metrics…

2026/7/5 1:18:13 阅读更多 →
工训赛智能小车 PCB 自制指南:从 BTN7971B 四路驱动到主控布局的 5 个要点

工训赛智能小车 PCB 自制指南:从 BTN7971B 四路驱动到主控布局的 5 个要点

工训赛智能小车PCB设计实战:从四路驱动到主控布局的进阶指南在工程训练综合能力竞赛的智能物流搬运赛项中,一辆性能卓越的小车往往始于精良的PCB设计。当现成模块难以满足定制化需求时,自主设计PCB不仅能显著降低成本,更能实现整车…

2026/7/5 1:18:13 阅读更多 →

日新闻

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 阅读更多 →

周新闻

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 阅读更多 →

月新闻