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

STM32 I2C通信协议说明

目录

背景

I2C协议

数据的有效性

I2C通信开始和停止条件

I2C数据传输

发送

响应

正常情况:

异常情况:

主机结束接收

写寄存器的标准流程

读寄存器的标准流程

仲裁机制

时钟同步

SDA线的仲裁

程序


背景

对单片机的三大通信中的I2C通信进行说明。

I2C协议

协议采用双线结构传输数据,包括一个数据线和一个时钟线(即 SDA 和 SCL 线),其中 SDA(Serial Data)线用于双向数据传输,而 SCL(Serial Clock)线则用于同步数据传输的时钟信号。通信始终由主设备(Master)控制,从设备(Slave)被动接收和回应。这种简单的线路连接方式使得设备之间的互连变得非常容易。

数据的有效性

SDA 线上的数据必须在时钟的高电平周期保持稳定 (PS:在SCL为高电平的时候,SDA发生发生变化是作为I2C通信开始和结束的信号)数据线的高或低电平状态只有在 SCL 线的时钟
信号是低电平时才能改变。也就是说在 SCL为高电平时,SDA上的信号保持稳定 只有在SCL为低电平时,SDA上的信号才能改变 。数据的接收方会在每个时钟周期的高电平期间读取数据(SDA),因此数据是在SCL为高电平时进行读取的。

I2C通信开始和停止条件

表示起始条件:SCL 是高电平时 SDA 线从高电平向低电平切换
表示结束条件: SCL 是高电平时 SDA 线由低电平向高电平切换表示停止条件
总结:I2C的SCL为高电平时候,SDA发生变化是作为开始/结束的条件
PS:起始和停止条件一般由主机产生 总线在起始条件后被认为处于忙的状态。在停止条件的某段时间后总线被认为再次处于空闲状态。如果产生 重复起始 Sr条件而不产生停止条件总线会一直处于忙的状态,此时的起始条件 S和重复起始 Sr条件在功能上是一样的。

I2C数据传输

发送

发送到 SDA 线上的每个字节必须为 8 位,每次传输可以发送的字节数量不受限制 每个字节后必须跟 一个响应位 ,首先传输的是数据的最高位 MSB,如果从机要完成一些其他功能后 例如一个
内部中断服务程序,才能接收或发送下一个完整的数据字节, 可以使时钟线 SCL 保持低电平迫使主机进入 等待状态. 当从机准备好接收下一个数据字节并释放时钟线 SCL 后数据传输继续.

响应

正常情况:

数据传输必须带响应。 相关的响应时钟脉冲由主机产生。 在响应的时钟脉冲期间, 发送器释放 SDA 线高 在响应的时钟脉冲期间 接收器必须将 SDA 线拉低!  使它在这个时钟脉冲的高电平期间保持稳定的低电平。

异常情况:

从机不能响应从机地址时 例如它正在执行一些实时函数不能接收或发送 从机必须使数据线保持 高电平(NACK) 主机然后产生一个停止条件终止传输或者产生重复起始条件开始新的传输。
如果从机 接收器响应了从机地址但是在传输了一段时间后不能接收更多数据字节 主机必须再一次
终止传输 这个情况用从机在第一个字节后没有产生响应来表示 从机使数据线保持高电平 主机产生一 个停止或重复起始条件。

主机结束接收

如果传输中有主机(作为接收者) 它必须通过在 从机不产生时钟的 最后一个字节不产生一个响应向从机 (发送器)通知数据结束! 从机 发送器必须释放数据线,允许主机产生一个停止或重复起始条件

写寄存器的标准流程

  1. Master发起START
  2. Master发送I2C addr(7bit)和w操作0(1bit),等待ACK
  3. Slave发送ACK
  4. Master发送reg addr(8bit),等待ACK
  5. Slave发送ACK
  6. Master发送data(8bit),即要写入寄存器中的数据,等待ACK
  7. Slave发送ACK
  8. 第6步和第7步可以重复多次,即顺序写多个寄存器
  9. Master发起STOP

