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

STM32入门——IIC通讯

江科大STM32学习记录

I2C通信

  • I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线
  • 两根通信线:SCL(Serial Clock)、SDA(Serial Data)
  • 同步,半双工
  • 带数据应答
  • 支持总线挂载多设备(一主多从、多主多从)
    硬件电路
  • 所有I2C设备的SCL连在一起,SDA连在一起
  • 设备的SCL和SDA均要配置成开漏输出模式
  • SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
    在这里插入图片描述
  • *IIC的SCL和SDA要配置成开漏输出,开漏与弱上拉的模式

I2C时序基本单元

  • 起始条件:SCL高电平期间,SDA从高电平切换到低电平
  • 终止条件:SCL高电平期间,SDA从低电平切换到高电平
    在这里插入图片描述
void myIIC_Start(void)//SCL高电平期间,sda产生一个下升沿
{Set_SDA(1);Set_SCL(1);Set_SDA(0);Set_SCL(0);}void myIIC_Stop(void)//SCL高电平期间,sda产生一个上升沿
{Set_SCL(1);Set_SDA(0);Set_SDA(1);
}

I2C时序基本单元

  • 发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节
    在这里插入图片描述

void myIIC_SendByte(uint8_t Byte)//SCL低电平,主机把数据放到SDA线上,SCL高电平,从机读取SDA上的数据
{uint8_t i;for(i=0;i<8;i++){Set_SDA(Byte & (0x80>>i));Set_SCL(1);	Set_SCL(0);	}
}

I2C时序基本单元

  • 接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)
    在这里插入图片描述

uint8_t myIIC_ReceByte(void)//SCL低电平,从机把数据放到SDA线上,SCL高电平,主机读取SDA上的数据
{uint8_t Rece_Byte = 0x00;uint8_t i;Set_SDA(1);//释放sda总线for(i=0;i<8;i++){Set_SCL(1);if(Read_SDA() == 1){Rece_Byte |= (0x80 >> i);}Set_SCL(0);	}return Rece_Byte;}

  • 发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
  • 接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
    在这里插入图片描述
void myIIC_SendACK(uint8_t AckBit)
{Set_SDA(AckBit);Set_SCL(1);	Set_SCL(0);	
}uint8_t myIIC_ReceACK(void)
{uint8_t AckBit;Set_SDA(1);//释放sda总线Set_SCL(1);AckBit = Read_SDA();Set_SCL(0);	return AckBit;
}

I2C时序

  • 指定地址写
  • 对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)
    在这里插入图片描述
    发送的第一个字节为从机地址加读写位,高七位为从机地址,最低位为读写位(0表示要写入;1表示要读出)
void Specify_Address_Write(uint8_t Slave,uint8_t RegAddress,uint8_t Data)
{myIIC_Start();myIIC_SendByte(Slave);myIIC_ReceACK();myIIC_SendByte(RegAddress);myIIC_ReceACK();myIIC_SendByte(Data);myIIC_ReceACK();myIIC_Stop();}

  • 当前地址读
  • 对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)
    在这里插入图片描述

  • 指定地址读
  • 对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data)
    在这里插入图片描述
