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

STM32 通过I2C 读写EEPR0M AT24C02

一、I2C简介两线式串行总线属于同步通信共用主机时钟SCL每个连接到I2C总线上的设备都有一个唯一的地址SCL、SDA均需要接上拉电阻设备空闲均输出高电平传输速率标准模式下100Kbit/sI2C协议I2C 的协议定义了通信的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。在SCL高电平时数据有效3.每次数据传输都以字节为单位每次传输的字节数不受限制。4.起始信号SCL高电平时SDA产生下降沿5.停止信号SCL高电平时SDA产生上升沿6.应答信号传输数据的第九位时由从机拉低SDA,在SCL高电平时读SDA如果是低电平就表示应答每个字节必须保证为8位长度每传输一帧为9位 8位1位应答数据传输时先传输最高位寻址字节是起始信号后的第一个字节1要针对哪个从机 2读还是写从机地址分为固定部分可编程部分举例读取一个字节的流程1~11完全和c这种组合方式一致如写数据的过程和a这种组合方式一致二、EEPR0M AT24C02I2C接口介绍硬件介绍使用软件模拟I2C时序。这里设计的上拉电阻为10K:三、工程实现新建文件夹及文件iic.h#ifndef __IIC_H #define __IIC_H #include system.h /* IIC_SCL时钟端口、引脚定义 */ #define IIC_SCL_PORT GPIOB #define IIC_SCL_PIN (GPIO_Pin_10) #define IIC_SCL_PORT_RCC RCC_APB2Periph_GPIOB //为了使能端口时钟 /* IIC_SDA时钟端口、引脚定义 */ #define IIC_SDA_PORT GPIOB #define IIC_SDA_PIN (GPIO_Pin_11) #define IIC_SDA_PORT_RCC RCC_APB2Periph_GPIOB //IO操作函数 使用位带操作 #define IIC_SCL PBout(10) //SCL #define IIC_SDA PBout(11) //SDA #define READ_SDA PBin(11) //输入SDA /* IIC所有操作函数 */ void IIC_Init(void); //初始化IIC的IO口 void IIC_Start(void); //发送IIC开始信号 void IIC_Stop(void); //发送IIC停止信号 void IIC_Send_Byte(u8 txd); //IIC发送一个字节 u8 IIC_Read_Byte(u8 ack); //IIC读取一个字节 u8 IIC_Wait_Ack(void); //IIC等待ACK信号 void IIC_Ack(void); //IIC发送ACK信号 void IIC_NAck(void); //IIC不发送ACK信号,不应答 #endifiic.c#include iic.h #include SysTick.h //需要使用delay_us /* IIC所有操作函数 */ void IIC_Init(void) //初始化IIC的IO口 { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(IIC_SCL_PORT_RCC|IIC_SDA_PORT_RCC, ENABLE); //使能GPIOB端口时钟 GPIO_InitStructure.GPIO_Pin IIC_SCL_PIN; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; //配置为推挽输出 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(IIC_SCL_PORT, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin IIC_SDA_PIN; GPIO_Init(IIC_SDA_PORT, GPIO_InitStructure); //总线开始为空闲状态 IIC_SCL 1; IIC_SDA 1; } /******************************************************************************* * 函 数 名 : SDA_OUT * 函数功能 : SDA输出配置 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void SDA_OUT(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin IIC_SDA_PIN; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; //输出时配置为推挽输出 GPIO_Init(IIC_SDA_PORT, GPIO_InitStructure); } /******************************************************************************* * 函 数 名 : SDA_IN * 函数功能 : SDA输入配置 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void SDA_IN(void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin IIC_SDA_PIN; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU; //配置为上拉输入 GPIO_Init(IIC_SDA_PORT, GPIO_InitStructure); } void IIC_Start(void) //发送IIC开始信号 { SDA_OUT(); IIC_SDA 1; IIC_SCL 1; delay_us(5); IIC_SDA 0; //START:when CLK is high,DATA change form high to low 此处为起始信号 delay_us(6); IIC_SCL 0; //钳住I2C总线准备发送或接收数据 } void IIC_Stop(void) //发送IIC停止信号 { SDA_OUT(); IIC_SCL 0; IIC_SDA 0; //STOP:when CLK is high DATA change form low to high IIC_SCL 1; delay_us(6); IIC_SDA 1; //发送I2C总线结束信号 delay_us(6); } /******************************************************************************* * 函 数 名 : IIC_Wait_Ack * 函数功能 : 主机等待应答信号到来 * 输 入 : 无 * 输 出 : 1接收应答失败 0接收应答成功 *******************************************************************************/ u8 IIC_Wait_Ack(void) { u8 tempTime 0; IIC_SDA 1; //释放控制权 delay_us(1); SDA_IN(); //SDA设置为输入 IIC_SCL 1; //高电平开始检查应答信号 delay_us(1); while(READ_SDA) //如果读到被拉低则表示有应答 { tempTime; if(tempTime 250) { IIC_Stop(); return 1; //表示无应答 } } IIC_SCL 0; //时钟输出0 return 0; } /******************************************************************************* * 函 数 名 : IIC_Ack * 函数功能 : 主机产生ACK应答 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void IIC_Ack(void) { IIC_SCL 0; SDA_OUT(); IIC_SDA 0; delay_us(2); IIC_SCL 1; //时钟有效了延时一会后把IIC_SCL拉低表示应答信号 delay_us(5); IIC_SCL 0; } /******************************************************************************* * 函 数 名 : IIC_NAck * 函数功能 : 主机产生NACK非应答 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void IIC_NAck(void) { IIC_SCL 0; SDA_OUT(); IIC_SDA 1; delay_us(2); IIC_SCL 1; delay_us(5); IIC_SCL 0; } /******************************************************************************* * 函 数 名 : IIC_Send_Byte * 函数功能 : IIC发送一个字节 * 输 入 : txd发送一个字节 * 输 出 : 无 *******************************************************************************/ void IIC_Send_Byte(u8 txd) { u8 t; SDA_OUT(); IIC_SCL 0;//拉低时钟开始数据传输 for(t 0; t 8; t) { if((txd0x80) 0) //0x80 1000 0000 判断8位最高位是1还是0下一步是发送 IIC_SDA 1; else IIC_SDA 0; txd1; //将低位移到最高位等待下一位的发送 delay_us(2); //对TEA5767这三个延时都是必须的数据保持 IIC_SCL 1; //数据开始有效此时不能被更改 delay_us(2); IIC_SCL 0; //时钟为低电平数据失效 delay_us(2); } } /******************************************************************************* * 函 数 名 : IIC_Read_Byte * 函数功能 : IIC读一个字节 * 输 入 : ack1时发送ACKack0发送nACK * 输 出 : 应答或非应答 *******************************************************************************/ u8 IIC_Read_Byte(u8 ack) { u8 i, receive 0; SDA_IN(); //SDA设置为输入 for(i 0; i 8; i) { IIC_SCL 0; delay_us(2); IIC_SCL 1; //时钟有效开始读取IIC_SDA上的数据 receive1; //i 0时该左移无效 if(READ_SDA) receive; delay_us(1); } if(!ack) IIC_NAck(); //发送nACK else IIC_Ack(); //发送ACK return receive; }AT24Cxx.h#ifndef __AT24CXX_H #define __AT24CXX_H #include system.h #include iic.h #define AT24C01 127 #define AT24C02 255 //我们PZ6806L是这个 #define AT24C04 511 #define AT24C08 1023 #define AT24C16 2047 #define AT24C32 4095 #define AT24C64 8191 #define AT24C128 16383 #define AT24C256 32767 //开发板使用的是AT24C02所以定义EE_TYPE为AT24C02 #define EE_TYPE AT24C02 u8 AT24CXX_ReadOneByte(u16 ReadAddr); //指定地址读取一个字节 void AT24CXX_WriteOneByte(u16 WriteAddr, u8 DataToWrite); //指定地址写入一个字节 void AT24CXX_WriteLenByte(u16 WriteAddr, u32 DataToWrite,u8 Len); //指定地址开始写入指定长度的数据 u32 AT24CXX_ReadLenByte(u16 ReadAddr, u8 Len); //指定地址开始读取指定长度数据 void AT24CXX_Write(u16 WriteAddr,u8 *pBuffer, u16 NumToWrite); //从指定地址开始写入指定长度的数据 void AT24CXX_Read(u16 ReadAddr, u8 *pBuffer, u16 NumToRead); //从指定地址开始读出指定长度的数据 u8 AT24CXX_Check(void); //检查器件 void AT24CXX_Init(void); //初始化IIC #endifAT24Cxx.c#include AT24Cxx.h #include SysTick.h /******************************************************************************* * 函 数 名 : AT24CXX_Init * 函数功能 : AT24CXX初始化 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void AT24CXX_Init(void) { IIC_Init(); //IIC初始化 } /******************************************************************************* * 函 数 名 : AT24CXX_ReadOneByte * 函数功能 : 在AT24CXX指定地址读出一个数据 * 输 入 : ReadAddr:开始读数的地址 * 输 出 : 读到的数据 *******************************************************************************/ u8 AT24CXX_ReadOneByte(u16 ReadAddr) { u8 temp 0; //1.开始 IIC_Start(); if(EE_TYPE AT24C16) { IIC_Send_Byte(0xA0); //发送写命令 IIC_Wait_Ack(); IIC_Send_Byte(ReadAddr 8);//发送高地址 } else { // 对于AT24C02来讲ReadAddr范围0~255最大为255 //2.从机地址(写) IIC_Send_Byte(0xA0 ((ReadAddr/256) 1)); //发送器件地址0xA0,写数据 0xA0 ((ReadAddr/256) 1) 0xA0 } //3.等待从机应答信号 IIC_Wait_Ack(); //4.发送存储器的低地址(可以理解为数据) IIC_Send_Byte(ReadAddr % 256); //发送存储器的低地址注意和器件地址的区别 //5.等待从机应答信号 IIC_Wait_Ack(); //6.开始 IIC_Start(); //7.从机地址(读) IIC_Send_Byte(0xA1); //读数据 //8.等待从机应答信号 IIC_Wait_Ack(); //9.从机数据有效可以读取 //10.主机发送不应答信号在函数里实现 temp IIC_Read_Byte(0); //参数0表示不需要应答由主机发送 //11.停止 IIC_Stop(); //产生一个停止条件 return temp; } /******************************************************************************* * 函 数 名 : AT24CXX_WriteOneByte * 函数功能 : 在AT24CXX指定地址写入一个数据 * 输 入 : WriteAddr :写入数据的目的地址 DataToWrite:要写入的数据 * 输 出 : 无 *******************************************************************************/ void AT24CXX_WriteOneByte(u16 WriteAddr, u8 DataToWrite) { //1. IIC_Start(); if(EE_TYPE AT24C16) { IIC_Send_Byte(0xA0); //发送写命令 IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr 8); //发送高地址 } else { //2. IIC_Send_Byte(0xA0 ((WriteAddr/256) 1)); //发送器件地址0XA0,写数据,最低位为0 } //3. IIC_Wait_Ack(); //4. IIC_Send_Byte(WriteAddr % 256); //发送存储器低地址AT24C02为0~255 //5. IIC_Wait_Ack(); //6. IIC_Send_Byte(DataToWrite); //发送字节需要保存的数据8位 //7. IIC_Wait_Ack(); //8. IIC_Stop(); //产生一个停止条件 delay_ms(10); } /******************************************************************************* * 函 数 名 : AT24CXX_WriteLenByte * 函数功能 : 在AT24CXX里面的指定地址开始写入长度为Len的数据 用于写入16bit或者32bit的数据 * 输 入 : WriteAddr :写入数据的目的地址 DataToWrite:要写入的数据 Len :要写入数据的长度2,4 * 输 出 : 无 *******************************************************************************/ void AT24CXX_WriteLenByte(u16 WriteAddr, u32 DataToWrite, u8 Len) { u8 t; for(t 0; t Len; t) { AT24CXX_WriteOneByte(WriteAddr t, (DataToWrite (8 * t)) 0xff); } } /******************************************************************************* * 函 数 名 : AT24CXX_ReadLenByte * 函数功能 : 在AT24CXX里面的指定地址开始读出长度为Len的数据 用于读出16bit或者32bit的数据 * 输 入 : ReadAddr :开始读出的地址 Len :要读出数据的长度2,4 * 输 出 : 读取的数据 *******************************************************************************/ u32 AT24CXX_ReadLenByte(u16 ReadAddr, u8 Len) { u8 t; u32 temp 0; for(t 0; t Len; t) { temp 8; temp AT24CXX_ReadOneByte(ReadAddr Len - t -1); } return temp; } /******************************************************************************* * 函 数 名 : AT24CXX_Check * 函数功能 : 检查AT24CXX是否正常(通过测试能否读写来检查) * 输 入 : 无 * 输 出 : 1:检测失败0:检测成功 *******************************************************************************/ u8 AT24CXX_Check(void) { u8 temp; tempAT24CXX_ReadOneByte(255); //避免每次开机都写AT24CXX if(temp 0x36) return 0; else//排除第一次初始化的情况 { AT24CXX_WriteOneByte(255, 0x36); temp AT24CXX_ReadOneByte(255); if(temp 0x36) return 0; } return 1; } /******************************************************************************* * 函 数 名 : AT24CXX_Read * 函数功能 : 在AT24CXX里面的指定地址开始读出指定个数的数据 * 输 入 : ReadAddr :开始读出的地址 对24c02为0~255 pBuffer :数据数组首地址 NumToRead:要读出数据的个数 * 输 出 : 无 *******************************************************************************/ void AT24CXX_Read(u16 ReadAddr, u8 *pBuffer, u16 NumToRead) { while(NumToRead) { *pBuffer AT24CXX_ReadOneByte(ReadAddr); NumToRead--; } } /******************************************************************************* * 函 数 名 : AT24CXX_Write * 函数功能 : 在AT24CXX里面的指定地址开始写入指定个数的数据 * 输 入 : WriteAddr :开始写入的地址 对24c02为0~255 pBuffer :数据数组首地址 NumToRead:要读出数据的个数 * 输 出 : 无 *******************************************************************************/ void AT24CXX_Write(u16 WriteAddr, u8 *pBuffer, u16 NumToWrite) { while(NumToWrite--) { AT24CXX_WriteOneByte(WriteAddr, *pBuffer); WriteAddr; pBuffer; } }main.c#include system.h #include SysTick.h #include led.h #include usart.h #include key.h #include AT24Cxx.h int main() { u8 i0; u8 key; u8 k0; SysTick_Init(72); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组 LED_Init(); USART1_Init(9600); KEY_Init(); AT24CXX_Init(); while(AT24CXX_Check()) //检测AT24C02是否正常 { printf(AT24C02检测不正常! \r\n); delay_ms(500); } printf(AT24C02检测正常! \r\n); while(1) { key KEY_Scan(0); if(key KEY_UP) { k; if(k 255) { k 255; } AT24CXX_WriteOneByte(0, k); printf(写入的数据是%d\r\n, k); } if(key KEY_DOWN) { k AT24CXX_ReadOneByte(0); printf(读取的数据是%d\r\n, k); } i; if(i%20 0) { led1 !led1; } delay_ms(10); } }iic.x文件里注要实现标准iic的起始信号、停止信号等时序为了通用以AT24Cxx.x文件主要实现iic具体器件的读写要求如1字节从机器件地址和写 1字节从机操作地址 1字节要写的数据实验现象