读寄存器的标准流程

  1. Master发送I2C addr(7bit)和w操作1(1bit),等待ACK
  2. Slave发送ACK
  3. Master发送reg addr(8bit),等待ACK
  4. Slave发送ACK
  5. Master发起re -START
  6. Master发送I2C addr(7bit)和r操作1(1bit),等待ACK
  7. Slave发送ACK
  8. Slave发送data(8bit),即寄存器里的值
  9. Master发送ACK
  10. 第8步和第9步可以重复多次,即顺序读多个寄存器
  11. 主机想结束接收时,最后一个数据不再需要ACK应答,保持为高电平(NACK)。
  12. 主机发出 STOP 信号,停止 I2C 通信

 

主机想结束接收时,最后一个数据不再需要ACK应答,保持为高电平(NACK)。

仲裁机制

如果存在多主机的情况下,才要考虑仲裁机制。I2C总线上的仲裁分两部分:SCL线的同步和SDA线的仲裁。

时钟同步

在 I2C 总线上传送信息时的时钟同步信号是由挂接在 SCL 线上的所有器件的 逻辑“与” (线与,所以需要SCL也是开漏输出)完成的。即如果有多个主机同时产生时钟,那么只有所有主机都发送高电平时,SCL 上才表现为高电平,否则 SCL 都表现为低电平。

SDA线的仲裁

总线仲裁是为了解决多设备同时竞争中线控制权的问题,通过一定的裸机来决定哪个设备能够获得最终的总线控制权。

SDA线的仲裁也是建立在总线具有线“与”逻辑功能的原理上的。节点在发送1位数据后,比较总线上所呈现的数据与自己发送的是否一致(回读机制)。

  • 是,继续发送;
  • 否则,退出竞争;

I2C总线的控制逻辑:低电平优先

SDA线的仲裁可以保证I2C总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失,总线系统通过仲裁只允许一个主节点可以继续占据总线

程序

void I2C_GPIO_Init(void){ //I2C接口初始化GPIO_InitTypeDef  GPIO_InitStructure; 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);       RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); //启动I2C功能 GPIO_InitStructure.GPIO_Pin = I2C_SCL | I2C_SDA; //选择端口号                      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //选择IO接口工作方式       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)    GPIO_Init(I2CPORT, &GPIO_InitStructure);
}void I2C_Configuration(void){ //I2C初始化I2C_InitTypeDef  I2C_InitStructure;I2C_GPIO_Init(); //先设置GPIO接口的状态I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//设置为I2C模式I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress1 = HostAddress; //主机地址(从机不得用此地址)I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;//允许应答I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //7位地址模式I2C_InitStructure.I2C_ClockSpeed = BusSpeed; //总线速度设置 	I2C_Init(I2C1,&I2C_InitStructure);I2C_Cmd(I2C1,ENABLE);//开启I2C					
}void I2C_SAND_BUFFER(u8 SlaveAddr,u8 WriteAddr,u8* pBuffer,u16 NumByteToWrite){ //I2C发送数据串(器件地址,寄存器,内部地址,数量)I2C_GenerateSTART(I2C1,ENABLE);//产生起始位while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //清除EV5I2C_Send7bitAddress(I2C1,SlaveAddr,I2C_Direction_Transmitter);//发送器件地址while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//清除EV6I2C_SendData(I2C1,WriteAddr); //内部功能地址while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));//移位寄存器非空,数据寄存器已空,产生EV8,发送数据到DR既清除该事件while(NumByteToWrite--){ //循环发送数据	I2C_SendData(I2C1,*pBuffer); //发送数据pBuffer++; //数据指针移位while (!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));//清除EV8}I2C_GenerateSTOP(I2C1,ENABLE);//产生停止信号
}
void I2C_SAND_BYTE(u8 SlaveAddr,u8 writeAddr,u8 pBuffer){ //I2C发送一个字节(从地址,内部地址,内容)I2C_GenerateSTART(I2C1,ENABLE); //发送开始信号while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //等待完成	I2C_Send7bitAddress(I2C1,SlaveAddr, I2C_Direction_Transmitter); //发送从器件地址及状态(写入)while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //等待完成	I2C_SendData(I2C1,writeAddr); //发送从器件内部寄存器地址while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成	I2C_SendData(I2C1,pBuffer); //发送要写入的内容while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成	I2C_GenerateSTOP(I2C1,ENABLE); //发送结束信号
}
void I2C_READ_BUFFER(u8 SlaveAddr,u8 readAddr,u8* pBuffer,u16 NumByteToRead){ //I2C读取数据串(器件地址,寄存器,内部地址,数量)while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));I2C_GenerateSTART(I2C1,ENABLE);//开启信号while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));	//清除 EV5I2C_Send7bitAddress(I2C1,SlaveAddr, I2C_Direction_Transmitter); //写入器件地址while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//清除 EV6I2C_Cmd(I2C1,ENABLE);I2C_SendData(I2C1,readAddr); //发送读的地址while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //清除 EV8I2C_GenerateSTART(I2C1,ENABLE); //开启信号while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //清除 EV5I2C_Send7bitAddress(I2C1,SlaveAddr,I2C_Direction_Receiver); //将器件地址传出,主机为读while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); //清除EV6while(NumByteToRead){if(NumByteToRead == 1){ //只剩下最后一个数据时进入 if 语句I2C_AcknowledgeConfig(I2C1,DISABLE); //最后有一个数据时关闭应答位I2C_GenerateSTOP(I2C1,ENABLE);	//最后一个数据时使能停止位}if(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)){ //读取数据*pBuffer = I2C_ReceiveData(I2C1);//调用库函数将数据取出到 pBufferpBuffer++; //指针移位NumByteToRead--; //字节数减 1 }}I2C_AcknowledgeConfig(I2C1,ENABLE);
}
u8 I2C_READ_BYTE(u8 SlaveAddr,u8 readAddr){ //I2C读取一个字节u8 a;while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));I2C_GenerateSTART(I2C1,ENABLE);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));I2C_Send7bitAddress(I2C1,SlaveAddr, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));I2C_Cmd(I2C1,ENABLE);I2C_SendData(I2C1,readAddr);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,SlaveAddr, I2C_Direction_Receiver);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));I2C_AcknowledgeConfig(I2C1,DISABLE); //最后有一个数据时关闭应答位I2C_GenerateSTOP(I2C1,ENABLE);	//最后一个数据时使能停止位a = I2C_ReceiveData(I2C1);return a;
}