uint8_t Specify_Address_Read(uint8_t Slave,uint8_t RegAddress)
{uint8_t temp;myIIC_Start();myIIC_SendByte(Slave);myIIC_ReceACK();myIIC_SendByte(RegAddress);myIIC_ReceACK();
//上面为指定地址myIIC_Start();//重复起始myIIC_SendByte(Slave | 0x01);//低位1表示读操作myIIC_ReceACK();temp = myIIC_ReceByte();myIIC_SendACK(1);//不应答myIIC_Stop();return temp;

MPU6050简介

  • MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景
  • 3轴加速度计(Accelerometer):测量X、Y、Z轴的加速度
  • 3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度
    在这里插入图片描述
    MPU6050参数
  • 16位ADC采集传感器的模拟信号,量化范围:-32768~32767
  • 加速度计满量程选择:±2、±4、±8、±16(g)
  • 陀螺仪满量程选择: ±250、±500、±1000、±2000(°/sec)
  • 可配置的数字低通滤波器
  • 可配置的时钟源
  • 可配置的采样分频
  • I2C从机地址:1101000(AD0=0) 1101001(AD0=1)

硬件电路
在这里插入图片描述
在这里插入图片描述

MPU6050框图
在这里插入图片描述
案例:获取xyz加速度值和陀螺仪值

#include "MPU6050.h"void MPU6050_Init(void)
{myIIC_Init();Specify_Address_Write(MPU6050_Address,MPU6050_PWR_MGMT_1,0x01);Specify_Address_Write(MPU6050_Address,MPU6050_PWR_MGMT_2,0x00);Specify_Address_Write(MPU6050_Address,MPU6050_SMPLRT_DIV,0x09);Specify_Address_Write(MPU6050_Address,MPU6050_CONFIG,0x06);Specify_Address_Write(MPU6050_Address,MPU6050_GYRO_CONFIG,0x18);Specify_Address_Write(MPU6050_Address,MPU6050_ACCEL_CONFIG,0x18);}uint8_t MCU6050_GetID(void)
{return Specify_Address_Read(MPU6050_Address,MPU6050_WHO_AM_I);}void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
{uint8_t data_H;uint8_t data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_XOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_XOUT_L);*AccX = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_YOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_YOUT_L);*AccY = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_ZOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_ZOUT_L);*AccZ = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_XOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_XOUT_L);*GyroX = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_YOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_YOUT_L);*GyroY = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_ZOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_ZOUT_L);*GyroZ = (data_H<<8) | data_L;}
#ifndef _MPU6050_H
#define _MPU6050_H
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "myIIC.h"
#define	MPU6050_SMPLRT_DIV		0x19
#define	MPU6050_CONFIG			0x1A
#define	MPU6050_GYRO_CONFIG		0x1B
#define	MPU6050_ACCEL_CONFIG	0x1C#define	MPU6050_ACCEL_XOUT_H	0x3B
#define	MPU6050_ACCEL_XOUT_L	0x3C
#define	MPU6050_ACCEL_YOUT_H	0x3D
#define	MPU6050_ACCEL_YOUT_L	0x3E
#define	MPU6050_ACCEL_ZOUT_H	0x3F
#define	MPU6050_ACCEL_ZOUT_L	0x40
#define	MPU6050_TEMP_OUT_H		0x41
#define	MPU6050_TEMP_OUT_L		0x42
#define	MPU6050_GYRO_XOUT_H		0x43
#define	MPU6050_GYRO_XOUT_L		0x44
#define	MPU6050_GYRO_YOUT_H		0x45
#define	MPU6050_GYRO_YOUT_L		0x46
#define	MPU6050_GYRO_ZOUT_H		0x47
#define	MPU6050_GYRO_ZOUT_L		0x48#define	MPU6050_PWR_MGMT_1		0x6B
#define	MPU6050_PWR_MGMT_2		0x6C
#define	MPU6050_WHO_AM_I		0x75
#define	MPU6050_Address		0xD0void MPU6050_Init(void);
uint8_t MCU6050_GetID(void);
void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ);#endif

硬件I2C通信

  • STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担
  • 支持多主机模型
  • 支持7位/10位地址模式
  • 支持不同的通讯速度,标准速度(高达100 kHz),快速(高达400 kHz)
  • 支持DMA
  • 兼容SMBus协议
  • STM32F103C8T6 硬件I2C资源:I2C1、I2C2

I2C框图
在这里插入图片描述
I2C基本结构
在这里插入图片描述
主机发送
在这里插入图片描述

//超时退出机制uint8_t Check_Timeout(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT)
{uint32_t time = 5000;while(I2C_CheckEvent(I2Cx,I2C_EVENT) != SUCCESS){time -- ;if(time == 0){return Timeout;}}return SUCCESS;
}void Specify_Address_Write(uint8_t Slave,uint8_t RegAddress,uint8_t Data)
{I2C_GenerateSTART(I2C2,ENABLE);Check_Timeout(I2C2,I2C_EVENT_MASTER_MODE_SELECT);I2C_Send7bitAddress(I2C2,Slave,I2C_Direction_Transmitter);Check_Timeout(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);I2C_SendData(I2C2,RegAddress);Check_Timeout(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING);I2C_SendData(I2C2,Data);Check_Timeout(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED);I2C_GenerateSTOP(I2C2,ENABLE);}