相关文章:

STM32 通过I2C 读写EEPR0M AT24C02

一、I2C简介 两线式串行总线属于同步通信(共用主机时钟SCL)每个连接到I2C总线上的设备都有一个唯一的地址 SCL、SDA均需要接上拉电阻(设备空闲均输出高电平)传输速率标准模式下100Kbit/s I2C协议: I2C 的协议定义了通信…...

League Akari:英雄联盟玩家的智能助手,如何提升你的游戏体验

League Akari:英雄联盟玩家的智能助手,如何提升你的游戏体验 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Ak…...

人工智能学习笔记——Pytorch安装

目录 一.前言 二.相关知识 1.Pytorch是什么 2.需要安装Anaconda/CUDA和cuDNN吗 3.pytorchGPU版本为什么更好 三.我的踩坑经历 ​四.避坑指南 五.在windons终端安装Pytorch流程 六.感言 一.前言 作为一个刚接触pytorch的小白,我在b站和CSDN上查阅pytorch安装…...

终极窗口管理革命:Traymond让你的Windows系统托盘成为高效工作区

终极窗口管理革命:Traymond让你的Windows系统托盘成为高效工作区 【免费下载链接】traymond A simple Windows app for minimizing windows to tray icons 项目地址: https://gitcode.com/gh_mirrors/tr/traymond 你是否厌倦了任务栏上密密麻麻的窗口图标&am…...

