当前位置: 首页 > article >正文

STM32 的IIC通信接收和发送详解

STM32 的 IIC 通信IIC 接收和发送详解1. 前言IIC也常写作 I2C是单片机开发中非常常用的一种同步串行通信协议。在 STM32 项目中很多外设模块都会使用 IIC 通信例如OLED 显示屏EEPROM 存储芯片MPU6050 姿态传感器SHT30 温湿度传感器PCF8574 IO 扩展芯片RTC 时钟芯片。本文主要基于STM32 标准外设库讲解 STM32 的 IIC 通信发送和接收过程。示例芯片以STM32F103 系列为例使用I2C1外设。I2C1 默认常用引脚如下功能引脚I2C1_SCLPB6I2C1_SDAPB7本文重点讲解IIC 通信的基本原理STM32 标准库 I2C 初始化IIC 发送一个字节的流程IIC 读取一个字节的流程IIC 读写寄存器的典型代码ACK、NACK、START、STOP 的作用STM32 硬件 I2C 常见问题。2. IIC 通信的基本概念IIC 是一种双线制同步串行通信协议。它只需要两根信号线信号线作用SCL时钟线SDA数据线其中SCL由主机产生时钟SDA用于传输数据通信双方必须共地SCL 和 SDA 都需要上拉电阻。典型连接如下STM32_PB6 / SCL --- 外设_SCL STM32_PB7 / SDA --- 外设_SDA STM32_GND --- 外设_GNDIIC 总线上可以挂多个从机设备。每个从机设备通过不同的设备地址区分。3. IIC 为什么需要上拉电阻IIC 的 SCL 和 SDA 通常是开漏输出结构。开漏输出只能主动拉低电平不能主动输出高电平。所以IIC 总线要想出现高电平就必须依靠外部上拉电阻。简单理解输出低电平设备主动把总线拉低 输出高电平设备松开总线由上拉电阻拉高这也是 IIC 可以实现多设备挂在同一条总线上的原因。多个设备都可以拉低总线但不会主动推高总线从而减少总线冲突。常见上拉电阻取值4.7kΩ 或 10kΩ如果通信速度较高、线路较长、总线电容较大可以适当减小上拉电阻。4. IIC 通信时序核心一次完整的 IIC 通信通常包含以下几个部分起始信号 START ↓ 发送设备地址 ↓ 发送读写方向位 ↓ 等待 ACK 应答 ↓ 发送或接收数据 ↓ 停止信号 STOP4.1 START 起始信号当 SCL 为高电平时SDA 从高电平跳变到低电平表示起始信号。SCL 1 SDA: 1 - 0主机发送 START 后说明一次 IIC 通信开始。4.2 STOP 停止信号当 SCL 为高电平时SDA 从低电平跳变到高电平表示停止信号。SCL 1 SDA: 0 - 1主机发送 STOP 后说明本次 IIC 通信结束。4.3 ACK 应答信号IIC 每发送 8 位数据后接收方需要返回 1 位应答。应答含义ACK接收成功继续通信NACK不再继续接收准备结束通信ACK 通常表现为第 9 个时钟周期SDA 被拉低NACK 通常表现为第 9 个时钟周期SDA 保持高电平在 STM32 读取最后一个字节时通常需要发送 NACK然后产生 STOP 信号告诉从机接收结束。5. IIC 设备地址说明IIC 从机设备通常有一个 7 位地址。例如某些 EEPROM 的地址可能是0x50但是在实际发送时IIC 总线上发送的是7 位设备地址 1 位读写位其中方向读写位写0读1在 STM32 标准库中I2C_Send7bitAddress()函数会帮我们处理读写方向位。例如I2C_Send7bitAddress(I2C1,0x501,I2C_Direction_Transmitter);这里很多资料会把 7 位地址左移一位。因为标准库函数内部使用的是 8 位地址格式最低位留给读写方向位。所以实际使用时要特别注意模块资料中的地址写法有些资料给的是 7 位地址有些资料给的是已经左移过的 8 位地址。地址写错是 IIC 通信失败最常见的原因之一。6. STM32 I2C1 初始化流程使用 STM32 标准库配置硬件 I2C一般需要完成以下步骤开启 GPIOB 和 I2C1 外设时钟配置 PB6、PB7 为复用开漏输出配置 I2C 工作模式配置 I2C 时钟速率配置 ACK 使能使能 I2C1 外设。7. I2C1 初始化代码下面是基于 STM32F103 标准库的 I2C1 初始化代码。#includestm32f10x.hvoidI2C1_Init_Config(void){GPIO_InitTypeDef GPIO_InitStructure;I2C_InitTypeDef I2C_InitStructure;/* 1. 开启 GPIOB 和 I2C1 时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);/* 2. 配置 PB6、PB7 为复用开漏输出 */GPIO_InitStructure.GPIO_PinGPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AF_OD;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStructure);/* 3. 配置 I2C1 参数 */I2C_InitStructure.I2C_ModeI2C_Mode_I2C;I2C_InitStructure.I2C_DutyCycleI2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress10x00;I2C_InitStructure.I2C_AckI2C_Ack_Enable;I2C_InitStructure.I2C_AcknowledgedAddressI2C_AcknowledgedAddress_7bit;I2C_InitStructure.I2C_ClockSpeed100000;I2C_Init(I2C1,I2C_InitStructure);/* 4. 使能 I2C1 */I2C_Cmd(I2C1,ENABLE);}这里设置的 IIC 速率为100kHz这属于标准模式。如果外设支持也可以配置成 400kHz 快速模式。8. IIC 发送数据的基本流程STM32 作为主机向从机发送一个字节基本流程如下产生 START ↓ 等待 EV5 ↓ 发送从机地址 写方向 ↓ 等待 EV6 ↓ 发送寄存器地址 ↓ 等待 EV8 ↓ 发送数据 ↓ 等待 EV8_2 ↓ 产生 STOP标准库中常见事件如下事件含义I2C_EVENT_MASTER_MODE_SELECT起始信号已发送主模式已选择I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED从机地址已发送写模式已选择I2C_EVENT_MASTER_BYTE_TRANSMITTING正在发送数据I2C_EVENT_MASTER_BYTE_TRANSMITTED数据发送完成这些事件本质上是对 I2C 状态寄存器标志位的组合判断。使用标准库时可以通过I2C_CheckEvent()进行检测。9. IIC 写一个寄存器很多 IIC 设备都是通过寄存器读写控制的。例如向某个传感器的寄存器写入配置值。通用写寄存器函数如下voidI2C1_WriteReg(uint8_tdev_addr,uint8_treg_addr,uint8_tdata){/* 1. 等待 I2C 总线空闲 */while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));/* 2. 产生起始信号 */I2C_GenerateSTART(I2C1,ENABLE);/* 3. 等待 EV5主模式选择 */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));/* 4. 发送从机地址写方向 */I2C_Send7bitAddress(I2C1,dev_addr1,I2C_Direction_Transmitter);/* 5. 等待 EV6发送器模式选择 */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));/* 6. 发送寄存器地址 */I2C_SendData(I2C1,reg_addr);/* 7. 等待数据发送中 */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTING));/* 8. 发送数据 */I2C_SendData(I2C1,data);/* 9. 等待数据发送完成 */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));/* 10. 产生停止信号 */I2C_GenerateSTOP(I2C1,ENABLE);}调用示例I2C1_WriteReg(0x68,0x6B,0x00);这表示向设备地址0x68的从机中寄存器0x6B写入数据0x00。10. IIC 接收数据的基本流程STM32 从 IIC 从机读取一个寄存器的数据通常需要两步第一步先告诉从机要读取哪个寄存器。START ↓ 设备地址 写方向 ↓ 寄存器地址第二步重新产生起始信号然后切换为读方向读取数据。Repeated START ↓ 设备地址 读方向 ↓ 读取数据 ↓ NACK ↓ STOP这里的第二个 START 叫重复起始信号也叫 Repeated START。它的作用是不释放总线直接从写寄存器地址切换到读数据。11. IIC 读取一个寄存器下面是读取单个寄存器的通用函数。uint8_tI2C1_ReadReg(uint8_tdev_addr,uint8_treg_addr){uint8_tdata;/* 1. 等待 I2C 总线空闲 */while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));/* 2. 产生起始信号 */I2C_GenerateSTART(I2C1,ENABLE);/* 3. 等待 EV5 */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));/* 4. 发送从机地址写方向 */I2C_Send7bitAddress(I2C1,dev_addr1,I2C_Direction_Transmitter);/* 5. 等待 EV6 */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));/* 6. 发送要读取的寄存器地址 */I2C_SendData(I2C1,reg_addr);/* 7. 等待寄存器地址发送完成 */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));/* 8. 再次产生起始信号也就是重复起始 */I2C_GenerateSTART(I2C1,ENABLE);/* 9. 等待 EV5 */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));/* 10. 发送从机地址读方向 */I2C_Send7bitAddress(I2C1,dev_addr1,I2C_Direction_Receiver);/* 11. 等待 EV6 */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));/* 12. 读取最后一个字节前关闭 ACK */I2C_AcknowledgeConfig(I2C1,DISABLE);/* 13. 产生停止信号 */I2C_GenerateSTOP(I2C1,ENABLE);/* 14. 等待接收数据 */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));/* 15. 读取数据 */dataI2C_ReceiveData(I2C1);/* 16. 重新开启 ACK方便下一次通信 */I2C_AcknowledgeConfig(I2C1,ENABLE);returndata;}调用示例uint8_tid;idI2C1_ReadReg(0x68,0x75);这表示读取设备地址0x68的寄存器0x75。如果是 MPU60500x75是 WHO_AM_I 寄存器正常情况下可以读到设备 ID。12. 多字节连续读取很多传感器数据不是一个字节而是多个字节。例如 MPU6050 的加速度、陀螺仪数据通常需要连续读取多个寄存器。多字节读取的基本流程如下START ↓ 设备地址 写 ↓ 起始寄存器地址 ↓ Repeated START ↓ 设备地址 读 ↓ 连续读取多个字节 ↓ 最后一个字节发送 NACK ↓ STOP示例函数如下voidI2C1_ReadMultiReg(uint8_tdev_addr,uint8_treg_addr,uint8_t*buf,uint8_tlen){uint8_ti;while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));I2C_GenerateSTART(I2C1,ENABLE);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));I2C_Send7bitAddress(I2C1,dev_addr1,I2C_Direction_Transmitter);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));I2C_SendData(I2C1,reg_addr);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));I2C_GenerateSTART(I2C1,ENABLE);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));I2C_Send7bitAddress(I2C1,dev_addr1,I2C_Direction_Receiver);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));for(i0;ilen;i){if(ilen-1){I2C_AcknowledgeConfig(I2C1,DISABLE);I2C_GenerateSTOP(I2C1,ENABLE);}while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));buf[i]I2C_ReceiveData(I2C1);}I2C_AcknowledgeConfig(I2C1,ENABLE);}使用示例uint8_tbuf[6];I2C1_ReadMultiReg(0x68,0x3B,buf,6);这表示从设备0x68的寄存器0x3B开始连续读取 6 个字节。13. IIC 发送和接收的技术总结13.1 写数据流程IIC 写数据的核心是START ↓ 设备地址 写 ↓ 寄存器地址 ↓ 数据 ↓ STOP对应标准库函数流程I2C_GenerateSTART()I2C_Send7bitAddress(...,I2C_Direction_Transmitter)I2C_SendData(reg_addr)I2C_SendData(data)I2C_GenerateSTOP()13.2 读数据流程IIC 读数据的核心是START ↓ 设备地址 写 ↓ 寄存器地址 ↓ Repeated START ↓ 设备地址 读 ↓ 读取数据 ↓ NACK ↓ STOP对应标准库函数流程I2C_GenerateSTART()I2C_Send7bitAddress(...,I2C_Direction_Transmitter)I2C_SendData(reg_addr)I2C_GenerateSTART()I2C_Send7bitAddress(...,I2C_Direction_Receiver)I2C_ReceiveData()I2C_GenerateSTOP()读操作看起来比写操作复杂主要原因是读取寄存器前需要先告诉从机要读哪个寄存器。所以读寄存器通常不是直接读而是先写寄存器地址再切换成读方向。14. STM32 硬件 I2C 常见问题14.1 IIC 总线一直忙常见原因SDA 被从机拉低上一次通信异常没有正确产生 STOP外设复位后状态不一致总线上某个设备异常上拉电阻不合适。解决思路检查 SDA 和 SCL 空闲时是否为高电平重新初始化 I2C 外设必要时手动模拟 SCL 释放总线确认从机供电正常。14.2 IIC 没有 ACK常见原因从机地址写错7 位地址和 8 位地址混淆SCL / SDA 接反没有共地从机模块没有供电上拉电阻缺失从机还没有完成内部初始化。其中最常见的是设备地址写错如果数据手册给的是 7 位地址使用标准库时通常需要左移一位。14.3 读取数据一直为 0xFF常见原因SDA 没有被从机正确拉低从机没有响应上拉电阻过大读写方向设置错误读取的寄存器地址错误ACK / NACK 处理不正确。14.4 程序卡在 while 等待事件例如程序卡在while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));常见原因没有收到从机 ACK从机地址错误总线时序异常I2C 外设状态异常硬件连接问题。实际项目中建议给while等待增加超时机制避免程序永久卡死。例如uint32_ttimeout10000;while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){if(timeout--0){return;}}15. 为什么很多项目更喜欢软件 IICSTM32F1 系列的硬件 I2C 在一些项目中比较容易遇到总线忙、状态卡死等问题。所以很多教程和开源项目会使用软件 IIC。软件 IIC 的优点时序可控移植方便出问题更容易调试不依赖具体硬件 I2C 外设适合 OLED、MPU6050、EEPROM 等低速设备。硬件 IIC 的优点占用 CPU 更少速度更稳定适合中高速通信更适合规范的工程项目。简单来说新手学习、低速模块软件 IIC 更好调 工程项目、数据量较大硬件 IIC 更规范本文使用的是 STM32 标准库硬件 I2C重点是帮助理解 IIC 外设发送和接收的完整流程。16. 小结IIC 通信的核心并不复杂。写数据时主机发送START 设备地址写 寄存器地址 数据 STOP读数据时主机发送START 设备地址写 寄存器地址 Repeated START 设备地址读 数据 STOP在 STM32 标准库中需要重点掌握以下函数函数作用I2C_GenerateSTART()产生起始信号I2C_GenerateSTOP()产生停止信号I2C_Send7bitAddress()发送从机地址I2C_SendData()发送数据I2C_ReceiveData()接收数据I2C_CheckEvent()检查 I2C 事件I2C_AcknowledgeConfig()配置 ACK 应答对于初学者来说建议按照下面的顺序学习IIC 基本时序 ↓ START / STOP / ACK ↓ 设备地址 ↓ 写一个寄存器 ↓ 读一个寄存器 ↓ 连续读取多个寄存器 ↓ 加入超时机制和错误处理只要把 IIC 的写寄存器和读寄存器流程搞清楚后面使用 OLED、MPU6050、EEPROM、温湿度传感器都会更加容易。

