基于HAL库的STM32F103C8T6与NRF24L01无线模块SPI通信实战解析
1. 项目开篇为什么选择STM32F103C8T6与NRF24L01如果你正在为你的智能小车、无线传感器节点或者简单的遥控设备寻找一个成本低廉、稳定可靠的无线通信方案那么STM32F103C8T6也就是我们常说的“蓝莓派”或“最小系统板”加上NRF24L01这个2.4G无线模块绝对是一个经典且不会出错的选择。我这些年做过不少物联网小玩意这套组合的出场率非常高。它俩搭配起来有点像“经济适用房”——价格亲民功能却足够扎实能满足大多数短距离、低速率的数据传输需求。STM32F103C8T6作为一款经典的Cortex-M3内核MCU资源对于驱动NRF24L01来说绰绰有余。而NRF24L01模块虽然是个老将但其功耗低、集成度高内置了完整的2.4G射频和协议栈通过SPI接口与MCU通信对开发者非常友好。整个通信链路从你写代码到数据在空中飞核心就是SPI。你可能听说过SPI觉得不就是几根线吗但实际用HAL库调起来特别是和NRF24L01这种对时序有点小脾气的模块打交道里面还是有不少门道的。这篇文章我就把我自己用STM32CubeMX和HAL库把这对搭档跑通的全过程包括踩过的坑和验证过的代码毫无保留地分享给你。我们的目标很简单让你看完就能动手做出一对能稳定对话的无线模块。2. 硬件连接别在第一步就“翻车”动手写代码之前确保硬件连接正确是头等大事。很多朋友调不通一半以上的问题都出在接线马虎或者理解有偏差上。我们先来理清思路。核心通信桥梁SPINRF24L01通过SPI接口与STM32通信。SPI是一种全双工、同步的串行通信总线主从结构。在我们的系统里STM32是主机MasterNRF24L01是从机Slave。除了基本的SPI三线MISO, MOSI, SCK之外还需要两根控制线片选CSN和使能CE。IRQ中断引脚是可选的用于通知MCU数据收发完成初期调试我们可以先采用查询方式更直观。引脚连接对照表这是关键为了方便你对照我整理了一个表格列出了STM32F103C8T6和NRF24L01最常用的连接方式。请注意SPI1的引脚是固定的但控制引脚你可以根据实际情况调整到其他GPIO我在CubeMX配置里会具体说明。NRF24L01模块引脚功能说明STM32F103C8T6连接引脚推荐备注VCC电源 (3.3V)3.3V绝对禁止接5V会烧模块。GND地GND共地是必须的。CE发射/接收模式使能PB0 (或其他任意GPIO)数字输出高电平有效。CSNSPI片选PB1 (或其他任意GPIO)数字输出低电平选中。SCKSPI时钟线PA5 (SPI1_SCK)固定属于SPI1。MOSI主机输出从机输入PA7 (SPI1_MOSI)固定属于SPI1。MISO主机输入从机输出PA6 (SPI1_MISO)固定属于SPI1。IRQ中断输出PA4 (或其他任意GPIO)数字输入低电平有效。初期可不用。注意上表中CE、CSN、IRQ所使用的PB0、PB1、PA4是我在示例代码中使用的引脚你完全可以根据自己板子的布局在CubeMX中分配到其他空闲的GPIO口只需要在代码中保持宏定义一致即可。但SCK、MOSI、MISO必须连接到STM32的SPI1复用功能引脚上通常是PA5、PA6、PA7这是硬件决定的不能随意更改。电源与滤波稳定的基石NRF24L01对电源噪声比较敏感。如果你发现通信距离短或者不稳定很大概率是电源问题。务必确保供电电压是稳定的3.3V。最好能在模块的VCC和GND之间并联一个10uF的电解电容和一个0.1uF100nF的瓷片电容分别用于滤除低频和高频噪声。这个细节很多新手会忽略但实测下来对稳定性提升非常明显。3. 软件基石STM32CubeMX工程配置详解硬件连好了我们打开STM32CubeMX开始搭建软件的骨架。这里每一步的设置都直接影响后续驱动代码的编写我会详细解释为什么这么选。3.1 核心系统与时钟配置首先新建工程选择STM32F103C8Tx。在Pinout Configuration界面SYS在Debug一栏如果你使用ST-Link调试建议选择Serial Wire。这只会占用PA13和PA14两个引脚不影响我们的SPI。RCC在High Speed Clock (HSE)选择Crystal/Ceramic Resonator。我们的最小系统板外部通常都有一个8MHz的晶振这样系统时钟才能跑到最高的72MHzSPI通信速度也才能上去。接下来点击Clock Configuration标签页这是一个关键步骤。我们需要配置系统时钟树。通常的配置路径是HSE8MHz - PLL作为系统时钟源 - 经过PLL倍频x9 - 得到72MHz的系统时钟SYSCLK。你可以直接使用CubeMX的自动计算功能选择HSE和PLL目标频率设为72MHz软件会自动帮你配置好分频系数。确保APB2总线时钟PCLK2也是72MHz因为SPI1挂载在APB2上它的时钟速度决定了SPI的通信速率。3.2 SPI1外设配置在Connectivity中找到SPI1工作模式选择Full-Duplex Master全双工主机模式。这是最常用的模式。硬件NSS选择Disable。我们将使用软件控制CSN引脚这样更灵活。所以NSS Signal Type保持为Software。参数配置Data Size:8 bits。NRF24L01的SPI指令和数据都是8位的。First Bit:MSB First。NRF24L01协议规定数据高位MSB在先。Clock Polarity (CPOL)和Clock Phase (CPHA)这是SPI时序模式的精髓也是容易出错的地方。根据NRF24L01的数据手册它支持SPI模式0和模式3。我们通常选择**LowCPOL0和1 EdgeCPHA0**即模式0。这意味着SCK时钟线在空闲时为低电平数据在时钟的第一个边沿上升沿被采样。这个设置必须正确否则读写寄存器会全是乱码。Baud Rate: 先选择Prescaler 16。计算一下APB2时钟72MHz / 16 4.5MHz。这个初始速度比较保守有利于确保通信稳定。后续在驱动代码里我们可以提供一个函数来动态调整这个速度。配置好后SPI1的引脚PA5(SCK)PA6(MISO)PA7(MOSI)会自动在芯片图上显示为绿色表示已被占用。3.3 GPIO控制引脚配置我们需要手动配置CE、CSN和IRQ可选引脚。在芯片图上找到PB0左键点击选择GPIO_Output这就是我们的CE引脚。你可以右键点击该引脚给它起个别名比如NRF24_CE这样代码可读性更好。同样配置PB1为GPIO_Output作为CSN引脚别名NRF24_CSN。配置PA4为GPIO_Input作为IRQ引脚别名NRF24_IRQ。注意NRF24L01的IRQ是低电平有效所以我们可以不配置上拉依靠模块内部下拉或者为了稳定在CubeMX里将PA4配置为Pull-up上拉输入。3.4 调试串口配置可选但推荐为了方便调试打印状态信息我们配置一个串口。在Connectivity中选择USART1模式为Asynchronous异步通信。引脚会自动分配为PA9(TX)和PA10(RX)。参数通常保持默认波特率1152008位数据位无校验1位停止位。这样我们就可以在电脑上用串口助手看到模块的初始化状态和数据收发日志了对排查问题至关重要。3.5 生成工程代码点击Project Manager设置好工程名称、存储路径选择你熟悉的IDEMDK-ARM或STM32CubeIDE。在Code Generator里我强烈建议勾选Generate peripheral initialization as a pair of .c/.h files per peripheral。这样每个外设如SPI、GPIO的初始化代码会单独放在对应的.c/.h文件里结构非常清晰也方便我们后续添加自己的驱动函数。 最后点击GENERATE CODE让CubeMX为我们生成完整的初始化代码框架。4. 驱动代码深度解析从寄存器操作到数据收发工程生成后我们进入最核心的部分编写NRF24L01的驱动代码。我会把代码掰开揉碎了讲让你不仅知道怎么写更明白为什么这么写。4.1 宏定义与SPI底层读写首先在NRF24L01.h文件中我们需要根据CubeMX的配置定义硬件连接。// 确保这里的引脚定义与你CubeMX中的配置完全一致 #define NRF_IRQ_Pin GPIO_PIN_4 #define NRF_IRQ_GPIO_Port GPIOA #define NRF_CE_Pin GPIO_PIN_0 #define NRF_CE_GPIO_Port GPIOB #define NRF_CS_Pin GPIO_PIN_1 #define NRF_CS_GPIO_Port GPIOB // 控制宏提高代码可读性 #define NRF24L01_SPI_CS_ENABLE() HAL_GPIO_WritePin(NRF_CS_GPIO_Port, NRF_CS_Pin, GPIO_PIN_RESET) // CSN拉低开始SPI通信 #define NRF24L01_SPI_CS_DISABLE() HAL_GPIO_WritePin(NRF_CS_GPIO_Port, NRF_CS_Pin, GPIO_PIN_SET) // CSN拉高结束SPI通信 #define NRF24L01_CE_LOW() HAL_GPIO_WritePin(NRF_CE_GPIO_Port, NRF_CE_Pin, GPIO_PIN_RESET) // CE拉低待机模式 #define NRF24L01_CE_HIGH() HAL_GPIO_WritePin(NRF_CE_GPIO_Port, NRF_CE_Pin, GPIO_PIN_SET) // CE拉高进入发射/接收模式 #define NRF24L01_IRQ_PIN_READ() HAL_GPIO_ReadPin(NRF_IRQ_GPIO_Port, NRF_IRQ_Pin)接下来是SPI的底层字节读写函数。CubeMX生成的spi.c里通常没有现成的单字节收发函数我们需要自己实现一个。这个函数是驱动NRF24L01的基石。// spi.c 中添加 uint8_t SPI1_ReadWriteByte(SPI_HandleTypeDef *hspi, uint8_t byte) { uint8_t d_read, d_send byte; // 使用HAL_SPI_TransmitReceive一次调用同时完成发送和接收 if(HAL_SPI_TransmitReceive(hspi, d_send, d_read, 1, 0xFF) ! HAL_OK) { d_read 0xFF; // 如果传输错误返回0xFF } return d_read; }这个函数非常关键。HAL库的HAL_SPI_TransmitReceive是阻塞式的它会等待一个字节发送并接收完成。超时时间我设为0xFFFF最大值确保有足够时间。这里有个细节NRF24L01的SPI协议规定主机在发送命令字节的同时从机会返回状态寄存器STATUS的值。所以这个函数的返回值d_read在每次寄存器操作时都包含了NRF24L01的状态信息我们在上层函数里会用到它。4.2 寄存器读写与模块初始化有了字节读写函数我们就可以封装对NRF24L01寄存器的读写操作了。在NRF24L01.c中// 写一个寄存器 uint8_t NRF24L01_Write_Reg(uint8_t reg, uint8_t value) { uint8_t status; NRF24L01_SPI_CS_ENABLE(); // 片选拉低开始通信 status SPI1_ReadWriteByte(hspi1, reg); // 发送寄存器地址带写命令 SPI1_ReadWriteByte(hspi1, value); // 发送要写入的值 NRF24L01_SPI_CS_DISABLE(); // 片选拉高结束通信 return status; // 返回操作时的状态寄存器值 } // 读一个寄存器 uint8_t NRF24L01_Read_Reg(uint8_t reg) { uint8_t reg_val; NRF24L01_SPI_CS_ENABLE(); SPI1_ReadWriteByte(hspi1, reg); // 发送寄存器地址带读命令 reg_val SPI1_ReadWriteByte(hspi1, 0XFF); // 发送一个空字节0xFF同时读回寄存器值 NRF24L01_SPI_CS_DISABLE(); return reg_val; }注意看读寄存器时我们发送的是寄存器地址例如0x00然后必须再发送一个时钟周期即调用一次SPI1_ReadWriteByte发送任意数据如0xFF才能把寄存器里的值“挤”出来。这是SPI通信的典型操作。模块的硬件检测函数NRF24L01_Check()是判断接线是否正确的重要工具。它的原理是向TX_ADDR寄存器写入5个特定的字节如0xA5再读回来如果一致说明SPI通信基本正常。uint8_t NRF24L01_Check(void) { uint8_t buf[5] {0xA5, 0xA5, 0xA5, 0xA5, 0xA5}; uint8_t i; NRF24L01_Write_Buf(NRF_WRITE_REGTX_ADDR, buf, 5); // 写地址 NRF24L01_Read_Buf(TX_ADDR, buf, 5); // 读地址 for(i0; i5; i) if(buf[i] ! 0xA5) break; if(i ! 5) return 1; // 检测失败 return 0; // 检测成功 }在main函数初始化时先调用这个检查函数并通过串口打印结果能帮你快速定位是硬件连接问题还是软件配置问题。4.3 发射(TX)与接收(RX)模式配置这是驱动层最核心的两个函数配置不对模块就无法正常工作。它们本质上就是按照NRF24L01数据手册的流程依次配置一系列寄存器。发射模式配置NRF24L01_TX_Mode()CE拉低进入待机模式I允许配置寄存器。设置地址写入发射地址(TX_ADDR)和接收通道0的地址(RX_ADDR_P0)。注意为了启用自动应答ACK接收通道0的地址必须与发射地址相同。使能自动应答和接收地址配置EN_AA和EN_RXADDR寄存器通常我们只使用通道0。设置自动重发SETUP_RETR寄存器设置重发延迟和最大重发次数。这是提高可靠性的关键。设置射频参数RF_CH选择通信频道0-125避开WiFi干扰较多的频道如40。RF_SETUP设置发射功率0dBm最大和数据速率2Mbps或1Mbps2Mbps更快1Mbps距离更远。配置基本模式CONFIG寄存器设置为上电(PWR_UP)、使能CRC(EN_CRC)、16位CRC、以及发射模式PRIM_RX位为0。CE拉高保持至少10us以上模块进入发射待命状态。当FIFO中有数据且CE为高时立即开始发送。接收模式配置NRF24L01_RX_Mode()CE拉低。设置接收地址写入接收通道0的地址(RX_ADDR_P0)。使能自动应答和接收地址同发射模式。设置射频参数频道(RF_CH)和速率(RF_SETUP)必须与发射端完全一致设置接收数据宽度RX_PW_P0寄存器设置通道0的接收数据宽度1-32字节必须与发射端发送的数据长度一致。配置基本模式CONFIG寄存器设置为上电、使能CRC、16位CRC、以及接收模式PRIM_RX位为1。CE拉高模块进入接收状态开始监听空中信号。提示配置完成后务必加一个短暂的延时如HAL_Delay(1)确保模块有足够时间稳定。我曾因为省掉这个延时导致模块状态不稳排查了好久。4.4 数据包收发函数配置好模式后数据的收发就相对简单了。发送数据包NRF24L01_TxPacket先把CE拉低然后将待发送的数据通过WR_TX_PLOAD命令写入模块的TX FIFO缓冲区最后将CE拉高触发发送。函数内部会循环查询IRQ引脚或状态寄存器直到发送完成成功或达到最大重发次数。发送完成后一定要读取STATUS寄存器并清除中断标志位通过写1清除否则会影响下一次发送。接收数据包NRF24L01_RxPacket循环查询状态寄存器STATUS的RX_DR位。如果该位为1表示收到了数据则通过RD_RX_PLOAD命令将数据从RX FIFO中读出。同样读完后要清除RX_DR中断标志并可以执行FLUSH_RX命令清空接收缓冲区。5. 主程序逻辑与调试技巧驱动层准备好了主程序的逻辑就非常清晰了。我们通常需要两个工程一个发送端TX一个接收端RX。发送端主循环NRF24L01_TX_Mode(); // 上电后配置为发射模式 while (1) { HAL_Delay(1000); // 每秒发送一次 if(NRF24L01_TxPacket(tx_buffer) TX_OK) { printf(发送成功: %s\r\n, tx_buffer); } else { printf(发送失败\r\n); } }接收端主循环NRF24L01_RX_Mode(); // 上电后配置为接收模式 while (1) { if(NRF24L01_RxPacket(rx_buffer) 0) { // 收到数据 rx_buffer[32] \0; // 添加字符串结束符 printf(收到数据: %s\r\n, rx_buffer); // 可以在OLED上显示或触发其他动作 } HAL_Delay(10); // 短暂延时避免CPU空转 }调试过程中我踩过的坑和总结的技巧电源和地线这是老生常谈但永远是第一位的。用万用表量一下NRF24L01的VCC脚确保是稳定的3.3V。如果电压在发送时被拉低通信必然失败。地址匹配发射端的TX_ADDR和接收端的RX_ADDR_P0必须一模一样。地址可以是5个字节的任意值但两端要一致。我习惯用{0x34, 0x43, 0x10, 0x10, 0x01}这种有特征的方便记忆。频道与速率RF_CH和RF_SETUP中的速率设置必须一致。2.4GHz频段干扰多如果通信不稳定可以尝试换一个频道比如从40改成80或者将速率从2Mbps降到1Mbps。数据长度发送的数据长度不能超过你在RX_PW_P0中设置的长度。如果发送32字节接收也必须是32字节。善用状态寄存器在初始化、发送、接收函数中都把STATUS寄存器的值读出来通过串口打印成二进制或十六进制。通过分析TX_DS发送成功、MAX_RT达到最大重发、RX_DR接收就绪这些位可以精准定位问题所在。比如如果一直看到MAX_RT置位说明数据包没有收到ACK可能是接收端没配置好、地址不对、或者根本不在线。逻辑分析仪是神器如果条件允许用逻辑分析仪抓一下SPI总线的波形。可以直观地看到CSN、SCK、MOSI、MISO上的信号检查时序CPOL/CPHA是否正确数据内容是否符合预期。这是解决复杂问题的终极手段。最后把编译好的程序分别下载到两块STM32开发板上电打开串口助手。你应该能看到发送端周期性地打印“发送成功”接收端打印“收到数据”。那一刻的成就感就是驱动开发最大的乐趣。希望这份详细的解析能帮你顺利打通STM32与NRF24L01的无线链路把你的想法变成现实。如果在实际操作中遇到问题不妨回头再仔细检查一下硬件连接和配置寄存器的每一步很多时候成功就藏在那些最基础的细节里。