从工厂质检员到AI工程师:我是如何用YOLOv8+Streamlit搞定钢材缺陷检测网页工具的

从工厂质检员到AI工程师:我是如何用YOLOv8Streamlit搞定钢材缺陷检测网页工具的 三年前,我还是一名普通的工厂质检员,每天的工作就是站在生产线旁,用肉眼检查钢材表面是否有裂纹、划痕或锈蚀。这份工作不仅枯燥乏味,而…...

使用pythonopenai兼容sdk分钟级接入taotoken多模型服务

使用 Python OpenAI 兼容 SDK 分钟级接入 Taotoken 多模型服务 1. 准备工作 在开始集成 Taotoken 之前,您需要确保 Python 环境已就绪。推荐使用 Python 3.7 或更高版本。如果您尚未安装 Python,可以从官方渠道获取并安装最新稳定版。 接下来&#xf…...

避坑指南:AUTOSAR BswM中ECU状态切换的3个常见配置错误与调试方法

AUTOSAR BswM实战:ECU状态切换配置避坑与调试指南 在汽车电子系统开发中,ECU状态管理是确保系统稳定运行的关键环节。AUTOSAR BswM模块作为状态管理的核心组件,其配置的准确性直接影响着ECU的启动、运行和休眠行为。本文将聚焦BswM配置中最容…...