主机接收
在这里插入图片描述

uint8_t Specify_Address_Read(uint8_t Slave,uint8_t RegAddress)
{uint8_t ReceData;I2C_GenerateSTART(I2C2,ENABLE);Check_Timeout(I2C2,I2C_EVENT_MASTER_MODE_SELECT);I2C_Send7bitAddress(I2C2,Slave,I2C_Direction_Transmitter);Check_Timeout(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);I2C_SendData(I2C2,RegAddress);Check_Timeout(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED);I2C_GenerateSTART(I2C2,ENABLE);Check_Timeout(I2C2,I2C_EVENT_MASTER_MODE_SELECT);I2C_Send7bitAddress(I2C2,Slave,I2C_Direction_Receiver);Check_Timeout(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED);I2C_AcknowledgeConfig(I2C2,DISABLE);I2C_GenerateSTOP(I2C2,ENABLE);Check_Timeout(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED);ReceData = I2C_ReceiveData(I2C2);I2C_AcknowledgeConfig(I2C2,ENABLE);return ReceData;
}

软件/硬件波形对比
在这里插入图片描述
硬件I2C相关寄存器
在这里插入图片描述

硬件I2C读取MPU6050数据

#include "I2C.h"void I2C_init(void)
{//开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//GPIO初始化GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_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);I2C_InitTypeDef I2C_InitStructure;I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//指定I2C模式。I2C_InitStructure.I2C_ClockSpeed = 200000;//指定时钟频率I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;//作为从机地址为7位I2C_InitStructure.I2C_OwnAddress1 = 0x00;//作为从机自身地址I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;//指定I2C快速模式占空比I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;I2C_Init(I2C2,&I2C_InitStructure);I2C_Cmd(I2C2,ENABLE);}//超时退出机制uint8_t Check_Timeout(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT)
{uint32_t time = 5000;while(I2C_CheckEvent(I2Cx,I2C_EVENT) != SUCCESS){time -- ;if(time == 0){return Timeout;}}return SUCCESS;
}void Specify_Address_Write(uint8_t Slave,uint8_t RegAddress,uint8_t Data)
{I2C_GenerateSTART(I2C2,ENABLE);Check_Timeout(I2C2,I2C_EVENT_MASTER_MODE_SELECT);I2C_Send7bitAddress(I2C2,Slave,I2C_Direction_Transmitter);Check_Timeout(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);I2C_SendData(I2C2,RegAddress);Check_Timeout(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING);I2C_SendData(I2C2,Data);Check_Timeout(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED);I2C_GenerateSTOP(I2C2,ENABLE);}uint8_t Specify_Address_Read(uint8_t Slave,uint8_t RegAddress)
{uint8_t ReceData;I2C_GenerateSTART(I2C2,ENABLE);Check_Timeout(I2C2,I2C_EVENT_MASTER_MODE_SELECT);I2C_Send7bitAddress(I2C2,Slave,I2C_Direction_Transmitter);Check_Timeout(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);I2C_SendData(I2C2,RegAddress);Check_Timeout(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED);I2C_GenerateSTART(I2C2,ENABLE);Check_Timeout(I2C2,I2C_EVENT_MASTER_MODE_SELECT);I2C_Send7bitAddress(I2C2,Slave,I2C_Direction_Receiver);Check_Timeout(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED);//接收的最后一个字节之前就要不应答和发送终止信号I2C_AcknowledgeConfig(I2C2,DISABLE);I2C_GenerateSTOP(I2C2,ENABLE);Check_Timeout(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED);//接收到事件后一个字节就传到DR寄存器了ReceData = I2C_ReceiveData(I2C2);I2C_AcknowledgeConfig(I2C2,ENABLE);return ReceData;
}void MPU6050_Init(void)
{I2C_init();Specify_Address_Write(MPU6050_Address,MPU6050_PWR_MGMT_1,0x01);Specify_Address_Write(MPU6050_Address,MPU6050_PWR_MGMT_2,0x00);Specify_Address_Write(MPU6050_Address,MPU6050_SMPLRT_DIV,0x09);Specify_Address_Write(MPU6050_Address,MPU6050_CONFIG,0x06);Specify_Address_Write(MPU6050_Address,MPU6050_GYRO_CONFIG,0x18);Specify_Address_Write(MPU6050_Address,MPU6050_ACCEL_CONFIG,0x18);}
uint8_t MCU6050_GetID(void)
{return Specify_Address_Read(MPU6050_Address,MPU6050_WHO_AM_I);}void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
{uint8_t data_H;uint8_t data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_XOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_XOUT_L);*AccX = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_YOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_YOUT_L);*AccY = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_ZOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_ACCEL_ZOUT_L);*AccZ = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_XOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_XOUT_L);*GyroX = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_YOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_YOUT_L);*GyroY = (data_H<<8) | data_L;data_H = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_ZOUT_H);data_L = Specify_Address_Read(MPU6050_Address,MPU6050_GYRO_ZOUT_L);*GyroZ = (data_H<<8) | data_L;}