PS:因为总线的线与特性,SCL和SDA都要设置为开漏输出

相关文章:

STM32 I2C通信协议说明

目录 背景 I2C协议 数据的有效性 I2C通信开始和停止条件 I2C数据传输 发送 响应 正常情况: 异常情况: 主机结束接收 写寄存器的标准流程 读寄存器的标准流程 仲裁机制 时钟同步 SDA线的仲裁 程序 背景 对单片机的三大通信中的I2C通信进…...

网络工程师 (42)IP地址

一、定义与功能 IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。这种地址分配方式确保了用户在连网的计算机上操作时,能够高效且方便地从众多计算机中选出自己所需…...

Deepseek实用万能提问模板

一,背景需求约束条件 背景:提供与问题相关的时间、地点、人物、事件等信息,帮助 DeepSeek 更好地理解问题的情境。 需求:清晰明确地阐述你希望 DeepSeek完成的任务或提供的信息。 约束条件:可根据具体情况,对回答的范围、格式、字数等进行…...

强化学习笔记7——DDPG到TD3

前提:基于TD 的方法多少都会有高估问题,即Q值偏大。原因两个:一、TD目标是真实动作的高估。 二:自举法高估。 DDPG 属于AC方法:异策略,适合连续动作空间,因为他的策略网络直接输出的动作&#…...

传统混合专家模型MoE架构详解以及python示例(DeepSeek-V3之基础)

我们已经了解到DeepSeek-V3的框架结构基于三大核心技术构建:多头潜在注意力(MLA)、DeepSeekMoE架构和多token预测(MTP)。而DeepSeekMoE架构的底层模型采用了混合专家模型(Mixture of Experts,MoE)架构。所以我们先了解一下传统混合专家模型MoE架构。 一、传统混合专家模…...

开源协议深度解析:理解MIT、GPL、Apache等常见许可证

目录 前言1. MIT协议:自由而宽松的开源许可1.1 MIT协议的主要特点1.2 MIT协议的适用场景 2. GPL协议:自由软件的捍卫者2.1 GPL协议的核心理念2.2 GPL协议的适用场景 3. Apache License 2.0:开源与专利保护的平衡3.1 Apache License 2.0的主要…...

三维重建(十二)——3D先验的使用