相关文章:

STM32 的IIC通信接收和发送详解

STM32 的 IIC 通信:IIC 接收和发送详解 1. 前言 IIC,也常写作 I2C,是单片机开发中非常常用的一种同步串行通信协议。 在 STM32 项目中,很多外设模块都会使用 IIC 通信,例如: OLED 显示屏;EEPROM…...

如何用QTTabBar彻底告别Windows资源管理器的混乱:一个完整的高效文件管理解决方案

如何用QTTabBar彻底告别Windows资源管理器的混乱:一个完整的高效文件管理解决方案 【免费下载链接】qttabbar QTTabBar is a small tool that allows you to use tab multi label function in Windows Explorer. https://www.yuque.com/indiff/qttabbar 项目地址:…...

淘金币自动化助手架构深度解析:基于Auto.js的移动端自动化工程实践

淘金币自动化助手架构深度解析:基于Auto.js的移动端自动化工程实践 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本,包含蚂蚁森林收取能量,芭芭农场全任务,解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojin…...

DLSS Swapper终极指南:一键管理游戏图形增强文件,释放显卡全部性能

DLSS Swapper终极指南:一键管理游戏图形增强文件,释放显卡全部性能 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专为游戏玩家设计的智能图形增强文件管理工具,…...

【2026年5月16日最新】别再用Cursor了!这5款AI编程神器让我效率暴涨300%