相关文章:

STM32入门——IIC通讯

江科大STM32学习记录 I2C通信 I2C&#xff08;Inter IC Bus&#xff09;是由Philips公司开发的一种通用数据总线两根通信线&#xff1a;SCL&#xff08;Serial Clock&#xff09;、SDA&#xff08;Serial Data&#xff09;同步&#xff0c;半双工带数据应答支持总线挂载多设备…...

DTC 19服务学习2

紧跟上篇 0x04 reportDTCSnapshotRecordByDTCNumber 通过DTC和快照序列来获取DTC快照记录。 适用以下假设&#xff1a; — 服务器支持存储给定 DTC 的两个 DTCSnapshot 记录的能力。 — 此示例假定是上一个示例的延续。 — 假设服务器请求服务器存储的 DTC 编号 123456 的两个…...

【腾讯云 TDSQL-C Serverless 产品体验】基于腾讯云轻量服务器以及 TDSQL-C 搭建 LNMP WordPress 博客系统

文章目录 一、前言二、数据库发展与云原生数据库2.1 数据库发展简介2.2 云原生数据库简介2.2.1 云数据库与云原生数据库区别 三、腾讯云 TDSQL-C 数据库3.1 什么是腾讯云 TDSQL-C 数据库3.2 为什么推出 TDSQL-C 数据库&#xff1f;传统 MySQL 架构存在较多痛点3.2.1 传统 MySQL…...

【vue3】对axios进行封装,方便更改路由并且可以改成局域网ip访问(附代码)

对axios封装是在main.js里面进行封装&#xff0c;因为main.js是一个vue项目的入口 步骤&#xff1a; 在1处创建一个axios实例为http&#xff0c;baseURL是基础地址&#xff08;根据自己的需求写&#xff09;&#xff0c;写了这个在vue界面调用后端接口时只用在post请求处写路由…...

Java IO流(三)线程模型

传统阻塞I/O模式 其中黄色框表示对象,蓝色框表示线程,白色框表示API方法 特点 采用阻塞IO模式获取输入数据每个连接都需要独立的线程完成数据的输入,业务处理和处理结果数据返回 潜在问题 并发数很大时,需要对应每个连接请求创建一个线程,所以占用资源很大连接创建后,若当前…...

string(模拟实现与深拷贝)

目录 深拷贝与浅拷贝 浅拷贝&#xff1a; 深拷贝 写时拷贝(了解) 模拟实现 准备 完整代码 深拷贝与浅拷贝 浅拷贝&#xff1a; 也称位拷贝&#xff0c;编译器只是将对象中的值拷贝过来。如果对象中管理资源&#xff0c;最后就会导致多个对象共享同一份资源&#xff0c;当一…...

5.Vue_Element

文章目录 1 Ajax1.1 Ajax介绍1.1.1 Ajax概述1.1.2 Ajax作用1.1.3 同步异步 1.2 Axios1.2.1 Axios的基本使用1.2.2 Axios请求方法的别名 2 前端工程化2.1 前端工程化特点2.2 Vue项目开发流程 3 Vue组件库Element3.1 Element介绍 1 Ajax 1.1 Ajax介绍 1.1.1 Ajax概述 Ajax: 全…...