文章目录 零、最近感受和前言一、使用能够快速得到重建初始化的方法1.1 Colmap(多视角)1.2 深度估计(单视角)二、已知形状模板2.1 人脸2.2 人体2.3 动物三、刚性与非刚性约束(变形约束)3.1 刚性变形3.2 非刚性变形四、统计(深度学习)先验——从大量(3D)数据中提取信息…...

Java项目《苍穹外卖》BUG修复记录

一、订单详情地址显示为null 原因:查看订单详情接口中,未设置收货地址信息,故地址返回为null。 解决方案: 1、OrderServiceImpl中创建一个私有方法专门获取订单收货地址 /*** 获取订单收获地址* param addressBookId* return*/…...

DockerDesktop更改默认的磁盘镜像地存储位置

DockerDesktop更改默认的磁盘镜像地存储位置 文章目录 DockerDesktop更改默认的磁盘镜像地存储位置1. 默认存储位置2. 新建一个目录3. 将磁盘镜像存储位置改为新建的目录下 1. 默认存储位置 2. 新建一个目录 如:D:\DiskImagelocationData 3. 将磁盘镜像存储位置改为…...

阿里云视频点播,基于thinkphp8上传视频

前端参考官方示例(jQuery版) <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>阿里云 JavaScript上传SDK Demo (使用jquery)</title><script src"__STATIC__/jquery.min.js"></script><sc…...

C# windowForms 的DataGridView控件的使用

C# Windows Forms DataGridView 控件使用详解 DataGridView 是 Windows Forms 中用于显示和编辑表格数据的核心控件。它支持高度自定义的列类型、数据绑定、事件处理和丰富的样式配置。以下是其详细使用方法。 目录 基础使用 数据绑定 列类型与自定义...

【NLP 22、语言模型 language model】

有时候我也想听听&#xff0c;我在你心里&#xff0c;是什么样子 —— 25.1.12 一、什么是语言模型 语言是灵活的&#xff0c;也是有规律的 了解一门语言的人可以判断一句话是否“合理” 通俗来讲&#xff0c;语言模型用来评价一句话(句子可以看作是字的组合)是否“合理”或…...

vtkCamera类的Dolly函数作用及相机拉近拉远

录 1. 预备知识 1.1.相机焦点 2. vtkCamera类的Dolly函数作用 3. 附加说明 1. 预备知识 要理解vtkCamera类的Dolly函数作用,就必须先了解vtkCamera类表示的相机的各种属性。  VTK是用vtkCamera类来表示三维渲染场景中的相机。vtkCamera负责把三维场景投影到二维平面,如…...

2025 N1CTF crypto 复现

近一个月都没有学习了&#xff0c;一些比赛也没有打&#xff0c;很惭愧自己还是处在刚放假时的水平啊&#xff0c;马上开学了&#xff0c;抓紧做一些训练来康复。 CheckIn import os from Crypto.Util.number import * from secret import FLAGp, q getPrime(512), getPrime…...

大模型开发实战篇5:多模态--文生图模型API

大模型文生图是一种基于人工智能大模型的技术&#xff0c;能够将自然语言文本描述转化为对应的图像。目前非常火的AI大模型赛道&#xff0c;有很多公司在此赛道竞争。详情可看这篇文章。 今天我们来看下如何调用WebAPI来实现文生图功能。我们一般都会将OpenAI的接口&#xff0…...

Jvascript网页设计案例:通过js实现一款密码强度检测,适用于等保测评整改

本文目录 前言功能预览样式特点总结&#xff1a;1. 整体视觉风格2. 密码输入框设计3. 强度指示条4. 结果文本与原因说明 功能特点总结&#xff1a;1. 密码强度检测2. 实时反馈机制3. 详细原因说明4. 视觉提示5. 交互体验优化 密码强度检测逻辑Html代码Javascript代码 前言 能满…...

Macos机器hosts文件便捷修改工具——SwitchHosts

文章目录 SwitchHosts软件下载地址操作添加方案切换方案管理方案快捷键 检测 SwitchHosts SwitchHosts 是一款 Mac 平台上的免费软件&#xff0c;它可以方便地管理和切换 hosts 文件&#xff0c;支持多种 hosts 文件格式。 软件下载地址 SwitchHosts 操作 添加方案 添加 …...

vLLM专题(四)-故障排除