2026年5月,AI编程工具迎来了史诗级更新潮。OpenAI发布GPT-5.5后,代码理解和工程重构能力达到历史最强;字节跳动Trae凭借全链路AI原生IDE和免费无限制政策迅速崛起;DeepSeek V4更是用极致算法效率撕开了算力铁幕 。作为一名每天和代…...

开源笔记Memos与AI助手Copaw集成:打造自动化知识管理工作流

1. 项目概述:当开源笔记遇上AI助手最近在折腾个人知识管理工具,发现一个挺有意思的组合:Hailpeng的copaw-memos-integration。简单来说,它把两个独立但都很棒的工具给“焊”在了一起。一边是Memos,一个极简、开源、自部…...

【CTF】【Misc 文件类型】工具与流程

工具准备 本人为方便 CTF 部分 Misc 类型的解题,制作如下集成软件。本软件集成常用功能,能一站式解决大多数 Misc 文件类问题,省去切换工具的繁琐流程,大大提高解题效率,且界面简洁易用。且预留了拓展接口,…...

[实战] 制造业全尺寸报告(Full Dimension Report)编制规范与数字化处理流程详解

在 2026 年的精密制造与质量管理体系中,全尺寸报告(Full Dimension Report,简称 FDR)已成为首件检验(FAI)和生产件批准程序(PPAP)中不可或缺的核心文档。今天分享一下在数字化工厂环…...