相关新闻

Rhino.Inside.Revit实战指南:从入门到精通

Rhino.Inside.Revit实战指南:从入门到精通

1. 初识Rhino.Inside.Revit:打破BIM与参数化设计的壁垒 如果你是一名建筑师、工程师或者BIM工程师,每天在Revit里和墙体、楼板、管道打交道,但心里又总惦记着Rhino和Grasshopper里那些自由流畅的曲面和强大的参数化逻辑,那你一定经…

2026/7/5 3:55:52 阅读更多 →
使用haneWIN在Win10上快速部署NFS服务器的完整指南

使用haneWIN在Win10上快速部署NFS服务器的完整指南

1. 为什么要在Windows 10上折腾NFS服务器? 如果你和我一样,是个嵌入式开发者,或者经常需要在Windows和Linux环境之间倒腾文件,那你肯定对“文件共享”这事儿又爱又恨。爱的是,它能让工作流顺畅无比;恨的是&…

2026/7/5 14:09:10 阅读更多 →
【养龙虾】OpenClaw 安装部署全流程 - 手把手教你搭建自己的 AI 助手

【养龙虾】OpenClaw 安装部署全流程 - 手把手教你搭建自己的 AI 助手

折腾了整整两天,终于把 OpenClaw 部署好了!过程中踩了不少坑,今天把完整流程记录下来,希望能帮到想入门的小伙伴。本文适合零基础新手,大佬请绕道~ 既然都开始养虾了,那肯定少不了让它来生成一篇养虾的过程…