链路追踪jaeger

这里的链路指的是客户端向服务发起一个请求&#xff0c;该请求所经过的路线&#xff0c;也可以说是该请求经过的流量 例如&#xff1a; 客户端发起一个下订单的请求其流量过程&#xff1a; request—>service—>order-web—>order_srv—>mysql—>order_srv—&…...

神经网络基础-神经网络补充概念-42-梯度检验

概念 梯度检验&#xff08;Gradient Checking&#xff09;是一种验证数值计算梯度与解析计算梯度之间是否一致的技术&#xff0c;通常用于确保实现的反向传播算法正确性。在深度学习中&#xff0c;通过梯度检验可以帮助验证你的神经网络模型是否正确地计算了梯度&#xff0c;从…...

<kernel>kernel 6.4 USB-之-hub_port_connect()分析

&#xff1c;kernel&#xff1e;kernel 6.4 USB-之-hub_port_connect()分析 kernel 6.4 USB系列文章如下&#xff1a; &#xff1c;kernel&#xff1e;kernel 6.4 USB-之-hub_event()分析 &#xff1c;kernel&#xff1e;kernel 6.4 USB-之-port_event()分析 &#xff1c;kern…...

linux驱动学习3-外部中断

在做中断试验时&#xff0c;发现中断驱动总是insmod失败&#xff0c;之后定位到 gpio_request 失败&#xff0c;之后是想到使用的野火做好的系统&#xff0c;在uEnv.txt中会加载大量设备树插件&#xff0c;将key相关的设备树插件屏蔽即可。 linux中断API函数 中断号 每个中断…...

vue中的canvas插件

vue中canvas插件有vue-konva、vue-fabricjs、vue-canvas-effect、vue-chartjs和vue-threejs等。详细介绍&#xff1a;1、vue-konva是一个用于在Vue.js中使用Konva.js的插件&#xff0c;Konva.js是一个功能强大的HTML5 2D 渲染引擎&#xff0c;可以用于创建交互式的Canvas应用程…...

分享图片 | 快速浏览网页资源,批量保存、一键分享图片

前言 小伙伴学习吉他&#xff0c;有时需要在互联网搜索曲谱资源&#xff0c;而多数曲谱均为图片&#xff0c;并且为多页&#xff0c;在电脑上显示练习很不方便&#xff0c;需要停下来点击鼠标进行翻页&#xff0c;影响练习的连贯性。 为了解决上述问题&#xff0c;通常把图片…...

Programming abstractions in C阅读笔记:p123-p126

《Programming Abstractions In C》学习第50天&#xff0c;p123-p126&#xff0c;总结如下&#xff1a; 一、技术总结 1.notaion 这也是一个在计算机相关书籍中出现的词&#xff0c;但有时却不是那么好理解&#xff0c;因为它可以指代很多对象&#xff0c;这里做一个记录。示…...

自然语言处理从入门到应用——LangChain:链(Chains)-[通用功能:LLMChain、RouterChain和SequentialChain]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 LLMChain LLMChain是查询LLM对象最流行的方式之一。它使用提供的输入键值&#xff08;如果有的话&#xff0c;还包括内存键值&#xff09;格式化提示模板&#xff0c;将格式化的字符串传递给LLM&#xff0c;并返回LLM…...

ElasticSearch-安装部署全过程

本文已收录于专栏 《中间件合集》 目录 概念说明什么是ElasticSearch什么是Kibana什么是RESTful API 提供服务安装过程安装ElasticSearch1.下载ElasticSearch 安装包2.解压安装包3.进入解压之后的文件夹4.创建一个data文件夹用来存储数据5.进入config文件夹编辑elasticsearch.y…...

mathematica报错:Tag Plus is \ Protected

在使用化简函数Simplify的时候使用了规则的语法&#xff0c;但是规则可能没有使用等号。 例如 Simplify[(1 - c^2)/d^2, c^2 d^2 1]等号被认为是赋值符号&#xff0c;要修改为两个等号&#xff1a; Simplify[(1 - c^2)/d^2, c^2 d^2 1]这样就不会报错了。...