本文件概述了一些您可以考虑的故障排除策略。如果您认为发现了一个 bug,请首先搜索现有的问题,看看是否已经有人报告。如果没有,请提交一个新问题,并尽可能提供相关的详细信息。 注意 一旦您调试完问题,请记得关闭任何已定义的调试环境变量,或者简单地启动一个新 shell,…...

搜广推校招面经十七

滴滴 花小猪 一、算法题1—最小覆盖字串&#xff08;hot100_字串_困难&#xff09; 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 “” 。 ## form collection import Counter …...

滚动弹幕案例

滚动弹幕案例 一、需求 1.页面上漂浮字体大小不一、颜色不一&#xff0c;从左向右滚动的弹幕&#xff1b; 2.底部中间有一个发送功能&#xff0c;可以发送新的弹幕&#xff1b; 3.底部的发送部分可以向下收起和弹出。 二、html <div class"container"><…...

Typora导出word文件详细安装教程

在 Typora 中&#xff0c;部分文件格式&#xff08;包括 docx、odt、rtf、epub、LaTeX 和 wiki&#xff09;的导入和导出功能由第三方软件 Pandoc 提供支持。这些功能需要安装 Pandoc (≥ v2.0)。 一、安装Pandoc 下载地址&#xff1a;通过网盘分享的文件&#xff1a;pandoc 链…...

从短片到长片:王琦携《Mountain》续作迈向新高度

在王琦(Qi Wang)的带领下,广受关注的短片《Mountain》迎来了成长篇续作《Rite of the Mountain》。这一全新长片不仅是她从短片迈向长篇叙事的重要一步,更是一次大胆的艺术挑战。作为制片人的她,将继续以敏锐的视觉风格和深刻的叙事洞察,拓展《Mountain》所触及的情感深度,并构…...

spring boot 对接aws 的S3 服务,实现上传和查询

1.aws S3介绍 AWS S3&#xff08;Amazon Simple Storage Service&#xff09;是亚马逊提供的一种对象存储服务&#xff0c;旨在提供可扩展、高可用性和安全的数据存储解决方案。以下是AWS S3的一些主要特点和功能&#xff1a; 1.1. 对象存储 对象存储模型&#xff1a;S3使用…...

考研操作系统-----外存文件

目录 内存映射文件 ​编辑 文件管理初始&#xff1a; ​编辑 文件的逻辑结构 文件目录 ​编辑 ​编辑 文件的物理结构&#xff08;文件分配方式&#xff09; 文件存储空间管理 文件的基本操作 文件共享 ​编辑​编辑 文件保护&#xff1a; ​编辑 文件系统的全局结构…...

国内外网络安全政策动态(2025年1月)

▶︎ 1.国家互联网信息办公室发布《个人信息出境个人信息保护认证办法&#xff08;征求意见稿&#xff09;》 1月3日&#xff0c;国家互联网信息办公室发布《个人信息出境个人信息保护认证办法&#xff08;征求意见稿&#xff09;》。根据《意见稿》&#xff0c;个人信息出境个…...

跟着 Lua 5.1 官方参考文档学习 Lua (1)

文章目录 1 – Introduction2 – The Language2.1 – Lexical Conventions2.2 – Values and Types2.2.1 – Coercion 1 – Introduction Lua is an extension programming language designed to support general procedural programming with data description facilities. I…...

计算机性能与网络体系结构探讨 —— 基于《计算机网络》谢希仁第八版

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…...

matlab欠驱动船舶模型预测控制

1、内容简介 matlab135-欠驱动船舶模型预测控制 可以交流、咨询、答疑 2、内容说明 略 针对在风 、 浪 、 流时变干扰下欠驱动水面船舶的轨迹跟踪控制问题 &#xff0c; 设计了一种基于模型 预测控制的轨迹跟踪控制器 &#xff0e; 考虑到欠驱动船舶在没有横向驱动力情况下…...

【MySQL常见疑难杂症】常见文件及其所存储的信息

1、MySQL配置文件的读取顺序 &#xff08;非Win&#xff09;/etc/my.cnf、/etc/mysql/my.cnf、/usr/local/mysql/etc/my.cnf、&#xff5e;/.my.cnf 可以通过命令查看MySQL读取配置文件的顺序 [roothadoop01 ~]# mysql --help |grep /etc/my.cnf /etc/my.cnf /etc/mysql/my.c…...