为什么FFM在工业界没火起来?深入聊聊它的计算复杂度与过拟合问题

为什么FFM在工业界未能成为主流?深度解析计算复杂度与过拟合困境 推荐系统领域的技术迭代总是伴随着效率与效果的权衡取舍。当算法工程师们在特征交叉场景中考虑升级传统FM模型时,Field-aware Factorization Machines(FFM)曾因其理…...

树莓派5计算机视觉套件Pivistation 5全面评测与应用指南

1. 项目概述:Pivistation 5 计算机视觉入门套件最近在Kickstarter上发现一个挺有意思的项目——Arducam推出的Pivistation 5。这是一套基于树莓派5的即插即用计算机视觉开发套件,特别适合想要快速入门AI视觉应用但又不想折腾硬件配置的开发者。我自己之前…...

大语言模型在生物医学问答中的实践与优化

1. 生物医学问答的现状与痛点生物医学领域的信息检索一直是个高门槛的专业需求。传统搜索引擎在面对"EGFR突变型非小细胞肺癌三线治疗选择"这类专业问题时,往往只能返回零散的文献片段。医生和研究人员不得不花费大量时间在PubMed等专业数据库中进行人工筛…...

Windows右键菜单优化神器:ContextMenuManager让你的电脑操作效率翻倍