Python Django 模型概述与应用

今天来为大家介绍 Django 框架的模型部分&#xff0c;模型是真实数据的简单明确的描述&#xff0c;它包含了储存的数据所必要的字段和行为&#xff0c;Django 遵循 DRY Principle 。它的目标是你只需要定义数据模型&#xff0c;然后其它的杂七杂八代码你都不用关心&#xff0c;…...

Golang Gorm 更新字段 save update updates

更新和删除操作的前提条件都是要在找到数据的情况下&#xff0c;先要查询到数据才可以做操作。 更新的前提的先查询到记录&#xff0c;Save保存所有字段&#xff0c;用于单个记录的全字段更新它会保控所有字段&#xff0c;即使零值也会保存。 在更新和删除之前&#xff0c;要利…...

springBoot 配置文件引入 redis 的相关参数说明

在Spring Boot应用中使用Redis作为缓存或数据存储时&#xff0c;可以在应用的配置文件中配置相关参数。下面是常用的Redis配置参数及其说明&#xff1a; spring.redis.host: Redis服务器主机地址&#xff0c;默认为localhost。spring.redis.port: Redis服务器端口&#xff0c;…...

Docker的使用心得:简化开发与部署的利器

开发与测试的无缝衔接&#xff1a; Docker让开发与测试之间的切换变得前所未有的顺畅。我可以在本地开发环境中创建一个与生产环境一致的Docker容器&#xff0c;这样不仅可以确保开发过程中不会出现意外问题&#xff0c;还可以在测试阶段避免不必要的繁琐配置。 跨平台的可移植…...

vue3 基于element plus对el-pagination进行二次封装

vue3 基于element plus对el-pagination进行二次封装 1、前言2、在components文件夹中新建pagination.vue文件3、在组件内使用分页 1、前言 在vue3项目中&#xff0c;如果每个列表页都敲一遍分页方法&#xff0c;显然是不合理的&#xff0c;那么&#xff0c;下面我将基于elemen…...

RuntimeError: result type Float can‘t be cast to the desired output type __int64报错解决方法

小白刚开始学习YOLOv5&#xff0c;跟随老哥的步骤走了一遍目标检测--手把手教你搭建自己的YOLOv5目标检测平台 最后训练最后一步出现RuntimeError: result type Float can‘t be cast to the desired output type __int64报错 解决方法&#xff1a;找到5.0版报错的loss.py中最…...

解析Python爬虫常见异常及处理方法

作为专业爬虫程序猿长期混迹于爬虫ip解决方案中&#xff0c;我们经常会遇到各种各样的异常情况。在爬虫开发过程中&#xff0c;处理这些异常是不可或缺的一部分。本文将为大家总结常见的Python爬虫异常&#xff0c;并分享相应的处理方法&#xff0c;帮助你避免绊倒在爬虫之路上…...

详解Spring的循环依赖问题、三级缓存解决方案源码分析

0、基础&#xff1a;Bean的生命周期 在Spring中&#xff0c;由于IOC的控制反转&#xff0c;创建对象不再是简单的new出来&#xff0c;而是交给Spring去创建&#xff0c;会经历一系列Bean的生命周期才创建出相应的对象。而循环依赖问题也是由Bean的生命周期过程导致的问题&#…...

oracle分析函数学习

0、建表及插入测试数据 --CREATE TEST TABLE AND INSERT TEST DATA. create table students (id number(15,0), area varchar2(10), stu_type varchar2(2), score number(20,2));insert into students values(1, 111, g, 80 ); insert into students values(1, 111, j, 80 ); …...

代码随想录训练营day17|110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 v...

TOC 前言 代码随想录算法训练营day17 一、Leetcode 110.平衡二叉树 1.题目 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 示例 1&#x…...

C# Thread用法

C# 中的线程&#xff08;Thread&#xff09;是一种并发执行的机制&#xff0c;允许同时执行多个代码块&#xff0c;从而提高程序的性能和响应性。下面是关于如何使用 C# 线程的一些基本用法&#xff1a; 1. 创建线程&#xff1a; 使用 System.Threading 命名空间中的 Thread 类…...