【LeetCode】3.无重复字符的最长字串

目录 题目算法解法解法一 暴力枚举 哈希表&#xff08;判断字符是否重复出现&#xff09; &#xff08;O( n 2 n^{2} n2)&#xff09;解法二 滑动窗口 哈希表&#xff08;判断字符是否重复出现&#xff09; 代码 题目 题目链接&#xff1a;LeetCode-3题 给定一个字符串 s &a…...

李宏毅机器学习笔记:【6.Optimization、Adaptive Learning Rate】

Optimization 1.Adaptive Learning Rate2.不同的参数需要不同的学习率3.Root Mean Square4.RMSProp5.Adam6.learning rate scheduling7.warm up总结 critical point不一定是你在训练一个network时候遇到的最大的障碍。 1.Adaptive Learning Rate 也就是我们要给每个参数不同的…...

计算机组成原理—— 外围设备(十三)

记住&#xff0c;伟大的成就往往诞生于无数次尝试和失败之后。每一次跌倒&#xff0c;都是为了让你学会如何更加坚定地站立&#xff1b;每一次迷茫&#xff0c;都是为了让你找到内心真正的方向。即使前路漫漫&#xff0c;即使困难重重&#xff0c;心中的火焰也不应熄灭。它代表…...

React简介

React简介 A Brief Introduction to React By JacksonML 1. 关于React React是一个知名的Web框架。众所周知&#xff0c;jQuery, Angular, Vue等框架都曾闪亮登场&#xff0c;并且&#xff0c;都仍然在全球市场占有一席之地。React这个颇有担当的新锐&#xff0c;也进入到我…...

Linux-C/C++《七、字符串处理》(字符串输入/输出、C 库中提供的字符串处理函数、正则表达式等)

字符串处理在几乎所有的编程语言中都是一个绕不开的话题&#xff0c;在一些高级语言当中&#xff0c;对字符串的处理支 持度更是完善&#xff0c;譬如 C、 C# 、 Python 等。若在 C 语言中想要对字符串进行相关的处理&#xff0c;譬如将两个字符串进行拼接、字符串查找、两个…...

哈希动态规划dp_5

一.哈希 哈希&#xff08;Hashing&#xff09;是计算机科学中一种非常重要的技术&#xff0c;用于将输入的数据映射到固定大小的值&#xff08;哈希值&#xff09;上。哈希算法和哈希数据结构广泛应用于各种领域&#xff0c;包括数据查找、加密、缓存、数据库索引等。我们来详…...

电商分布式场景中如何保证数据库与缓存的一致性?实战方案与Java代码详解

文章目录 一、缓存一致性问题的本质写后读不一致&#xff1a;更新数据库后&#xff0c;缓存未及时失效并发读写竞争&#xff1a;多个线程同时修改同一数据缓存与数据库事务不同步&#xff1a;部分成功导致数据错乱 二、5大核心解决方案与代码实现方案1&#xff1a;延迟双删策略…...

DeepSeek-R1 大模型本地部署指南

文章目录 一、系统要求硬件要求软件环境 二、部署流程1. 环境准备2. 模型获取3. 推理代码配置4. 启动推理服务 三、优化方案1. 显存优化技术2. 性能加速方案 四、部署验证健康检查脚本预期输出特征 五、常见问题解决1. CUDA内存不足2. 分词器警告处理3. 多GPU部署 六、安全合规…...

【数据结构】 栈和队列

在计算机科学的世界里&#xff0c;数据结构是构建高效算法的基础。栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;作为两种基本且重要的数据结构&#xff0c;在软件开发、算法设计等众多领域都有着广泛的应用。今天&#xff0c;我们就来深入探讨一下栈和…...

用Python构建Mad Libs经典文字游戏

前言 Mad Libs 是一种经典的文字游戏,其中一名玩家向其他玩家询问各种词汇,如名词、动词、形容词等,而不提供任何上下文。然后将这些提示词插入到一个充满空白的故事模板中,从而创造出一个搞笑或荒谬的故事,供玩家大声朗读以获取乐趣。 自1950年代发明以来,Mad Libs 一…...

ReactiveSwift模拟登录功能