STM32 FSMC/FMC接口详解:地址映射、时序配置与实战优化

1. 项目概述:深入理解STM32的FSMC/FMC接口在嵌入式开发中,尤其是涉及大屏显示、高速数据采集或复杂外部设备交互的项目里,我们常常会遇到一个绕不开的“硬骨头”——如何让STM32单片机高效、稳定地与外部并行存储器或设备通信。这时&#xff…...

Harnessclaw:轻量级自动化工作流编排工具,告别脚本泥潭

1. 项目概述:一个被低估的自动化利器如果你经常在GitHub上寻找一些能解决实际问题的工具,可能会发现一个现象:很多名字看起来平平无奇、甚至有点“怪”的项目,往往藏着巨大的潜力。harnessclaw/harnessclaw就是这样一个典型的例子…...

终极无边框游戏窗口指南:三步实现无缝多任务体验

终极无边框游戏窗口指南:三步实现无缝多任务体验 【免费下载链接】Borderless-Gaming Play your favorite games in a borderless window; no more time consuming alt-tabs. 项目地址: https://gitcode.com/gh_mirrors/bo/Borderless-Gaming 你是否厌倦了在…...

本地部署Qwen大模型:从量化加载到性能优化的完整实践指南

1. 项目概述:从开源大模型到个人AI助手的跃迁最近在折腾本地部署大语言模型,发现了一个宝藏项目——QwenLM/Qwen。这可不是一个简单的模型仓库,而是一个由通义千问团队打造的开源大语言模型家族。简单来说,它让你能在自己的电脑或…...

