STM32串口控制LED+OLED显示实战:从硬件连接到代码调试全流程
STM32串口控制LEDOLED显示实战从硬件连接到代码调试全流程很多刚接触STM32的朋友拿到开发板后面对一堆外设和库函数常常感到无从下手。理论看了不少但一到动手环节硬件怎么连、代码怎么写、出了问题怎么找这些具体的“路”却走不通。今天我们就来“修”一条从零到一的路目标很明确通过电脑串口发送一个命令让STM32板子上的LED灯亮灭同时把接收到的命令实时显示在OLED屏幕上。这个项目麻雀虽小五脏俱全。它串联了GPIO输出控制LED、串口通信命令接收与反馈和OLED显示信息可视化这三个嵌入式开发中最基础也最核心的技能点。完成它你不仅能点亮一盏灯、显示一行字更重要的是你能建立起一个完整的“感知-决策-执行”的嵌入式系统思维闭环。无论你是电子专业的学生还是希望转型硬件的软件工程师这个实战项目都将是你STM32学习路上一个扎实的起点。下面我们就从硬件清单开始一步步拆解直到项目完美运行。1. 硬件准备与电路连接动手写代码之前确保手头的“积木”齐全并且正确搭建是成功的第一步。这个项目对硬件要求非常友好大部分STM32入门套件都能满足。1.1 所需物料清单你需要准备以下核心部件STM32最小系统板以最常见的STM32F103C8T6蓝色药丸板为例它资源足够性价比极高。OLED显示屏推荐使用0.96英寸、128x64分辨率的I2C接口OLED模块。I2C通信仅需两根信号线接线简单库也成熟。LED灯如果开发板上已集成用户LED通常连接在PA5或PC13引脚则直接使用。如果没有准备一个直插或贴片LED并搭配一个220Ω-1kΩ的限流电阻。USB转TTL串口模块这是连接电脑和STM32串口的桥梁常用芯片有CH340、CP2102等。杜邦线若干用于连接。电脑一台用于编写代码、下载程序和发送串口命令。提示购买OLED模块时务必确认其驱动芯片是SSD1306这是最通用的型号网上资料和驱动库最丰富。1.2 电路连接详解连接遵循“电源-地-信号”的顺序务必在断电状态下操作。首先连接OLED模块I2C接口OLED模块通常有4个引脚VCC、GND、SCL、SDA。VCC- STM32板的3.3V引脚。GND- STM32板的GND引脚。SCL时钟线- STM32板的PB6或PB8根据你的板子定义这里以PB6为例。SDA数据线- STM32板的PB7或PB9。其次连接USB转TTL模块TTL模块的VCC- STM32板的3.3V切勿接5V可能烧坏芯片。TTL模块的GND- STM32板的GND。TTL模块的TXD- STM32板的PA10USART1_RX。TTL模块的RXD- STM32板的PA9USART1_TX。注意串口连接是“交叉”的即发送端TXD接接收端RX接收端RXD接发送端TX。这是初学者最容易接错的地方。最后确认LED连接如果使用板载LED通常已连接好例如在STM32F103C8T6核心板上用户LED常接在PA5。如果外接LED则需将LED正极通过限流电阻连接到STM32的某个GPIO引脚如PA5负极接GND。为了更清晰地展示核心信号连接关系可以参考下表外设模块信号线STM32引脚 (以STM32F103C8T6为例)引脚功能USB-TTLTXDPA10USART1_RX (串口1接收)RXDPA9USART1_TX (串口1发送)OLED (I2C)SCLPB6I2C1_SCL (时钟)SDAPB7I2C1_SDA (数据)LED控制端PA5GPIO输出连接完成后硬件部分就准备好了。接下来我们进入软件开发环境搭建环节。2. 开发环境搭建与工程创建工欲善其事必先利其器。一个顺手的开发环境能极大提升效率减少环境问题带来的困扰。2.1 工具链安装与配置对于STM32开发Keil MDKARMCC编译器和STM32CubeMX是黄金组合。前者是强大的集成开发环境IDE后者是图形化的引脚配置与代码生成工具。安装Keil MDK从ARM官网下载并安装Keil MDK注意需要申请License社区版有代码大小限制但对此项目足够。安装过程中会同时安装ARM Compiler。安装STM32CubeMX从ST官网下载安装。它内置了STM32全系列芯片的硬件抽象层HAL库以及LL库。安装芯片支持包在Keil中通过Pack Installer图标像一个小盒子安装你所用芯片的Device Family PackDFP例如Keil::STM32F1xx_DFP。安装串口调试助手用于从电脑发送命令和接收STM32的反馈。推荐使用SecureCRT、MobaXterm或免费的Putty、AccessPort。2.2 使用CubeMX初始化工程CubeMX能可视化配置时钟、引脚和外设生成初始化代码避免手动编写底层配置的繁琐和错误。新建项目打开CubeMX选择New Project在芯片选择器中输入你的型号如STM32F103C8双击选中。配置系统核心SYS在Pinout Configuration标签页左侧找到System Core-SYS。将Debug改为Serial Wire。这为后续使用ST-Link下载调试预留了接口。配置时钟RCC找到RCC将High Speed Clock (HSE)设置为Crystal/Ceramic Resonator。我们的外部晶振通常是8MHz。配置GPIOLED在芯片图形上找到PA5左键点击选择GPIO_Output。然后在左侧System Core-GPIO中点击PA5可以配置其输出模式和默认电平。我们将其初始化为高电平LED灭用户标签可设为USER_LED。配置USART1串口找到PA9和PA10分别设置为USART1_TX和USART1_RX。然后在左侧Connectivity-USART1中将模式设为Asynchronous异步通信参数保持默认波特率9600、数据位8、停止位1、无校验。别忘了在NVIC Settings中勾选USART1 global interrupt使能串口接收中断。配置I2C1OLED找到PB6和PB7分别设置为I2C1_SCL和I2C1_SDA。然后在左侧Connectivity-I2C1中模式选择I2C参数通常保持默认即可。生成工程代码点击上方Project Manager标签。Project页设置工程名称、存储路径选择Toolchain / IDE为MDK-ARM V5。Code Generator页建议勾选Generate peripheral initialization as a pair of .c/.h files per peripheral这样每个外设的代码会单独成对文件结构更清晰。再勾选Copy all used libraries into the project folder便于工程迁移。点击GENERATE CODE生成Keil工程文件。至此一个包含时钟、GPIO、USART、I2C基础配置的工程框架就由CubeMX自动生成了。我们接下来要做的就是在这个框架里填充我们的业务逻辑代码。3. 外设驱动集成与业务逻辑实现CubeMX生成了硬件底层的“骨架”我们现在需要为OLED屏幕添加“眼睛”并编写让系统“动起来”的“大脑”程序。3.1 集成OLED驱动库STM32的HAL库不包含SSD1306 OLED的驱动我们需要自行添加一个。网上有大量开源驱动这里我们使用一个经过简化的版本。在Keil工程文件夹中新建一个Middlewares/SSD1306文件夹。将下载或编写的ssd1306.h、ssd1306.c、ssd1306_fonts.h文件放入该文件夹。在Keil工程中右键Application/User组选择Add Existing Files...添加ssd1306.c。在Core/Inc/main.h中确保包含了HAL库头文件。然后在ssd1306.h中主要需要实现以下关键函数// ssd1306.h 中的关键函数声明 void SSD1306_Init(void); void SSD1306_UpdateScreen(void); void SSD1306_Clear(void); void SSD1306_WriteString(uint8_t x, uint8_t y, char* str, FontDef font);在ssd1306.c中最核心的是I2C写入函数它依赖于HAL库// 基于HAL_I2C_Mem_Write的底层写函数 void SSD1306_WriteCommand(uint8_t cmd) { uint8_t data[2] {0x00, cmd}; // 控制字节0x00表示命令 HAL_I2C_Master_Transmit(hi2c1, SSD1306_I2C_ADDR, data, 2, HAL_MAX_DELAY); } void SSD1306_WriteData(uint8_t* data, uint16_t size) { uint8_t *p (uint8_t *)malloc(size 1); if(p) { p[0] 0x40; // 控制字节0x40表示数据 memcpy(p[1], data, size); HAL_I2C_Master_Transmit(hi2c1, SSD1306_I2C_ADDR, p, size 1, HAL_MAX_DELAY); free(p); } }注意不同的OLED模块I2C地址可能不同常见的是0x78或0x7A需要在ssd1306.h中宏定义SSD1306_I2C_ADDR并根据你的模块手册修改。3.2 编写串口命令解析与LED控制逻辑现在我们来编写核心的业务代码。主要工作集中在main.c和串口中断回调函数中。首先在main.c的/* USER CODE BEGIN PV */区域定义全局变量/* Private variables ---------------------------------------------------------*/ char uart_rx_buffer[100]; // 串口接收缓冲区 uint8_t uart_rx_len 0; // 接收到的数据长度 uint8_t command_ready 0; // 命令接收完成标志然后在/* USER CODE BEGIN 2 */区域初始化OLED并打印欢迎信息/* USER CODE BEGIN 2 */ SSD1306_Init(); SSD1306_Clear(); SSD1306_WriteString(0, 0, UART CMD TEST, Font_7x10); SSD1306_WriteString(0, 20, Waiting..., Font_7x10); SSD1306_UpdateScreen(); // 启动串口接收中断CubeMX已配置好 HAL_UART_Receive_IT(huart1, (uint8_t*)uart_rx_buffer[uart_rx_len], 1); /* USER CODE END 2 */接下来是关键重写串口接收中断回调函数。在main.c文件末尾的/* USER CODE BEGIN 4 */区域添加/* USER CODE BEGIN 4 */ // 串口接收中断回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart-Instance USART1) { // 检查是否收到回车符\r 或 \n作为命令结束符 if (uart_rx_buffer[uart_rx_len] \r || uart_rx_buffer[uart_rx_len] \n) { if (uart_rx_len 0) { // 确保不是空命令 uart_rx_buffer[uart_rx_len] \0; // 添加字符串结束符 command_ready 1; // 设置命令就绪标志 } uart_rx_len 0; // 重置长度准备接收下一条命令 } else { uart_rx_len; // 长度增加 if (uart_rx_len sizeof(uart_rx_buffer) - 1) { // 缓冲区即将溢出清空并重新开始 uart_rx_len 0; } } // 重新启动中断接收等待下一个字符 HAL_UART_Receive_IT(huart1, (uint8_t*)uart_rx_buffer[uart_rx_len], 1); } } /* USER CODE END 4 */最后在主循环/* USER CODE BEGIN WHILE */中处理就绪的命令/* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ if (command_ready) { command_ready 0; // 清除标志 // 在OLED上显示收到的命令 SSD1306_Clear(); SSD1306_WriteString(0, 0, CMD Received:, Font_7x10); SSD1306_WriteString(0, 20, uart_rx_buffer, Font_7x10); SSD1306_UpdateScreen(); // 解析命令并控制LED if (strcmp(uart_rx_buffer, LED_ON) 0) { HAL_GPIO_WritePin(USER_LED_GPIO_Port, USER_LED_Pin, GPIO_PIN_RESET); // LED亮 HAL_UART_Transmit(huart1, (uint8_t*)LED is ON\r\n, strlen(LED is ON\r\n), 100); } else if (strcmp(uart_rx_buffer, LED_OFF) 0) { HAL_GPIO_WritePin(USER_LED_GPIO_Port, USER_LED_Pin, GPIO_PIN_SET); // LED灭 HAL_UART_Transmit(huart1, (uint8_t*)LED is OFF\r\n, strlen(LED is OFF\r\n), 100); } else { // 未知命令反馈 char err_msg[50]; sprintf(err_msg, Unknown CMD: %s\r\n, uart_rx_buffer); HAL_UART_Transmit(huart1, (uint8_t*)err_msg, strlen(err_msg), 100); SSD1306_WriteString(0, 40, Unknown CMD!, Font_7x10); SSD1306_UpdateScreen(); } // 清空缓冲区为下一条命令做准备 memset(uart_rx_buffer, 0, sizeof(uart_rx_buffer)); uart_rx_len 0; } // 可以添加一些其他任务或延时 HAL_Delay(10); } /* USER CODE END 3 */代码的核心逻辑是中断负责高效接收字符并组装成字符串命令主循环负责解析执行命令并更新显示。这种“中断主循环”的结构是嵌入式系统的典型设计模式。4. 编译、下载与调试实战代码写完只是第一步让它跑起来并稳定工作才是真正的挑战。这个环节我们会遇到最多的问题也是成长最快的地方。4.1 工程编译与常见错误解决在Keil中点击RebuildF7按钮。如果一切顺利你会在Build Output窗口看到0 Error(s), 0 Warning(s)。但更常见的是遇到一些错误和警告。错误undefined symbol HAL_I2C_Master_Transmit原因I2C的HAL库文件没有被添加到工程中。解决CubeMX生成工程时如果未使用I2C可能不会链接I2C库。确保在Project-Manage-Project Items-Folders/Extensions中STM32Cube_FW_F1_VX.X.X\Drivers\STM32F1xx_HAL_Driver路径已被包含。或者直接在ssd1306.c中包含stm32f1xx_hal_i2c.h头文件。警告variable xxx was set but never used原因定义了变量但未使用。可能是调试遗留或代码逻辑变更。解决如果确实不需要可以删除该变量定义如果暂时不用但后续需要可以使用(void)xxx;来显式忽略此警告。错误No space in execution regions原因代码或数据量超过了芯片的Flash或RAM容量。对于STM32F103C8T6Flash为64KB。解决检查是否添加了过大的字体数组或缓冲区。优化代码使用const将常量数组存放到Flash。在Target选项卡中确认IROM和IRAM的起始地址和大小设置正确。4.2 程序下载与硬件调试编译通过后将生成project.hex或project.bin文件。你需要一个下载器如ST-Link。连接下载器ST-Link的SWDIO、SWCLK、GND、3.3V分别连接STM32的对应引脚。Keil配置点击Options for Target魔术棒图标-Debug选项卡。选择你的调试器如ST-Link Debugger。点击Settings在Debug页确认SWD协议和芯片被识别。在Flash Download页勾选Reset and Run这样下载后程序会自动运行。下载程序点击LoadF8或Download按钮。看到Flash Load finished at ...即表示成功。连接串口调试助手将USB转TTL模块插入电脑USB口。打开设备管理器查看分配的COM口号如COM3。打开串口调试助手如Putty选择正确的COM口波特率设置为9600数据位8停止位1无校验无流控。打开串口。4.3 功能测试与问题排查现在是最激动人心的时刻。给开发板上电。预期现象1OLED屏幕点亮显示UART CMD TEST和Waiting...。预期现象2板载LEDPA5处于熄灭状态。在串口调试助手的发送框中输入LED_ON然后点击发送确保发送选项是“发送新行”即包含\r\n。预期现象3板载LED立即点亮。预期现象4OLED屏幕刷新第一行显示CMD Received:第二行显示LED_ON。预期现象5串口调试助手的接收框显示LED is ON。发送LED_OFFLED应熄灭OLED更新显示串口返回LED is OFF。如果任何一步不符合预期请按以下思路排查OLED不显示检查I2C接线SCL、SDA是否接反、虚焊。用万用表测量OLED模块VCC是否有3.3V。在代码中检查SSD1306_I2C_ADDR地址是否正确。可以写一个简单的I2C扫描程序来探测设备地址。检查ssd1306.c中的初始化序列是否与你的屏幕型号匹配。串口无反应检查USB-TTL的TX/RX线与STM32的PA9/PA10是否交叉连接正确。检查串口助手参数波特率、COM口是否设置正确。尝试发送其他字符在串口中断回调函数中设置断点看是否能进入中断。检查huart1实例在CubeMX中是否已正确关联USART1。LED不亮/不灭检查LED对应的GPIO引脚PA5配置是否为输出模式。使用万用表测量该引脚在发送命令前后的电压变化灭时应为高电平~3.3V亮时应为低电平~0V。确认USER_LED_GPIO_Port和USER_LED_Pin这两个宏定义是否在main.h中正确生成。调试过程就是不断假设、验证、修正的过程。充分利用Keil的在线调试功能设置断点、查看变量、单步执行能极大提升效率。记得硬件问题往往比软件问题更常见耐心检查每一根连线。5. 项目优化与扩展思路当基础功能跑通后我们可以从稳定性、可维护性和功能扩展性上思考如何让这个小项目变得更“专业”。5.1 代码结构优化目前的逻辑都写在main.c里随着功能增加会变得臃肿。良好的模块化是必须的。创建命令解析模块新建command_parser.h和command_parser.c。在头文件中定义命令枚举和解析函数typedef enum {CMD_LED_ON, CMD_LED_OFF, CMD_UNKNOWN} Command_t; Command_t ParseCommand(char* str);在.c文件中实现ParseCommand函数使用strcmp或更高效的查找算法如字典树来匹配命令。创建显示管理模块新建display_manager.h和display_manager.c。封装OLED显示的各种页面如ShowWelcomePage(),ShowCommandPage(char* cmd),ShowErrorPage(char* err)。这样主循环中只需调用ShowCommandPage(uart_rx_buffer)显示逻辑被隔离易于修改。5.2 通信协议与稳定性增强我们目前用\r\n作为命令结束符这在简单的调试中可行但不够健壮。添加帧头帧尾例如定义命令格式为命令字符串$。在串口中断中只有检测到以开始、以$结束的数据才被认为是有效命令。这能有效过滤干扰数据。实现环形缓冲区当前线性数组在快速接收数据时可能溢出。实现一个环形缓冲区FIFO来接收串口数据由后台任务从缓冲区中取出并解析完整帧。HAL库本身支持DMA空闲中断的方式接收不定长数据这是更高级、更高效的做法。增加校验和在帧尾加入一个简单的校验和如所有字节的异或值接收方验证校验和不正确则丢弃提高通信可靠性。5.3 功能扩展实战在这个框架上你可以轻松添加更多功能把它变成一个小型物联网终端。控制多个LED或继电器定义命令如LED1_ON,LED2_OFF在解析函数中增加分支控制不同的GPIO引脚。读取传感器并显示接入一个温湿度传感器如DHT11单总线协议或光照传感器BH1750I2C协议。定时读取传感器数据并显示在OLED上。可以定义命令GET_TEMP来主动查询。实现PWM调光将LED的控制从简单的开关改为PWM输出。定义命令LED_BRIGHT 50解析数字参数调用HAL_TIM_PWM_Start和__HAL_TIM_SET_COMPARE函数来设置占空比实现LED亮度调节。这涉及到TIM定时器PWM模式的配置。与上位机交互设计一个简单的文本协议或JSON格式的命令集。上位机电脑上的Python/C#程序可以发送更复杂的指令STM32解析后执行并返回结构化的数据如{status:ok, led:on, temp:25}。这为后续开发图形化控制界面打下了基础。项目做完了灯亮了字显示了但这只是开始。我自己的经验是第一个能稳定运行的项目其价值远超它本身的功能。它给你建立了从硬件到软件、从配置到调试的完整信心链条。下次当你面对更复杂的传感器、通信协议如SPI、CAN或实时操作系统RTOS时你会知道所有复杂系统都是由这样一个个简单的“输入-处理-输出”环节构建起来的。不妨试着去实现一下PWM调光当你看到LED的亮度能随着你的命令平滑变化时那种对硬件直接编程的掌控感正是嵌入式开发的乐趣所在。