Windows右键菜单优化神器:ContextMenuManager让你的电脑操作效率翻倍 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 还在为Windows右键菜单杂乱无章…...

通过 Python 脚本批量测试 Taotoken 上不同模型的代码生成效果

通过 Python 脚本批量测试 Taotoken 上不同模型的代码生成效果 1. 准备工作 在开始编写批量测试脚本前,需要确保已具备以下条件: 有效的 Taotoken API Key(可在控制台创建)已安装 Python 3.7 及以上版本安装 OpenAI 官方 Pytho…...

项目风险预警:用 OpenClaw 自动监控项目进度、成本、资源负载,异常自动推送告警与解决方案

项目风险预警:基于OpenClaw的自动化监控与告警系统在当今快速变化的项目环境中,风险管理已成为项目成功的关键因素。传统方法依赖人工监控,容易因响应延迟导致成本超支、进度延误或资源枯竭。据研究,约70%的项目失败源于风险未被及…...

QMCDecode:3步解锁QQ音乐加密音频的终极免费方案

QMCDecode:3步解锁QQ音乐加密音频的终极免费方案 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默认转换结…...

别再死记硬背了!用Wireshark抓包实战,5分钟搞懂TCP三次握手和四次挥手

从抓包实战到协议本质:用Wireshark透视TCP/IP协议栈的运作奥秘 当你打开浏览器输入网址时,背后究竟发生了什么?那些抽象的网络协议概念是否总让你感到困惑?今天我们将打破传统学习方式,用Wireshark这款网络分析利器&am…...

LLM驱动的HLS代码生成评估框架Bench4HLS解析

1. 项目概述在硬件设计领域,高级综合(High-Level Synthesis, HLS)技术正经历一场由大语言模型(LLM)驱动的变革。传统HLS流程需要工程师手动将算法级描述转换为寄存器传输级(RTL)设计&#xff0c…...

Sophgo SG2380:RISC-V桌面级处理器与AI加速解析

1. Sophgo SG2380处理器深度解析:RISC-V架构的桌面级突破在处理器领域长期被x86和ARM垄断的背景下,RISC-V架构正以开源开放的姿态开辟第三条技术路线。Sophgo最新发布的SG2380 SoC,将16核RISC-V CPU与20 TOPS AI加速器集成在单芯片中&#xf…...

别急着重启!深入理解Calico BIRD进程假死与K8s节点网络恢复

别急着重启!深入理解Calico BIRD进程假死与K8s节点网络恢复 在Kubernetes生产环境中,Calico网络插件因其高性能和灵活性成为众多企业的首选方案。然而当集群规模扩大或负载激增时,不少运维团队都遭遇过这样的场景:节点突然失联&am…...