2026/7/4 16:51:19 阅读更多 →

最新新闻

Swagger2 从入门到实战:构建优雅的API文档

Swagger2 从入门到实战:构建优雅的API文档

1. 什么是 Swagger2? Swagger2 是一套基于 OpenAPI 规范的开源工具集,用于设计、构建、文档化和消费 RESTful Web 服务。它通过注解和代码生成,让 API 文档与代码保持同步,极大提升了前后端协作效率。 2. 核心优势 代码即文档&…

2026/7/6 11:42:23 阅读更多 →
AWS SDK for Java 2.x 文件上传实战:3种授权方式对比与Spring Boot集成

AWS SDK for Java 2.x 文件上传实战:3种授权方式对比与Spring Boot集成

AWS SDK for Java 2.x 文件上传实战:3种授权方式对比与Spring Boot集成在当今云原生应用开发中,对象存储服务已成为不可或缺的基础设施。Amazon S3作为行业标杆,其Java SDK的V2版本带来了更现代化的API设计和性能优化。本文将深入探讨AWS SDK…

2026/7/6 11:42:23 阅读更多 →
AI漫剧制作全流程:从Stable Diffusion到剪映的工程化实践

AI漫剧制作全流程:从Stable Diffusion到剪映的工程化实践

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 你有没有想过,把脑子里那些天马行空的故事,直接变成一部有画面、有声音、有节奏的动画短片?不是用…