相关新闻

新手福音:在快马平台用一句话让AI教你编写第一个Python类

新手福音:在快马平台用一句话让AI教你编写第一个Python类

作为一个刚开始接触编程的新手,我最近对Python中的“类”这个概念特别感兴趣,但又觉得它有点抽象。老师总说类是面向对象编程的基石,封装、继承、多态这些概念都从这里开始。道理我懂,但自己动手写的时候,总感觉无从下…

2026/7/2 23:20:29 阅读更多 →
Dark Reader:重新定义屏幕保护的数字健康方案

Dark Reader:重新定义屏幕保护的数字健康方案

Dark Reader:重新定义屏幕保护的数字健康方案 【免费下载链接】darkreader Dark Reader Chrome and Firefox extension 项目地址: https://gitcode.com/gh_mirrors/da/darkreader 在数字时代,我们每天面对屏幕的时间超过8小时,眼睛承受…

2026/5/17 9:34:24 阅读更多 →
深入解析 cherry.studio 系统提示词:技术原理与最佳实践

深入解析 cherry.studio 系统提示词:技术原理与最佳实践

在构建和优化基于大语言模型的AI应用时,系统提示词(System Prompt)扮演着至关重要的角色。它就像是给AI模型下达的一份“核心指令集”或“角色设定”,决定了模型在对话或任务执行中的行为基线、知识边界和响应风格。今天&#xff…

