STM32入门——IIC通讯

news2025/1/21 20:29:21

江科大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		0xD0

void 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;
	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/895341.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python“牵手”lazada商品评论数据采集方法,lazadaAPI申请指南

lazada平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范&#xff0c;lazadaAPI接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问lazada平台的数据&#xff0c;包括商品信息、店铺信息、物流信息等&#xff0c;从而实现la…

程序人生:进不了大厂的测试员,究竟还有没有出路了?

金九银十的到来&#xff0c;使得许多职场人按耐不住&#xff0c;纷纷开始找寻合适的工作机会。猎头和HR们摩拳擦掌&#xff0c;争取在这两个月给今年多加点业绩。 对许多互联网人来说&#xff0c;跳槽意味着加薪&#xff0c;而对于程序员而言&#xff0c;是否能跳槽进大厂是他…

前端---需要了解浏览器相关知识--浏览器请求服务器资源---缓存

知识点1: 掘金1&#xff1a;浏览器缓存 掘金2 :浏览器缓存 一、浏览器缓存 请求&#xff08;静态资源 &#xff5c; 动态资源&#xff09; 一、缓存是什么&#xff1f; 如果没有缓存的机制 每次都要重新请求静态资源 1.从网络上的下载时间&#xff0c;肯定大于从硬盘里读的…

《树莓派4B家庭服务器搭建指南》第二十期:在树莓派运行rsnapshot, 实现对服务器数据低成本增量本地备份

title: 020《树莓派4B家庭服务器搭建指南》第二十期&#xff1a;在树莓派运行rsnapshot, 实现对服务器数据低成本增量本地备份 我的天翼云服务器有/opt 和 /usr/share/nginx两个目录, 用来存储网站的内容, 数据无价, 为了避免珍贵的数据丢失&#xff0c;我决定使用树莓派运行 …

TikTok或将于8月底关闭半闭环、速卖通或将推出“半托管”模式

《出海周报》是运营坛为外贸企业主和外贸人独家打造的重要资讯栏目&#xff0c;聚焦企业出海、海外市场动态、海外监管政策等方面&#xff0c;以简捷的方式&#xff0c;提升读者获取资讯的效率。 接下来运营坛为大家带来第15期出海周报&#xff0c;快来看看这周国内外市场发生了…

【经验】VScode远程连接Ubuntu出错的解决办法(2023年,完整的排查思路)

用VScode常常会碰到以下情况&#xff0c;Could not establish connection。 先介绍一下VScode远程连接和终端SSH连接的区别&#xff1a;终端直接用SSH连接时&#xff0c;只需要开启SSH服务&#xff0c;并消耗少量的内存即可&#xff1b;VScode连接时&#xff0c;会自动在服务器…

HCIP实验之MPLS

目录 一&#xff0c;实验题目 ​编辑 拓扑与IP地址规划如图所示 二&#xff0c;实验思路 三&#xff0c;实验步骤 3.1 私网部分IP地址配置 3.2 LSP部分配置 3.3 启动OSPF协议 3.4 启动MPLS协议 3.5 启动MPLS VPN 3.6 实现公网私网互通 3.7 配置BGP 3.8 双向重发布 …

Python软件外包开发框架

Python有许多流行的开发框架&#xff0c;用于不同类型的应用开发&#xff0c;包括Web应用、数据科学、人工智能等。以下分享一些常见的Python开发框架及其特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流…

[MySQL] — 数据类型和表的约束

目录 数据类型 数据类型分类 数值类型 tinyint类型 bit类型 小数类型 float decimal 字符串类型 char varchar char和varchar的区别 日期和时间类型 enum 和 set 表的约束 空属性 默认值 列描述 zeorfill 主键 创建表时在字段上指定主键 删除主键&#xff1a; 追…

Lnton羚通算法算力云平台在环境配置时 OpenCV 无法显示图像是什么原因?

问题&#xff1a; cv2.imshow 显示图像时报错&#xff0c;无法显示图像 0%| | 0/1 [00:00<…

IDEA连接MySQL数据库错误

说明&#xff1a;使用IDEA连接云服务器中的MySQL数据库时&#xff0c;报下面的这个错误&#xff1b; [08S01] Communications link failureThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the serve…

docker cURL error 6: Could not resolve host

场景&#xff1a; 微信小程序 获取 用户 openpid&#xff0c;在此之前&#xff0c;我需要先 "获取稳定版接口调用凭据"&#xff0c;根据手册提示的&#xff0c;要先调用 https://api.weixin.qq.com/cgi-bin/stable_token 我这边就开始了请求&#xff0c;结果返回了…

上班族的高效时间管理软件,可一直显示在电脑桌面上

在现代职场中&#xff0c;相信工作党都深有体会&#xff0c;繁忙的工作带来的压力和任务都堆积如山&#xff0c;如果没有一个良好的时间管理系统&#xff0c;我们可能会一筹莫展。而高效管理时间的好处也是显而易见的&#xff0c;它不仅可以帮助我们更好地安排工作&#xff0c;…

Linux Day09

目录 一、进程替换 二、Linux信号的使用 2.1 kill() 发送信号 2.2 signal() 改变进程对信号的响应方式 2.3 处理僵死进程 2.3.1 在信号处理函数中调用wait 2.3.2 Linux特有的 2.3.3 结果 一、进程替换 linux上创造一个新进程&#xff0c;没有create创建方法&#xf…

【Mysql】MVCC版本机制的多并发

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

Android3:布局

一。线性布局 创建项目Linear Layout Example activity_main.xml <?xml version"1.0" encoding"utf-8"?><LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"an…

微信转账警示!切莫在此时输入密码

微信已经成为我们日常生活中不可或缺的社交工具&#xff0c;通过微信红包和转账完成支付也变得非常普遍。 然而&#xff0c;正如人们常说的&#xff0c;树大招风。随着微信的广泛使用&#xff0c;骗子们也愈发猖獗&#xff0c;他们利用微信进行诈骗活动&#xff0c;使许多人遭受…

手把手教你快速使用java与cpp的互相调用

在jni的开发过程中&#xff0c;如果需要实现java和c之间的接口调用&#xff0c;就要定义一个方法来实现&#xff0c;如果有多个接口调用&#xff0c;就需要定义多个方法来实现&#xff0c;这里介绍一种抽象的接口&#xff0c;只需要分别定义一个javaCallCpp和cppCallJava方法就…

Spring框架入门以及 ioc的三种注入方式

目录 一、Spring是什么&#xff0c;它能够做什么 spring的组成 二、什么是控制反转&#xff08;或依赖注入&#xff09; 三、 如何在spring当中定义和配置一个JavaBean 四、注入方式 1.构造函数注入 2.Setter方法注入 3.自动装配 五、简单属性配置与复杂属性配置 简单…

AIGC:【LLM(六)】——Dify:一个易用的 LLMOps 平台

文章目录 一.简介1.1 LLMOps1.2 Dify 二.核心能力三.Dify安装3.1 快速启动3.2 配置 四.Dify使用五.调用开源模型六.接通闭源模型七.在 Dify.AI 探索不同模型潜力7.1 快速切换&#xff0c;测验不同模型的表现7.2 降低模型能力对比和选择的成本 一.简介 1.1 LLMOps LLMOps&…