【NotebookLM食品科研提效指南】:3天内将文献综述效率提升300%的5个隐藏技巧

更多请点击: https://codechina.net 第一章:NotebookLM食品科学研究的范式变革 传统食品科学研究长期依赖人工文献综述、实验数据孤立归档与跨模态信息割裂分析,导致知识发现周期长、可复现性弱、跨学科协同成本高。NotebookLM 的引入正从根…...

系统级开发中的夜间MVP构建与Boneyard归档实践

1. 项目概述:一个名为“Boneyard”的夜间MVP构建最近在开源社区里,我注意到一个挺有意思的项目,叫sys-fairy-eve/nightly-mvp-2026-04-05-boneyard。光看这个标题,信息量就很大,它像是一个系统构建流水线上的一个特定快…...

构建自主支付智能体:从事件驱动架构到安全实践

1. 项目概述:一个能自主处理支付的智能体最近在开源社区里,我注意到一个挺有意思的项目,叫sentient-agi/agentic-payments-bot。光看这个名字,就能嗅到一股前沿技术融合的味道——“Sentient AGI”(感知型通用人工智能…...

从热设计小白到专家:我是如何用RC6-4-01这颗TEC搞定激光器温控的(真实项目复盘)

从热设计小白到专家:我是如何用RC6-4-01这颗TEC搞定激光器温控的(真实项目复盘) 激光器温控从来不是简单的"制冷片贴上去就行"。去年接手某光纤激光器项目时,面对客户要求的0.1℃控温精度,我盯着规格书里密密…...

高校图书馆未公开的Perplexity学术协议:解锁DOI深度解析、跨库引文追踪与灰色文献捕获权限

更多请点击: https://codechina.net 第一章:高校图书馆未公开的Perplexity学术协议全景解析 Perplexity学术协议并非官方发布的标准规范,而是国内部分高校图书馆在采购或对接Perplexity Pro教育版API服务时,经谈判形成的定制化协…...

林调报告生成慢?文献综述耗时长?NotebookLM林业科研加速器已上线,72小时实测效率提升3.8倍

更多请点击: https://kaifayun.com 第一章:NotebookLM林业科学研究 NotebookLM 是 Google 推出的基于 AI 的研究协作者工具,专为深度阅读与知识整合设计。在林业科学研究中,它可高效处理林学文献、野外调查报告、遥感数据说明书、…...

2025届学术党必备的降AI率网站实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在数字化的这个时代当中,网站内容的原创性以及独特性越来越越来越受到重视了&am…...

终极指南:如何利用Play Integrity API构建专业级Android安全检测工具

终极指南:如何利用Play Integrity API构建专业级Android安全检测工具 【免费下载链接】play-integrity-checker-app Get info about your Device Integrity through the Play Intergrity API 项目地址: https://gitcode.com/gh_mirrors/pl/play-integrity-checker…...

为什么你的NotebookLM总“读不懂”Nature论文?生信老炮拆解7类专业语义断层及5种Prompt工程修复方案

更多请点击: https://kaifayun.com 第一章:NotebookLM生物技术研究 NotebookLM 是 Google 推出的基于 AI 的研究协作者工具,专为知识密集型工作流设计。在生物技术领域,它可高效整合海量文献、实验报告与基因组数据库摘要&#x…...

FanControl传感器检测失败?从新手到专家的完整修复指南

FanControl传感器检测失败?从新手到专家的完整修复指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…...

别再死记硬背了!图解贪心算法:用‘小船过河’和‘区间覆盖’带你掌握核心思想

贪心算法实战:从生活场景到代码实现的思维跃迁 想象一下周末野餐时分配三明治的场景:你有一堆大小不一的三明治和一群饥饿的朋友。为了让最多人吃到食物,你会优先把小块三明治分给食量小的朋友——这种看似简单的决策背后,隐藏着计…...

从SystemTap到ftrace:为什么Linux内核‘原装’的追踪工具更适合日常调试?

从SystemTap到ftrace:为什么Linux内核原生追踪工具更适合日常调试? 在Linux内核开发与性能优化领域,追踪工具的选择往往决定了问题排查的效率与系统稳定性。当面对SystemTap、eBPF/BCC和ftrace等工具时,资深开发者常陷入选择困境—…...

Node.js调用Llama.cpp:本地部署大语言模型的完整指南

1. 项目概述:当Llama遇见Node.js如果你最近在折腾大语言模型(LLM)的本地部署,特别是对Meta的Llama系列模型情有独钟,同时又是一名Node.js开发者,那么你很可能已经听说过或者正在寻找一个像withcatai/node-l…...

智能代理模式在渗透测试中的应用:pentestagent架构解析与实战

1. 项目概述与核心价值最近在安全测试和红队演练的圈子里,一个名为GH05TCREW/pentestagent的项目开始被频繁提及。乍一看这个名字,你可能会觉得它又是一个普通的渗透测试工具集,但当你真正深入去研究和使用它时,会发现它的设计理念…...

OpenDAN个人AI操作系统:从零构建智能体协作框架

1. 项目概述:个人AI操作系统的诞生与愿景最近在GitHub上看到一个项目,叫“OpenDAN-Personal-AI-OS”,第一眼看到这个标题,我就被吸引住了。作为一个在软件开发和AI应用领域摸爬滚打了十多年的从业者,我见过太多“AI助手…...

3分钟解决Windows软件兼容性难题:Visual C++运行库一键修复全攻略

3分钟解决Windows软件兼容性难题:Visual C运行库一键修复全攻略 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾因游戏无法启动而沮丧&#…...

别再死记硬背了!用SPSS搞定系统聚类法,手把手教你从数据录入到谱系图解读

SPSS系统聚类法实战:从数据导入到商业解读的全流程指南 当你的数学建模作业截止日期临近,或者老板突然要求对市场调研数据进行分类分析时,系统聚类法往往是救命稻草。但传统教材中复杂的距离矩阵计算和迭代过程,常让初学者望而生畏…...

告别纯视觉追踪:手把手教你用Refer-KITTI数据集复现RMOT实验(含环境配置避坑指南)

告别纯视觉追踪:手把手教你用Refer-KITTI数据集复现RMOT实验(含环境配置避坑指南) 在计算机视觉领域,多目标跟踪(Multi-Object Tracking, MOT)一直是研究热点,而近年来结合语言特征的Referring Multi-Object Tracking(…...