2026/5/17 9:34:23 阅读更多 →

最新新闻

如何在Windows家庭版上启用专业级远程桌面:RDP Wrapper Library终极指南(2024版)

如何在Windows家庭版上启用专业级远程桌面:RDP Wrapper Library终极指南(2024版)

如何在Windows家庭版上启用专业级远程桌面:RDP Wrapper Library终极指南(2024版) 【免费下载链接】rdpwrap RDP Wrapper Library 项目地址: https://gitcode.com/gh_mirrors/rd/rdpwrap 你是否曾经因为Windows家庭版无法使用远程桌面功…

2026/7/5 0:21:46 阅读更多 →
2025年Nmap渗透测试实战指南:从基础扫描到高级规避技术

2025年Nmap渗透测试实战指南:从基础扫描到高级规避技术

1. 项目概述:为什么Nmap依然是渗透测试的基石如果你在网络安全这个行当里待过一阵子,或者哪怕只是刚入门,大概率都听过Nmap这个名字。它就像木匠手里的锤子,厨师手里的刀,是那种你明知道它“古老”,但每次开…

2026/7/5 0:17:44 阅读更多 →
WPF可视化设计工具终极指南:如何用WpfDesigner让界面开发效率提升3倍?

WPF可视化设计工具终极指南:如何用WpfDesigner让界面开发效率提升3倍?