新榜 | CityWalk本地生活商业价值洞察报告

如果说现在有人问&#xff0c;最新的网络热词是什么? “CityWalk”&#xff0c;这可能是大多数人的答案。 近段时间&#xff0c;“CityWalk”刷屏了各种社交媒体&#xff0c;给网友们带来了一场“城市漫步”之旅。 脱离群体狂欢&#xff0c;这个在社交媒体引发热议的词汇背后又…...

LVS负载均衡集群-NAT模式部署

集群 集群&#xff1a;将多台主机作为一个整体&#xff0c;然后对外提供相同的服务 集群使用场景&#xff1a;高并发的场景 集群的分类 1.负载均衡器集群 减少响应延迟&#xff0c;提高并发处理的能力 2&#xff0c;高可用集群 增强系统的稳定性可靠性&…...

C++学习笔记总结练习:effective 学习日志

准则 1.少使用define define所定义的常量会在预处理的时候被替代&#xff0c;出错编译器不容易找到错误。而且还没有作用范围限制&#xff0c;推荐使用constdefine宏定义的函数&#xff0c;容易出错&#xff0c;而且参数需要加上小括号&#xff0c;推荐使用inline有的类中例如…...

Vue教程(五):样式绑定——class和style

1、样式代码准备 样式提前准备 <style>.basic{width: 400px;height: 100px;border: 1px solid black;}.happy{border: 4px solid red;background-color: rgba(255, 255, 0, 0.644);background: linear-gradient(30deg, yellow, pink, orange, yellow);}.sad{border: 4px …...

开放网关架构演进

作者&#xff1a;庄文弘&#xff08;弘智&#xff09; 淘宝开放平台是阿里与外部生态互联互通的重要开放途径&#xff0c;通过开放的产品技术把阿里经济体一系列基础服务&#xff0c;像水、电、煤一样输送给我们的商家、开发者、社区媒体以及其他合作伙伴&#xff0c;推动行业的…...

torch一些操作

Pytorch文档 Pytorch 官方文档 https://pytorch.org/docs/stable/index.html pytorch 里的一些基础tensor操作讲的不错 https://blog.csdn.net/abc13526222160/category_8614343.html 关于pytorch的Broadcast,合并与分割,数学运算,属性统计以及高阶操作 https://blog.csd…...

ICCV23 | Ada3D:利用动态推理挖掘3D感知任务中数据冗余性

​ 论文地址&#xff1a;https://arxiv.org/abs/2307.08209 项目主页&#xff1a;https://a-suozhang.xyz/ada3d.github.io/ 01. 背景与动因 3D检测(3D Detection)任务是自动驾驶任务中的重要任务。由于自动驾驶任务的安全性至关重要(safety-critic)&#xff0c;对感知算法的延…...

软件工程模型-架构师之路(四)

软件工程模型 敏捷开发&#xff1a; 个体和交互 胜过 过程和工具、可以工作的软件 胜过 面面俱到的文件、客户合作胜过合同谈判、响应变化 胜过 循序计划。&#xff08;适应需求变化&#xff0c;积极响应&#xff09; 敏捷开发与其他结构化方法区别特点&#xff1a;面向人的…...

ubuntu20.04共享文件夹—— /mnt/hgfs里没有共享文件夹

参考文章&#xff1a;https://blog.csdn.net/Edwinwzy/article/details/129580636 虚拟机启用共享文件夹后&#xff0c;/mnt/hgfs下面为空&#xff0c;使用 vmware-hgfsclient 查看设置的共享文件夹名字也是为空。 解决方法&#xff1a; 1. 重新安装vmware tools. 在菜单…...

Redis中的有序集合及其底层跳表

前言 本文着重介绍Redis中的有序集合的底层实现中的跳表 有序集合 Sorted Set Redis中的Sorted Set 是一个有序的无重复值的集合&#xff0c;他底层是使用压缩列表和跳表实现的&#xff0c;和Java中的HashMap底层数据结构&#xff08;1.8&#xff09;链表红黑树异曲同工之妙…...

js 小程序限流函数 return闭包函数执行不了

问题&#xff1a; 调用限流 &#xff0c;没走闭包的函数&#xff1a; checkBalanceReq&#xff08;&#xff09; loadsh.js // 限流 const throttle (fn, context, interval) > {console.log(">>>>cmm throttle", context, interval)let canRun…...

【数据结构】堆的初始化——如何初始化一个大根堆?

文章目录 源码是如何插入的&#xff1f;扩容向上调整实现大根堆代码&#xff1a; 源码是如何插入的&#xff1f; 扩容 在扩容的时候&#xff0c;如果容量小于64&#xff0c;那就2倍多2的扩容&#xff1b;如果大于64&#xff0c;那就1.5倍扩容。 还会进行溢出的判断&#xff0c…...

【韩顺平 零基础30天学会Java】程序流程控制(2days)

day1 程序流程控制&#xff1a;顺序控制、分支控制、循环控制 顺序控制&#xff1a;从上到下逐行地执行&#xff0c;中间没有任何判断和跳转。 Java中定义变量时要采用合法的前向引用。 分支控制if-else&#xff1a;单分支、双分支和多分支。 单分支 import java.util.Scann…...

从入门到精通Python隧道代理的使用与优化

哈喽&#xff0c;Python爬虫小伙伴们&#xff01;今天我们来聊聊如何从入门到精通地使用和优化Python隧道代理&#xff0c;让我们的爬虫程序更加稳定、高效&#xff01;今天我们将对使用和优化进行一个简单的梳理&#xff0c;并且会提供相应的代码示例。 1. 什么是隧道代理&…...

19万字智慧城市总体规划与设计方案WORD

导读&#xff1a;原文《19万字智慧城市总体规划与设计方案WORD》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 感知基础设施 感知基础设施架构由感知范围、感知手…...

[赛博昆仑] 腾讯QQ_PC端,逻辑漏洞导致RCE漏洞

简介 !! 内容仅供学习,请不要进行非法网络活动,网络不是法外之地!! 赛博昆仑是国内一家较为知名的网络安全公司&#xff0c;该公司今日报告称 Windows 版腾讯 QQ 桌面客户端出现高危安全漏洞&#xff0c;据称“黑客利用难度极低、危害较大”&#xff0c;腾讯刚刚已经紧急发布…...

python Requests

Requests概述 官方文档&#xff1a;http://cn.python-requests.org/zh_CN/latest/,Requests是python的HTTP的库&#xff0c;我们可以安全的使用 Requests安装 pip install Requests -i https://pypi.tuna.tsinghua.edu.cn/simple Requests的使用 Respose的属性 属性说明url响…...

【深入解析:数据结构栈的魅力与应用】

本章重点 栈的概念及结构 栈的实现方式 数组实现栈接口 栈面试题目 概念选择题 一、栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数…...

安卓机显示屏的硬件结构

显示屏的硬件结构 显示屏的硬件结构主要由背光源、液晶面板和驱动电路构成。可以将液晶面板看成一个三明治的结构&#xff0c;即在两片偏振方向互相垂直的偏光片系统中夹着一层液晶层。自然光源通过起偏器&#xff08;偏光片之一&#xff09;后&#xff0c;变成了垂直方向的偏…...

基于swing的超市管理系统java仓库库存进销存jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于swing的超市管理系统 系统有3权限&#xff1a;管…...

常用系统命令

重定向 cat aa.txt > bbb.txt 将输出定向到bbb.txt cat aaa.txt >> bbb.txt 输出并追加查看进程 ps ps -ef 显示所有进程 例⼦&#xff1a;ps -ef | grep mysql |&#xff1a;管道符 kill pid 结束进程&#xff0c; 如 kill 3732&#xff1b;根据进程名结束进程可以先…...

【Spring专题】Spring之Bean生命周期源码解析——阶段四(Bean销毁)(拓展,了解就好)

目录 前言阅读建议 课程内容一、Bean什么时候销毁二、实现自定义的Bean销毁逻辑2.1 实现DisposableBean或者AutoCloseable接口2.2 使用PreDestroy注解2.3 其他方式&#xff08;手动指定销毁方法名字&#xff09; 三、注册销毁Bean过程及方法详解3.1 AbstractBeanFactory#requir…...