STM32 IIC通信
目录
- IIC简介
- 硬件电路连接
- I2C时序基本单元
- IIC完整数据帧
- MPU6050封装
- 硬件IIC
- 内部电路
IIC简介
IIC(Inter-Integrated Circuit)是 IIC Bus 简称,中文叫集成电路总线。它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。自2006年10月1日起,使用I²C协议已经不需要支付专利费,但制造商仍然需要付费以获取I²C从属设备地址。
IIC使用两根信号线进行通信:一根时钟线SCL,一根数据线SDA。IIC将SCL处于高时SDA拉低的动作作为开始信号,SCL处于高时SDA拉高的动作作为结束信号;传输数据时,SDA在SCL低电平时改变数据,在SCL高电平时保持数据,每个SCL脉冲的高电平传递1位数据。
IIC通信时一种同步,半双工的通信协议,带数据应答,支持总线挂载多设备(一主多从、多主多从)。
也正是因为IIC是一种同步时序,所有我们可以软件模拟,串口通信就是一种异步时序,对时序要求很严格,所有我们不能模拟,需要硬件短路来实现才会精准收发数据。
硬件电路连接
所有I2C设备的SCL连在一起,SDA连在一起
设备的SCL和SDA均要配置成开漏输出模式
SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
任何时候都是主机完全掌控SCL线,只有从机应答和从机发送的时候才会获得SDA的掌控权。
IIC的设计禁止所有设备输出强上拉的高电平。采用外置弱上拉的电阻加开漏输出的电路结构。这么做的原因也是为了防止主机在结束的时候释放SDA即拉高然后从机立刻拉低响应造成的短路。这个模式也存在“线与”的特性,只要有输出低,那么最后就输出低,所有输出高才输出高。
CPU和被控IC都是上图右边的结构。开漏输出没有强上拉,只有强下拉,当输出高电平的时候,下管断开,不输出低,处于浮空状态,此时就由上拉电阻拉高。
I2C时序基本单元
起始条件:SCL高电平期间,SDA从高电平切换到低电平
终止条件:SCL高电平期间,SDA从低电平切换到高电平
发送一个字节:
SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节。
接收一个字节:
SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)。
发送应答: 主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
接收应答: 主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA,从机控制,从机拉低就是从机发送应答)
IIC完整数据帧
IIC的完成数据帧包括指定地址写,当前地址读,指定地址读
IIC是一主多从的通信协议,所以如果要和某个从机进行通信必须选中某个从机,所以每个从机就需要一个地址。主机在起始条件后需要先发送一个字节,所有从机都会收到一个字节和自己的地址比较。如果和自己的地址就响应主机的操作,所有同一个IIC总线必须挂载不一样的地址设备。从机设备地址在IIC协议标准种分为七位和十位,七位的比较简单应用也比较广泛。在出厂的时候,厂商就会为他分配一个七位的地址,在芯片手册中都能找到。如果有相同的地址芯片挂在在总线上就需要使用地址的可变部分,一般都是地址的后面一位或者几位。
一个完整的数据帧在起始条件开始,结束条件结束。
指定地址写:
在起始条件后就要跟一个从机地址+写标志位,然后从机发送应答。然后发送指定的地址,然后从机再次应答。
当前地址读:
对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)。
当前地址指针上电默认是0,但是当我们指定地址写后,然后当前地址读,就是在写的下一位进行读取操作。
指定地址读:
我们使用指定地址写的指定地址时序,但是不写入,此时当前地址指针就不会加一。然后再调用当前地址读的时序,然后就是指定地址读了。我们可以在指定地址读前面加一个结束条件,然后再次发送起始条件,在当前地址读。但是IIC协议官方规定的符合格式是一整个数据帧,就是先起始,再重复起始(在指定地址写的时序后面再加一个起始条件),然后发当前地址读,最后结束了再发送结束条件。
当读取完数据不想再读取了,就需要主机发送非应答,此时从机知道主机不想再接收了,就会释放总线,交还给从机。
MPU6050封装
软件IIC配置:
总体操作:
1.初始化GPIO,包括打开时钟,配置结构体,初始化选用的引脚
2.配置IIC开始函数
3.配置IIC结束函数
4.配置IIC发送一个字节函数
5.配置IIC接收一个字节函数
6.配置IIC发送应答函数
7.配置IIC接收应答函数
具体操作:
1.初始化GPIO,例如,选用Pin10为SCL线,Pin11为SDA线,配置IIC的GPIO为开漏输出
void MyI2C_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_10 | GPIO_Pin_11);
}
1.IIC不论是SDA还是SCL都只有高低两种状态,所有使用时就是把GPIO电平配置为高或者低
例如:
GPIO_WriteBit(GPIOB,GPIO_Pin_10,1);Delay_us(10);GPIO_WriteBit(GPIOB,GPIO_Pin_11,1);Delay_us(10);
延时10微秒为操作时间,实测不延时也可以。
每次都配置GPIO不仅麻烦还不明了
所以就把GPIO封装起来
void MyI2C_W_SCL(uint8_t BitValue)
{GPIO_WriteBit(GPIOB,GPIO_Pin_10,(BitAction)BitValue);Delay_us(10);
}//对SCL线封装,便于操作,控制时钟线
void MyI2C_W_SDA(uint8_t BitValue)
{GPIO_WriteBit(GPIOB,GPIO_Pin_11,(BitAction)BitValue);Delay_us(10);
}//对SDA线封装,便于操作,发送主机值
uint8_t MyI2C_R_SDA(void)
{uint8_t BitValue;BitValue=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11);Delay_us(10);return BitValue;
}//对SDA线封装,便于操作,读取从机发送的值
封装完以后便可以很简单的配置后面的函数
2.配置开始函数
IIC开启需要在SCL为高的时候拉低SDA,这样为开启IIC信号,从机便知道,IIC开启,主机要发送或者接收数据了
void MyI2C_Start(void)
{MyI2C_W_SDA(1);/*最好先拉高SDA确定,简要原因在最后面的读MPU6050的注释里面有简要说明,这样只是一个以防外一,个人感觉不是特别重要*/MyI2C_W_SCL(1);MyI2C_W_SDA(0);MyI2C_W_SCL(0);//拉低SDA后再把SCL拉低,便可以进行数据传送
3.配置结束函数 IIC结束需要在SCL为高的时候拉高SDA,这样为关闭IIC信号,从机便知道,IIC关闭,主机要结束发送或者接收数据了,实际上,在配置的IIC函数里面,只有结束函数里面SCL以高结束,其他的都为低,这样方便两个函数衔接。
void MyI2C_Stop(void)
{MyI2C_W_SDA(0);//先拉低SDA确保待会可以产生上升沿MyI2C_W_SCL(1);MyI2C_W_SDA(1);
}
4.配置主机发送函数
主机在SCL低的时候只会发送一位,从机在SCL为高的时候一次也只接收一位,每次都是一位一位进行的
void MyI2C_SentByte(uint8_t Byte)
{uint8_t i;for(i=0;i<8;i++){MyI2C_W_SDA(Byte&(0x80>>i));MyI2C_W_SCL(1);MyI2C_W_SCL(0);}
}
一次发送八位数据也就是一个字节的数据,所以在for循环里面循环8次
在8次数据发送完以后,主机需要释放SDA,这时从机会自己占据SDA线给主机发送应答后面写的主机的接收应答就会主动去释放SDA(所有的发送和接收都是相对主机而言的)
5.配置主机接收函数
uint8_t MyI2C_ReceiveByte(void)//主机接收时,从机在时钟线拉低的时候只会发送一位数据
{uint8_t i,Byte=0x00;MyI2C_W_SDA(1);for(i=0;i<8;i++){ MyI2C_W_SCL(1);if(MyI2C_R_SDA()==1){Byte |= (0x80>>i);}//高位先行,所以右移MyI2C_W_SCL(0);}return Byte;
}
主机接收的数据要处理,所以要用变量存起来,发送的数据从机会自动处理
6.配置IIC发送应答
void MyI2C_SentAck(uint8_t AckBit)
{MyI2C_W_SDA(AckBit);//当发送完一个数据以后,SCL本身就是低的,所以前面不需要再给SCL低了MyI2C_W_SCL(1);MyI2C_W_SCL(0);
}
发送应答是主机接收了一个数据以后发送个主机的应答,SDA拉高,相当于主机发送1,为非应答,不需要再接收数据时就要发非应答,需要接收数据时,就在SDA拉低,为应答。从机发送完一个字节数据以后,会自动释放SDA,此时主机应占据SDA,从机便会去读取SDA的值,接收主机的应答(应答信号在第9个时钟周期出现,这时发送器必须在这一时钟位上释放数据线,由接收设备拉低SDA电平来产生应答信号或非应答信号)
7.配置IIC接收应答
uint8_t MyI2C_ReceiveAck(void)
{uint8_t AckBit;MyI2C_W_SDA(1);//主机主动空出SDA,从机会立刻占据,发送应答或者非应答信号MyI2C_W_SCL(1);//SCL拉高以后,主机便可以去读取从机给的信号AckBit=MyI2C_R_SDA();MyI2C_W_SCL(0);//此时从机放手SDAreturn AckBit;
}
在主机发送完数据以后,主机应空出SDA线,此时从机会产生应答或者非应答,因为是软件模拟IIC所以可以选择读取也可以不去读取,选择读取便可以根据读取的值判断下一步要不要再继续操作。因为一个时钟信号只进行一位传输,所以从机检测到电平变化以后如果接下来还是主机操作便不在占据SDA。
以上便是软件IIC的所有配置
以MPU6050为例,演示IIC的进行
MPU6050初始化即IIC初始化
如果要给MPU6050写一个字节的数据:
void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
{MyI2C_Start();//打开IIC通信MyI2C_SentByte(0xD0);//选中 MPU6050,最后一位为0为写操作MyI2C_ReceiveAck();//从机发送应答,主机要接收应答MyI2C_SentByte(RegAddress);//主机继续发送要写的寄存器地址MyI2C_ReceiveAck();//主机接收从机的应答MyI2C_SentByte(Data);//主机发送要写的数据MyI2C_ReceiveAck();//主机接收从机的应答MyI2C_Stop();//停止IIC通信SDA与SCL都为高
}
IIC开始以后,第一次发送的是硬件的地址,每一个硬件都有一个地址,出厂的时候写好的,发送的数据前七位为地址,最后一位为读写位,0为写,1为读。
如果要读MPU6050一个字节的数据:
uint8_t MPU6050_ReadReg(uint8_t RegAddress)//读指定寄存器
{uint8_t Data;//接收读出数据的变量MyI2C_Start();MyI2C_SentByte(0xD0);MyI2C_ReceiveAck();MyI2C_SentByte(RegAddress);MyI2C_ReceiveAck();//前面几步确定地址MyI2C_Start();/*Start里面先SDA置1就是这里在上一步SCL为0的时候赶快为高然后重新开始,避免还没为高的时候SCL已经拉高了。如果SDA还没为高的时候SCL已经拉高了,这样再产生下降沿之前产生的就是上升沿了,就是停止的意思了。但是接收应答后,从机释放SDA,此时SDA就是高主机没有进行操作,SDA一直为高,所以个人感觉不重要*/MyI2C_SentByte(0xD1);//对指定地址进行读MyI2C_ReceiveAck();//从机要回应这个指令Data=MyI2C_ReceiveByte();//从机把指定地址的数据通过SDA线发出来MyI2C_SentAck(1);//主机回应1表示不给应答,从机便会结束发送MyI2C_Stop();//结束通信return Data;
}
因为无法直接指定寄存器读,但可以指定寄存器写,指定的地址指针在下一次操作前不变,所以指定地址写,然后什么都不写,重新开始读,便可以指定地址读。
再MPU5050手册中,刚上电时是睡眠模式,无法写入,只能读出。所有需要解除睡眠模式,此时就需要0x6B上写,0x6B地址是电源管理寄存器1,其中SLEEP位控制睡眠模式,在这个寄存器写入0x00,这样就能解除睡眠模式了。
在真正使用MPU6050之前还需要根据手册初始化一下,比如电源管理寄存器,时钟,陀螺仪,加速度计等各种寄存器。
#ifndef __MPU6050_REG_H
#define __MPU6050_REG_H#define SMPLRT_DIV 0x19
#define CONFIG 0x1A
#define GYRO_CONFIG 0x1B
#define ACCEL_CONFIG 0x1C
#define ACCEL_XOUT_H 0x3B
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCEL_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40
#define TEMP_OUT_H 0x41
#define TEMP_OUT_L 0x42
#define GYRO_XOUT_H 0x43
#define GYRO_XOUT_L 0x44
#define GYRO_YOUT_H 0x45
#define GYRO_YOUT_L 0x46
#define GYRO_ZOUT_H 0x47
#define GYRO_ZOUT_L 0x48
#define PWR_MGMT_1 0x6B
#define PWR_MGMT_2 0x6C
#define WHO_AM_I 0x75
extern uint8_t AccX,AccY,AccZ,GyroX,GyroY,GyroZ;
#endif
void MPU6050_GetData(int16_t *AccX,int16_t *AccY,int16_t *AccZ,int16_t*GyroX,int16_t*GyroY,int16_t*GyroZ)
{uint8_t DataH,DataL;DataH=MPU6050_ReadReg(ACCEL_XOUT_H);DataL=MPU6050_ReadReg(ACCEL_XOUT_L);*AccX=(DataH<<8)|DataL;DataH=MPU6050_ReadReg(ACCEL_YOUT_H);DataL=MPU6050_ReadReg(ACCEL_YOUT_L);*AccY=(DataH<<8)|DataL;DataH=MPU6050_ReadReg(ACCEL_ZOUT_H);DataL=MPU6050_ReadReg(ACCEL_ZOUT_L);*AccZ=(DataH<<8)|DataL;DataH=MPU6050_ReadReg(GYRO_XOUT_H);DataL=MPU6050_ReadReg(GYRO_XOUT_L);*GyroX=(DataH<<8)|DataL;DataH=MPU6050_ReadReg(GYRO_YOUT_H);DataL=MPU6050_ReadReg(GYRO_YOUT_L);*GyroY=(DataH<<8)|DataL;DataH=MPU6050_ReadReg(GYRO_ZOUT_H);DataL=MPU6050_ReadReg(GYRO_ZOUT_L);*GyroZ=(DataH<<8)|DataL;
}
void MPU6050_Init(void)
{MyI2C_Init();MPU6050_WriteReg(PWR_MGMT_1,0x01);//电源管理1MPU6050_WriteReg(PWR_MGMT_2,0x00);//电源管理2MPU6050_WriteReg(SMPLRT_DIV,0x09);//采样率分频,10分频MPU6050_WriteReg(CONFIG,0x06);//外部同步(不需要)与低通滤波MPU6050_WriteReg(GYRO_CONFIG,0x18);//陀螺仪配置寄存器MPU6050_WriteReg(ACCEL_CONFIG,0x18);//加速度计
}
硬件IIC
由于IIC是同步时序,所以软件模拟II从时序,灵活且方便,用的范围比较广。
STM32内部集成了硬件IIC的电路,STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,用库函数封装好,直接读取寄存器即可。减轻CPU的负担。
比如:
支持多主机模型
支持7位/10位地址模式
支持不同的通讯速度,标准速度(高达100 kHz),快速(高达400 kHz)
支持DMA
兼容SMBus协议
STM32F103C8T6 硬件I2C资源:I2C1、I2C2
引脚映射:
C8T6的IIC2映射的PB10为SCL,PB11为SDA。IIC1的SCL为PB6,SDA为PB7。
内部电路
上半部分是SDA,数据控制部分。数据收发的核心部分是上面的数据寄存器和数据移位寄存器。当需要发送数据时,可以把一个字节数据写到数据寄存器DR。当移位寄存器没有数据移位时,DR中的值就会转到移位寄存器中。在移位的过程中,可以直接把下一个数据放到数据寄存器中等着。当数据由数据寄存器转到移位寄存器时就会置状态寄存器的TXE
位为 1 ,表示发送寄存器为空。
接收的过程也是这样,输入的数据先放进移位寄存器,当一个字节后,数据从移位寄存器转入DR。同时置标志位RXNE
,表示接收寄存器非空。此时就可以将数据从数据寄存器读出来了。
对于起始条件,终止条件,应答位什么的都由数据控制电路完成。
相关文章:
STM32 IIC通信
目录 IIC简介硬件电路连接I2C时序基本单元IIC完整数据帧MPU6050封装硬件IIC内部电路 IIC简介 IIC(Inter-Integrated Circuit)是 IIC Bus 简称,中文叫集成电路总线。它是一种串行通信总线,使用多主从架构,由飞利浦公司…...
快速入门 JSON 数据格式
引言 JSON,全称 JavaScript Object Notion,类似于XML,YAML,Properties等,是一种数据交换格式,相比于XML,更简单,更轻量,更容易理解。 JSON vs XML 使用 JSON 目前被广…...
FFmpeg —— 中标麒麟系统下使用FFmpeg内核+Qt界面,制作完整功能音视频播放器(附:源码)
🔔 FFmpeg 相关音视频技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 程序运行效果...
硬件测试工装设计不合理的补救措施
硬件测试工装设计不合理的补救措施主要包括重新评估设计需求、优化工装结构、强化工装校准与验证。其中,优化工装结构尤其重要,通过结构优化能够有效解决因设计不合理导致的测试准确性下降和可靠性不足的问题。根据工程实践数据,经过优化结构…...
任意文件读取漏洞
fofa语句:body"/vite/client" /fs/etc/passwd?import&raw?? https://35.175.173.157/fs/etc/passwd?import&raw?? http://geometer.dev.mvergely.com/fs/etc/passwd?import&raw??...
如何使用RK平台的spi驱动 spidev
RK平台spidev驱动读取RC522版本号示例 1. 硬件与驱动确认 确认SPI接口连接:RC522的SPI引脚与RK开发板的对应SPI控制器正确连接(CS、CLK、MOSI、MISO)检查内核配置: Bash # 内核需启用以下配置 CONFIG_SPIy CONFIG_SPI_MASTERy…...
网路传输层UDP/TCP
一、端口号 1.端口号 1.1 五元组 端口号(port)标识了一个主机上进行通信的不同的应用程序. 如图所示, 在一个机器上运行着许多进程, 每个进程使用的应用层协议都不一样, 比如FTP, SSH, SMTP, HTTP等. 当主机接收到一个报文中, 网络层一定封装了一个目的ip标识我这台主机, …...
1.2-WAF\CDN\OSS\反向代理\负载均衡
WAF:就是网站应用防火墙,有硬件类、软件类、云WAF; 还有网站内置的WAF,内置的WAF就是直接嵌在代码中的安全防护代码 硬件类:Imperva、天清WAG 软件:安全狗、D盾、云锁 云:阿里云盾、腾讯云WA…...
Dify 服务器部署指南
1. 系统要求 在开始部署之前,请确保你的服务器满足以下要求: 操作系统:Linux(推荐使用 Ubuntu 20.04 或更高版本)内存:至少 4GB RAM存储:至少 20GB 可用空间网络:稳定的互联网连接…...
从车间到数字生态:MES如何引领制造业智能化革命
在全球制造业加速迈向工业4.0的浪潮中,传统生产模式正经历颠覆性变革。制造执行系统(MES)作为连接物理车间与数字世界的核心纽带,正从“生产辅助工具”升级为“智能决策大脑”,推动制造业向数据驱动、柔性化与可持续化…...
Error:Flash Download failed
出现这个就是编译器要换...
Spring容器生命周期详解
Spring容器生命周期详解 Spring容器的生命周期从启动到关闭分为多个阶段,包括Bean的加载、实例化、初始化、使用和销毁。以下是详细流程和关键点: 1. 容器启动阶段 1.1 容器实例化 核心接口:BeanFactory(基础容器)或…...
革新测试管理 2.0丨Storm UTP统一测试管理平台智能化升级与全流程优化
承接上篇:从基础架构到深度协同 在首篇文章《革新测试管理 | 统一测试管理平台如何实现远程、协同、自动化?》中,我们探讨了Storm UTP如何通过云端协作、自动化测试框架和分布式执行能力打破传统测试壁垒。经过一年多的客户实践与技术迭代&a…...
将 char [] str = “hello,you,world” 改为 “world,you,hello“,要求空间复杂度为1
题目: 将 char [] str “hello,you,world” 改为 "world,you,hello",要求空间复杂度为1 (也就是使用的变量只能是单个字符或者常数,不能使用数组!!!!!) 解…...
运维规则之总结(Summary of Operation and Maintenance Rules)
运维规则之总结 在运维领域,经验和流程往往决定了系统的稳定性与可靠性。一个运维人,总结出了以下10条运维规则,涵盖了从基础管理到高级策略的全面内容,旨在帮助运维人员更好地应对各种挑战,确保系统的平稳运行。 1.…...
MongoDB 创建数据库
MongoDB 创建数据库 引言 MongoDB 是一款高性能、可扩展的 NoSQL 数据库,广泛应用于大数据领域。在 MongoDB 中,创建数据库是进行数据存储的第一步。本文将详细介绍 MongoDB 数据库的创建方法,包括手动创建和自动创建两种方式。 MongoDB 数…...
SpringSecurity OAuth2:授权服务器与资源服务器配置
文章目录 引言一、OAuth2基础概念与架构二、授权服务器配置三、令牌策略与存储方式四、资源服务器配置五、远程令牌验证与内省总结 引言 在现代分布式应用架构中,OAuth2已成为实现安全授权与认证的事实标准。Spring Security对OAuth2提供了全面支持,使开…...
Vue 2 探秘:visible 和 append-to-body 是谁的小秘密?
🚀 Vue 2 探秘:visible 和 append-to-body 是谁的小秘密?🤔 父组件:identify-list.vue子组件:fake-clue-list.vue 嘿,各位前端探险家!👋 今天我们要在 Vue 2 的代码丛林…...
C#高级:启动、中止一个指定路径的exe程序
一、启动一个exe class Program {static void Main(string[] args){string exePath "D:\测试\Test.exe";// 修改为你要运行的exe路径StartProcess(exePath);}private static bool StartProcess(string exePath){// 创建一个 ProcessStartInfo 对象来配置进程启动参…...
windows下安装sublime
sublime4 alpha 4098 版本 下载 可以根据待破解的版本选择下载 https://www.sublimetext.com/dev crack alpha4098 的licence 在----- BEGIN LICENSE ----- TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA12C0 A37081C5 D0316412 4584D…...
Qt 日志输出(重定向)
在软件开发中,日志输出是调试和问题排查的关键手段。Qt框架提供了灵活的日志系统,支持从简单的控制台输出到复杂的自定义日志处理。本文将详细介绍Qt中五种常用的日志输出方法,并附上完整代码示例。 一、使用Qt内置日志函数 Qt提供了五个全局…...
51c嵌入式~MOS~合集1
我自己的原文哦~ https://blog.51cto.com/whaosoft/12074888 一、MOS管:米勒效应、开关损耗以及参数匹配 MOS管即场效应管(MOSFET),属于压控型,是一种应用非常广泛的功率型开关元件,在开关电源、逆变器…...
一文详解k8s体系架构知识
0.云原生 1.k8s概念 1. k8s集群的两种管理角色 Master:集群控制节点,负责具体命令的执行过程。master节点通常会占用一股独立的服务器(高可用部署建议用3台服务器),是整个集群的首脑。 Master节点一组关键进程…...
Linux内核软中断分析
一、软中断类型 在Linux内核中,中断处理分为上半部(硬中断)和下半部。上半部负责快速响应硬件事件,而下半部用于处理耗时任务,避免阻塞系统。下半部有三种机制:软中断(Softirq)、小任…...
从医疗大模型到综合医疗智能体:算法、架构与路径全流程分析
一、引言 1.1 研究背景与意义 随着信息技术的飞速发展,医疗领域正经历着深刻的变革。医疗智能体作为人工智能技术在医疗行业的重要应用,正逐渐成为提升医疗服务质量、优化医疗流程、促进医疗资源合理分配的关键力量。从最初简单的医疗信息管理系统,到如今能够辅助诊断、制定…...
2025跳槽学习计划
(1)编程基础: 目录学习资料Chttps://www.bilibili.com/video/BV1z64y1U7hs?spm_id_from333.1387.favlist.content.clickLinuxPytorchhttps://www.bilibili.com/video/BV1if4y147hS?spm_id_from333.1387.favlist.content.clickopencv数据结…...
数据库后续
-- 添加作者字段 alter table t_hero add author varchar(100); -- 更新数据 update t_hero set author "曹雪芹" where id 1; update t_hero set author "曹雪芹" where id 2; update t_hero set author "曹雪芹" where id 3; upd…...
程序员软件工具推荐列表
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 程序员软件工具推荐列表1. Snipaste2. VSCod…...
如何在WordPress中限制用户登录到一台设备
在当今的互联网环境下,许多用户习惯共享账户信息,虽然看似无害,却可能对网站运营产生负面影响。尤其是对于那些经营会员网站和在线课程的平台,限制用户同时登录的设备数量显得尤为重要。本文将详细探讨如何在WordPress中限制用户登…...
基于大模型的自发性气胸全方位预测与诊疗方案研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型预测自发性气胸的原理及技术基础 2.1 大模型介绍 2.2 模型构建与训练数据 2.3 模型训练与优化 三、术前风险预测与准备 3.1 术前风险预测指标 3.2 基于预测的术前准备 3.3 手术方案与麻醉方案制定…...
文章记单词 | 第14篇(六级)
一,单词释义 affection:n. 喜爱,钟爱;爱慕之情;感情stream:n. 小河,溪流;一连串,源源不断;水流,气流;vi. 流,流动&#x…...
系统如何查找文件?inode号又是什么?
下面分别详细解释您提到的三个问题: “文件系统怎么定位文件”、“inode 是什么”、“为什么删除后还可能被占用”。 一、文件系统怎么定位文件 1.1 目录与文件名并不直接存储文件数据 在常见的 Unix/Linux 文件系统(如 ext4、xfs)或类似的…...
Uni-app入门到精通:tabBar节点实现多页面的切换
tabBar节点用于实现多页面的切换。对于一个多tabBar应用,可以通过tabBar节点配置项指定一级导航栏,以及tabBar切换时显示的对应页面。在pages.json中提供tabBar节点配置,不仅是为了方便快速开发导航,更重要的是提示App平台和小程序…...
torchvision中数据集的使用
1、torchvision及其数据集的介绍 1.1 torchvision介绍 torchvision 是 PyTorch 的一个官方库,专门用于计算机视觉任务。它提供了以下核心功能: 预训练模型:如 ResNet、VGG、EfficientNet 等。数据集:内置常用视觉数据集…...
uniapp开发实战自定义组件形式实现自定义海报功能
在 UniApp 中实现自定义海报功能,可以通过 Canvas 来绘制海报。Canvas 提供了丰富的绘图 API,可以精确控制文字、图片和二维码的位置。下面是一个完整的示例,展示如何创建一个自定义海报组件。 项目结构 假设你的项目结构如下: project-root/ ├── pages/ │ └──…...
Java EE 进阶:MyBatis-plus
MyBatis-plus的介绍 MyBatis-plus是MyBatis的增强工具,在MyBatis的基础上做出加强,只要MyBatis有的功能MyBatis-plus都有。 MyBatis-plus的上手 添加依赖 在我们创建项目的时候,我们需要添加MyBatis-plus和mysql的依赖 MyBatis-plus的依赖…...
信息学奥赛一本通 1514:【例 2】最大半连通子图 | 洛谷 P2272 [ZJOI2007] 最大半连通子图
【题目链接】 ybt 1514:【例 2】最大半连通子图 洛谷 P2272 [ZJOI2007] 最大半连通子图 【题目考点】 1. 图论:强连通分量 缩点 2. 图论:拓扑排序 有向无环图动规 【解题思路】 对于图中任意两顶点u、v,满足u到v或v到u有路径…...
正则表达式-笔记
文章目录 一、正则表达式二、正则表达式的基本语法字符类普通字符非打印字符特殊字符 量词限定符锚点修饰符(标记) 三、在 Python 中使用正则表达式简单搜索提取信息替换文本 参考 从验证用户输入,到从大量文本中提取特定信息,再到…...
Linux 练习二 LVS的NAT模式
作业 要求:使用LVS的 NAT 模式实现 3 台 RS 的轮询访问。IP地址和主机自己规划。 节点规划 主机角色系统网络IPclientclientredhat 9.5仅主机192.168.60.100/24lvslvsredhat 9.5仅主机 NAT192.168.60.200/24 VIP 192.168.23.8/24 DIPnginxrs1redhat 9.5NAT192.16…...
以科技赋能,炫我云渲染受邀参加中关村文化科技融合影视精品创作研讨会!
在文化与科技深度融合的时代浪潮下,影视创作行业经历着前所未有的变革。影视创作行业发展态势迅猛, 同时也面临着诸多挑战。为促进影视创作行业的创新发展,加强业内交流与合作, 3月25日下午,海淀区文化创意产业协会举办…...
Matlab2024a免费版下载教程
Matlab是一个高性能的数学计算与仿真软件,广泛应用于科学计算、数据分析、算法开发以及工程绘图等多个领域。它提供了强大的矩阵运算能力、丰富的内置函数库以及灵活的编程环境,使得用户能够高效地解决复杂的数学问题。本文,我将为大家详细介…...
人工智能:officeAI软件,如何调整AI对话界面的字体?
1、首先,随便打开一个excel(使用wps) 依次点击上方的【OfficeAI】—【右侧面板】 2、在弹出的面板中,输入:助手设置 , 然后按【回车】发送出去 3、之后会弹出界面,在【样式设定】中ÿ…...
ARCGIS PRO SDK VB2022 图层要素类类型判断
arcgis pro 常见要素类类型有以下几种: FeatureLayer ——要素图层(矢量数据) RasterLayer ——栅格图层 MapImageLayer ——地图图像图层 VectorTileLayer ——矢量切片图层 SceneLayer …...
一种监控录像视频恢复的高效解决方案,从每一帧中寻找可能性
该软件旨在恢复从监控设备中删除或丢失的视频。该程序经过调整以处理大多数流行供应商的闭路电视系统中使用的专有格式,并通过智能重建引擎进行了增强,能够为监控记录提供任何通用解决方案都无法实现的恢复结果。如果不需要持续使用该软件,则…...
windows安装JDK并配置环境变量
一、JDK安装 1.控制面板-程序有的话,先卸载 2.双击安装 3.下一步 4.选择安装路径 5.下一步,等着安装完成 6.校验安装是否成功,winr,输入“cmd” 疑问:安装17,显示21?? 二、环境变量 1.计算机…...
Web3.0合约安全:重入攻击防御方案
本文深度剖析智能合约重入攻击的13种新型变种及其防御体系,结合EIP-6780标准与Layer2安全方案,系统性阐述从代码层到协议层的立体防护策略。通过解析Uniswap、Compound等顶级项目的安全实践,揭示如何构建零重入风险的智能合约架构。 第一章 重…...
一文详解QT环境搭建:ubuntu20.4安装配置Qt5
随着软件开发技术的不断进步,跨平台应用程序的需求日益增长,开发者们面临着如何在不同操作系统之间保持代码的一致性和效率的问题。Qt作为一个成熟的跨平台C框架,在这方面提供了卓越的支持,不仅简化了GUI应用程序的创建过程&#…...
Android开发: Java文件中操作基础UI组件
Android Java文件中基础UI组件操作指南 一、常用UI组件基本操作 1. TextView文本控件 TextView textView findViewById(R.id.textView);// 设置文本内容 textView.setText("欢迎使用Android");// 设置文本颜色 textView.setTextColor(Color.BLUE); // 使用Color…...
监控易一体化运维:监控易机房管理,打造高效智能机房
在数字化浪潮中,企业对数据中心和机房的依赖程度与日俱增,机房的稳定运行成为业务持续开展的关键支撑。信息化的变迁,见证了机房管理从传统模式向智能化、精细化转变的过程。今天,就为大家深度剖析监控易在机房管理方面的卓越表现…...
Vue3当中el-tree树形控件使用
tree悬停tooltip效果 文本过长超出展示省略号 如果文本超出悬停显示tooltip效果 反之不显示 这里直接控制固定宽度限制 试了监听宽度没效果<template><el-treeshow-checkbox:check-strictly"true":data"data"node-key"id":props"…...