WPF可视化设计工具终极指南:如何用WpfDesigner让界面开发效率提升3倍? 【免费下载链接】WpfDesigner The WPF Designer from SharpDevelop 项目地址: https://gitcode.com/gh_mirrors/wp/WpfDesigner 还在为WPF界面开发中的繁琐XAML代码而烦恼吗&…

2026/7/5 0:15:43 阅读更多 →
基于YOLOv8的猫狗品种识别系统开发实战

基于YOLOv8的猫狗品种识别系统开发实战

1. 项目概述:基于YOLOv8的猫狗品种识别系统这个项目本质上是一个计算机视觉领域的典型应用——利用YOLOv8目标检测算法实现猫狗品种的自动识别。我在实际部署中发现,相比传统图像处理方法,深度学习方案在复杂场景下的识别准确率能提升40%以上…

2026/7/5 0:13:42 阅读更多 →
从零实现SHA-1哈希算法:原理、代码与性能优化实战

从零实现SHA-1哈希算法:原理、代码与性能优化实战

1. 项目概述:从“知其然”到“知其所以然”的SHA-1实现之旅在信息安全领域,哈希算法扮演着数据完整性校验和数字签名的基石角色。SHA-1(Secure Hash Algorithm 1)作为曾经的主流算法,虽然因其安全性问题已不再被推荐用…

2026/7/5 0:13:42 阅读更多 →
SillyTavern企业级AI对话前端部署指南:5步构建高可用架构

SillyTavern企业级AI对话前端部署指南:5步构建高可用架构

SillyTavern企业级AI对话前端部署指南:5步构建高可用架构 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern SillyTavern作为面向高级用户的LLM前端界面,为企业AI对话系…

2026/7/5 0:11:41 阅读更多 →

日新闻

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

月新闻