通过使用ReactiveSwift模拟一个简单的登录功能&#xff0c;该功能如下要求&#xff1a; 账号不能为空密码必须大于6位 登录按钮方可点击 LoginViewModel&#xff1a; import ReactiveSwiftclass LoginViewModel {// 创建两个信号let userName MutableProperty<String&g…...

亲测有效!使用Ollama本地部署DeepSeekR1模型,指定目录安装并实现可视化聊天与接口调用

文章目录 一、引言二、准备工作&#xff08;Ollama 工具介绍与下载&#xff09;2.1 Ollama介绍2.2 Ollama安装 三、指定目录安装 DeepSeek R1四、Chatbox 可视化聊天搭建4.1 Chatbox下载安装4.2 关联 DeepSeek R1 与 Chatbox 的步骤 五、使用 Ollama 调用 DeepSeek 接口5.1 请求…...

【第11章:生成式AI与创意应用—11.3 AI艺术创作的实现与案例分析:DeepArt、GANBreeder等】

凌晨三点的画室里,数字艺术家小美盯着屏幕上的GANBreeder界面——她将梵高的《星月夜》与显微镜下的癌细胞切片图进行混合,生成的新图像在柏林电子艺术展上引发轰动。这场由算法驱动的艺术革命,正在重写人类对创造力的定义。 一、机器视觉的觉醒之路 1.1 数字艺术的三次浪…...

MySQL的基本使用

MySQL 是一个强大且广泛使用的开源关系型数据库管理系统&#xff0c;适用于各种规模的应用程序。无论是初学者还是经验丰富的开发者&#xff0c;掌握 MySQL 的基本操作都是至关重要的。本文将带你了解 MySQL 的基础概念&#xff0c;并通过实例介绍如何执行一些常见的数据库操作…...

WEB安全--SQL注入--PDO与绕过

一、PDO介绍&#xff1a; 1.1、原理&#xff1a; PDO支持使用预处理语句&#xff08;Prepared Statements&#xff09;&#xff0c;这可以有效防止SQL注入攻击。预处理语句将SQL语句与数据分开处理&#xff0c;使得用户输入的数据始终作为参数传递给数据库&#xff0c;而不会直…...

微信小程序image组件mode属性详解

今天学习微信小程序开发的image组件&#xff0c;mode属性的属性值不少&#xff0c;一开始有点整不明白。后来从网上下载了一张图片&#xff0c;把每个属性都试验了一番&#xff0c;总算明白了。现总结归纳如下&#xff1a; 1.使用scaleToFill。这是mode的默认值&#xff0c;sc…...

大模型炼丹基础--GPU内存计算

一、摘要 选择合适的GPU对成本和效率都至关重要&#xff0c;合理分析GPU 二、硬件计算基础 1 个字节可以表示零&#xff08;00000000&#xff09;和 255&#xff08;11111111&#xff09;之间的数字 模型参数常用的数据类型如下&#xff1a; float&#xff08;32 位浮点&a…...

istio入门篇(一)

一、背景 一直以来“微服务”都是一个热门的词汇&#xff0c;在各种技术文章、大会上&#xff0c;关于微服务的讨论和主题都很多。对于基于 Dubbo、SpringCloud 技术体系的微服务架构&#xff0c;已经相当成熟并被大家所知晓&#xff0c;但伴随着互联网场景的复杂度提升、业务…...

Ubuntu 24.04.1 LTS 本地部署 DeepSeek 私有化知识库

文章目录 前言工具介绍与作用工具的关联与协同工作必要性分析 1、DeepSeek 简介1.1、DeepSeek-R1 硬件要求 2、Linux 环境说明2.1、最小部署&#xff08;Ollama DeepSeek&#xff09;2.1.1、扩展&#xff08;非必须&#xff09; - Ollama 后台运行、开机自启&#xff1a; 2.2、…...

沃德校园助手系统php+uniapp

一款基于FastAdminThinkPHPUniapp开发的为校园团队提供全套的技术系统及运营的方案&#xff08;目前仅适配微信小程序&#xff09;&#xff0c;可以更好的帮助你打造自己的线上助手平台。成本低&#xff0c;见效快。各种场景都可以自主选择服务。 更新日志 V1.2.1小程序需要更…...

Visual Studio Code使用ai大模型编成

1、在Visual Studio Code搜索安装roo code 2、去https://openrouter.ai/settings/keys官网申请个免费的配置使用...