产品经理必看:如何利用GB/T 4754-2017行业分类,精准定义你的用户画像和市场

产品经理的行业分类实战指南:用GB/T 4754-2017重构市场洞察逻辑 当产品经理在用户画像中填写"行业"字段时,多数人只会想到制造业、金融业这类宽泛分类。但那些真正精准的市场机会,往往藏在"其他制造业中的生物基材料制造"…...

Stacklit:基于文件系统的现代化文档聚合平台搭建指南

1. 项目概述:一个为开发者打造的现代化文档聚合平台 如果你和我一样,每天需要同时跟进多个开源项目的动态,或者在一个技术栈复杂的团队里工作,那么你一定对“信息碎片化”深有体会。GitHub仓库的README、项目的官方文档、社区讨论…...

从MIPS到TOPS:算力单位进化史,以及为什么今天的AI芯片评测更复杂了

从MIPS到TOPS:算力单位进化史与AI芯片评测的复杂性 上世纪80年代,当工程师们谈论计算机性能时,MIPS是他们的通用语言。今天,在AI芯片的发布会上,TOPS成了最耀眼的明星。这两个看似简单的缩写,背后隐藏着计算…...

AI编程工具配置统一管理:ai-setting项目实战指南

1. 项目概述与核心价值如果你和我一样,每天要在多个项目间切换,同时使用 Claude Code、Cursor、GitHub Copilot 等不同的 AI 编程工具,那你一定体会过那种“配置地狱”的痛苦。每个项目都要重新设置一遍.claude目录、写一遍CLAUDE.md、调整 C…...

构建AI智能体流水线自动化评估平台:从质量基线到科学迭代

1. 项目概述:一个为AI智能体流水线打造的“质检中心”在AI应用开发,尤其是基于智能体(Agent)的复杂流水线构建中,我们常常会陷入一个困境:今天我对提示词(Prompt)做了优化&#xff0…...

AI代理管理框架aimgr:构建多智能体系统的模块化架构与实践

1. 项目概述:一个面向开发者的AI代理管理框架最近在折腾AI应用开发,特别是想把大语言模型的能力真正集成到自己的业务流程里,而不是简单地调用ChatGPT的API。在这个过程中,我发现了一个痛点:当你想构建一个能自主执行复…...

扩散模型与S3-DiT架构:多模态生成式AI技术解析

1. 扩散模型基础与Z-Image架构概览 扩散模型近年来已成为生成式AI领域最具突破性的技术之一。其核心思想源于非平衡态热力学中的扩散过程,通过逐步向数据添加噪声(正向过程)再学习逆向去噪(反向过程)来实现数据生成。与…...

扩散模型与流匹配在在线强化学习中的优化实践

1. 项目概述最近在研究在线强化学习时,发现扩散模型和流匹配这两种生成式方法在实际部署中存在一些有趣的优化难题。作为一个在强化学习领域摸爬滚打多年的从业者,我想分享下这些前沿技术在动态环境中的应用心得。扩散模型和流匹配原本是生成式AI领域的明…...

GEM框架:强化学习环境构建与多智能体交互实践

1. 强化学习环境构建的核心挑战在强化学习项目开发过程中,环境注册与多智能体交互一直是工程实践中的关键痛点。传统开发模式下,研究人员需要花费大量时间在环境接口适配、通信协议实现等基础工作上,难以聚焦算法本身的优化。GEM框架的出现为…...

深入解析Legacy-iOS-Kit:iOS设备降级与系统恢复的专业工具集

深入解析Legacy-iOS-Kit:iOS设备降级与系统恢复的专业工具集 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit…...

Mulch框架:为AI编程助手构建持久化记忆与知识库

1. 项目概述:为AI编程助手装上“记忆中枢” 如果你和我一样,日常重度依赖Cursor、Clawaude这类AI编程助手来写代码、重构项目或者排查问题,那你一定遇到过这个让人头疼的瞬间:你明明在昨天的对话里花了半小时,详细解释…...

新手网工避坑指南:从华为HCIA题库里总结的10个真实网络配置“翻车”现场

华为HCIA实战避坑手册:10个网络工程师必知的配置陷阱 刚拿到华为HCIA认证的网络工程师们,恭喜你们跨过了理论的门槛。但真正的挑战往往从第一台设备通电开始——那些题库里看似简单的选择题,背后藏着无数工程师用血泪换来的经验。本文将带你还…...