2026/7/6 11:40:21 阅读更多 →
SpringBoot+Vue+MySQL学生成绩管理系统:从零部署到核心模块深度解析

SpringBoot+Vue+MySQL学生成绩管理系统:从零部署到核心模块深度解析

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 每到期末,课程设计、毕业设计、大作业的DDL就像悬在头顶的达摩克利斯之剑。很多同学都面临一个困境:想做一个能…

2026/7/6 11:38:20 阅读更多 →
AI Agent直接操作HTML:突破Figma AI局限,实现前端代码精准生成

AI Agent直接操作HTML:突破Figma AI局限,实现前端代码精准生成

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 最近在尝试用AI Agent自动生成UI设计稿时,发现一个普遍痛点:无论是使用Figma AI还是其他设计工具,…

2026/7/6 11:38:19 阅读更多 →
从Figma到HTML:构建精准可控的AI网页生成Agent实战指南

从Figma到HTML:构建精准可控的AI网页生成Agent实战指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 最近在尝试用 AI 生成设计稿或界面原型时,你是不是也遇到过这样的困境:让 AI 画一个简单的登录框,…

2026/7/6 11:38:19 阅读更多 →

日新闻

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/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

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

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

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

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

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

2026/7/6 6:52:56 阅读更多 →

月新闻