6.STM32之通信接口《精讲》之IIC通信---硬件IIC(STM32自带的硬件收发器)

news2024/12/1 4:57:27

上一节,完成了对IIC软件的实验程序,也就是说只要我们编程能够模拟IIC协议规定的时序,所有IIC的外设就能解析IIC的读出我们数据,就能和相关IIC外设进行交互,然后,STM32自带硬件收发电路,接下来我们就进行硬件IIC的学习,(这个插播一句,USART可以用软件实现吗?)

【STM32-I2C学习总结】STM32:硬件-IIC详解 , 固件库编程 , 手把手教你实现IIC_stm32硬件iic-CSDN博客

代码:

硬件IIC配置

MPU6050.c

#include "stm32f10x.h"                  // Device header
#include "MPU6050.h"
#include "MPU6050_Reg_Config.h"





#define MPU6050_Address 0xD0  // 定义MPU6050的I2C地址

void MPU6050_WaitEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT)
{
	uint32_t Timeout = 10000;
	while(!I2C_CheckEvent(I2Cx, I2C_EVENT))
	{
		Timeout--;
		if(Timeout == 0)
		{
			break;
		}
	}
}

// MPU6050初始化函数
void MPU6050_Init(void)
{
//	MyIIC_Init();  // 初始化I2C通信
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	
	GPIO_InitTypeDef GPIO_InitStruture;
	GPIO_InitStruture.GPIO_Mode = GPIO_Mode_AF_OD;
	GPIO_InitStruture.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
	GPIO_InitStruture.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruture);
	
	I2C_DeInit(I2C2);
	I2C_InitTypeDef I2C_InitStructrue;
	I2C_InitStructrue.I2C_Ack = I2C_Ack_Enable;	
	I2C_InitStructrue.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
	I2C_InitStructrue.I2C_ClockSpeed = 	100000;
	I2C_InitStructrue.I2C_DutyCycle = I2C_DutyCycle_2;
	I2C_InitStructrue.I2C_Mode = I2C_Mode_I2C;
	I2C_InitStructrue.I2C_OwnAddress1 = 0x00;
	I2C_Init(I2C2, &I2C_InitStructrue);
	I2C_Cmd(I2C2,ENABLE);
	
	MPU6050_Register_W(MPU_PWR_MGMT1_REG, 0x01);  // 设置MPU6050的电源管理寄存器
	MPU6050_Register_W(MPU_PWR_MGMT2_REG, 0x00);  // 关闭某些休眠模式,确保传感器工作
	MPU6050_Register_W(MPU_SAMPLE_RATE_REG, 0x09);  // 设置采样率
	MPU6050_Register_W(MPU_CFG_REG, 0x06);  // 配置低通滤波器
	MPU6050_Register_W(MPU_GYRO_CFG_REG, 0x18);  // 设置陀螺仪的量程
	MPU6050_Register_W(MPU_ACCEL_CFG_REG, 0x18);  // 设置加速度计的量程
}

// 写寄存器函数
void MPU6050_Register_W(uint8_t MPU6050_Reg_Addr, uint8_t Data)
{
//	MyIIC_Start();  // 启动I2C通信
//	MyIIC_SendByte(MPU6050_Address);  // 发送MPU6050的I2C地址
//	MyIIC_ReceiveAck();  // 接收应答
//	MyIIC_SendByte(MPU6050_Reg_Addr);  // 发送寄存器地址
//	MyIIC_ReceiveAck();  // 接收应答
//	MyIIC_SendByte(Data);  // 发送数据
//	MyIIC_ReceiveAck();  // 接收应答
//	MyIIC_Stop();  // 停止I2C通信
	
	
	
	I2C_GenerateSTART(I2C2,ENABLE);
	MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT);
	
	I2C_Send7bitAddress(I2C2,MPU6050_Address,I2C_Direction_Transmitter);
	MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);
	
	I2C_SendData(I2C2, MPU6050_Reg_Addr);
	MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTING);
	
	I2C_SendData(I2C2, Data);
	MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED);
	
	I2C_GenerateSTOP(I2C2,ENABLE);
	
	

}

// 读取寄存器函数
uint8_t MPU6050_Regiter_R(uint8_t MPU6050_Reg_Addr)
{
	uint8_t Data;
//	MyIIC_Start();  // 启动I2C通信
//	MyIIC_SendByte(MPU6050_Address);  // 发送MPU6050的I2C地址
//	MyIIC_ReceiveAck();  // 接收应答
//	MyIIC_SendByte(MPU6050_Reg_Addr);  // 发送寄存器地址
//	MyIIC_ReceiveAck();  // 接收应答
//	
//	MyIIC_Start();  // 重新启动I2C通信
//	MyIIC_SendByte(MPU6050_Address | 0x01);  // 发送读取命令(地址加1)
//	MyIIC_ReceiveAck();  // 接收应答
//	Data = MyIIC_ReveiveByte();  // 读取数据
//	MyIIC_SendAck(1);  // 发送应答
//	MyIIC_Stop();  // 停止I2C通信
	
	I2C_GenerateSTART(I2C2,ENABLE);
	MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT);
	
	I2C_Send7bitAddress(I2C2,MPU6050_Address,I2C_Direction_Transmitter);
	while(!I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
	
	I2C_SendData(I2C2, MPU6050_Reg_Addr);
	MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED);

	I2C_GenerateSTART(I2C2,ENABLE);
	MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT);
	
	I2C_Send7bitAddress(I2C2,MPU6050_Address,I2C_Direction_Receiver);
	MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED);
	
	I2C_AcknowledgeConfig(I2C2,DISABLE);
	I2C_GenerateSTOP(I2C2,ENABLE);
	
	MPU6050_WaitEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED );
	Data = I2C_ReceiveData(I2C2);

	return Data;  // 返回读取到的数据
}


// 读取MPU6050传感器的加速度计和陀螺仪数据
void MPU6050_RegState_Data(int16_t* Acce_X, int16_t* Acce_Y, int16_t* Acce_Z, int16_t* GYRO_X, int16_t* GYRO_Y, int16_t* GYRO_Z)
{
	uint8_t DataH, DataL;
	// 读取加速度计X轴数据
	DataH = MPU6050_Regiter_R(MPU_ACCEL_XOUTH_REG);
	DataL = MPU6050_Regiter_R(MPU_ACCEL_XOUTL_REG);
	*Acce_X = (DataH << 8) | DataL;  // 合并高低字节并保存到Acce_X
	
	// 读取加速度计Y轴数据
	DataH = MPU6050_Regiter_R(MPU_ACCEL_YOUTH_REG);
	DataL = MPU6050_Regiter_R(MPU_ACCEL_YOUTL_REG);
	*Acce_Y = (DataH << 8) | DataL;  // 合并高低字节并保存到Acce_Y
	
	// 读取加速度计Z轴数据
	DataH = MPU6050_Regiter_R(MPU_ACCEL_ZOUTH_REG);
	DataL = MPU6050_Regiter_R(MPU_ACCEL_ZOUTL_REG);
	*Acce_Z = (DataH << 8) | DataL;  // 合并高低字节并保存到Acce_Z
	
	// 读取陀螺仪X轴数据
	DataH = MPU6050_Regiter_R(MPU_GYRO_XOUTH_REG);
	DataL = MPU6050_Regiter_R(MPU_GYRO_XOUTL_REG);
	*GYRO_X = (DataH << 8) | DataL;  // 合并高低字节并保存到GYRO_X
	
	// 读取陀螺仪Y轴数据
	DataH = MPU6050_Regiter_R(MPU_GYRO_YOUTH_REG);
	DataL = MPU6050_Regiter_R(MPU_GYRO_YOUTL_REG);
	*GYRO_Y = (DataH << 8) | DataL;  // 合并高低字节并保存到GYRO_Y
	
	// 读取陀螺仪Z轴数据
	DataH = MPU6050_Regiter_R(MPU_GYRO_ZOUTH_REG);
	DataL = MPU6050_Regiter_R(MPU_GYRO_ZOUTL_REG);
	*GYRO_Z = (DataH << 8) | DataL;  // 合并高低字节并保存到GYRO_Z
}

// 读取MPU6050的设备ID
uint8_t MPU6050_ID(void)
{
	return MPU6050_Regiter_R(MPU_DEVICE_ID_REG);  // 读取并返回设备ID
}

// 获取MPU6050的传感器数据并返回结构体指针
MPU6050_Data* MPU6050_Struct_Data(void)
{
    static MPU6050_Data sensorData;  // 定义静态结构体变量,确保返回的指针有效

    uint8_t DataH, DataL;
    
    // 读取加速度计 X 轴数据
    DataH = MPU6050_Regiter_R(MPU_ACCEL_XOUTH_REG);
    DataL = MPU6050_Regiter_R(MPU_ACCEL_XOUTL_REG);
    sensorData.Acce_X = (DataH << 8) | DataL;  // 合并高低字节并保存到sensorData.Acce_X
    
    // 读取加速度计 Y 轴数据
    DataH = MPU6050_Regiter_R(MPU_ACCEL_YOUTH_REG);
    DataL = MPU6050_Regiter_R(MPU_ACCEL_YOUTL_REG);
    sensorData.Acce_Y = (DataH << 8) | DataL;  // 合并高低字节并保存到sensorData.Acce_Y
    
    // 读取加速度计 Z 轴数据
    DataH = MPU6050_Regiter_R(MPU_ACCEL_ZOUTH_REG);
    DataL = MPU6050_Regiter_R(MPU_ACCEL_ZOUTL_REG);
    sensorData.Acce_Z = (DataH << 8) | DataL;  // 合并高低字节并保存到sensorData.Acce_Z
    
    // 读取陀螺仪 X 轴数据
    DataH = MPU6050_Regiter_R(MPU_GYRO_XOUTH_REG);
    DataL = MPU6050_Regiter_R(MPU_GYRO_XOUTL_REG);
    sensorData.Gyro_X = (DataH << 8) | DataL;  // 合并高低字节并保存到sensorData.Gyro_X
    
    // 读取陀螺仪 Y 轴数据
    DataH = MPU6050_Regiter_R(MPU_GYRO_YOUTH_REG);
    DataL = MPU6050_Regiter_R(MPU_GYRO_YOUTL_REG);
    sensorData.Gyro_Y = (DataH << 8) | DataL;  // 合并高低字节并保存到sensorData.Gyro_Y
    
    // 读取陀螺仪 Z 轴数据
    DataH = MPU6050_Regiter_R(MPU_GYRO_ZOUTH_REG);
    DataL = MPU6050_Regiter_R(MPU_GYRO_ZOUTL_REG);
    sensorData.Gyro_Z = (DataH << 8) | DataL;  // 合并高低字节并保存到sensorData.Gyro_Z

    return &sensorData;  // 返回结构体指针
}































这是一个用于STM32F10x微控制器的MPU6050传感器I2C通信驱动程序。下面是详细解释:

  1. 初始化与配置 (MPU6050_Init()):
  • 配置I2C通信接口(使用I2C2)
  • 初始化GPIOB的PB10和PB11引脚用于I2C通信
  • 配置MPU6050传感器的基本参数,包括:
    • 电源管理
    • 采样率
    • 低通滤波器配置
    • 陀螺仪和加速度计量程设置
  1. 寄存器读写函数:
  • MPU6050_Register_W(): 向MPU6050特定寄存器写入数据
  • MPU6050_Regiter_R(): 从MPU6050特定寄存器读取数据
  1. 数据读取函数:
  • MPU6050_RegState_Data(): 读取加速度计和陀螺仪的X、Y、Z轴数据
  • MPU6050_Struct_Data(): 将传感器数据打包到结构体中并返回
  1. 其他实用函数:
  • MPU6050_ID(): 读取MPU6050的设备ID
  • MPU6050_WaitEvent(): 等待I2C通信事件完成,并设置超时机制

关键特点:

  • 使用硬件I2C(I2C2)进行通信
  • 支持读取加速度计和陀螺仪的原始数据
  • 配置了传感器的基本工作参数
  • 包含错误处理机制(超时检测)

代码主要用于嵌入式系统中获取MPU6050传感器的运动和姿态数据。

源码:上传明细-CSDN创作中心

这段代码主要涉及 MPU6050 传感器的初始化和数据读取,利用 STM32F10x 微控制器通过 I2C 与 MPU6050 进行通信。以下是对每个部分的详细解释:

头文件和宏定义

 

c

复制代码

#include "stm32f10x.h" // Device header #include "MPU6050.h" #include "MPU6050_Reg_Config.h" #define MPU6050_Address 0xD0 // 定义MPU6050的I2C地址

  • #include "stm32f10x.h":包含 STM32F10x 系列 MCU 的头文件,提供硬件寄存器的访问和一些标准库函数。
  • #include "MPU6050.h"#include "MPU6050_Reg_Config.h":包含 MPU6050 相关的函数和寄存器定义头文件。
  • MPU6050_Address 0xD0:定义了 MPU6050 的 I2C 地址,其中 0xD0 是 MPU6050 的 I2C 地址的 8 位形式(设备地址为 0x68,但是加上读/写位后,I2C 地址会变成 0xD00xD1)。

MPU6050_WaitEvent 函数

 

c

复制代码

void MPU6050_WaitEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT) { uint32_t Timeout = 10000; while(!I2C_CheckEvent(I2Cx, I2C_EVENT)) { Timeout--; if(Timeout == 0) { break; } } }

  • 功能:该函数用于等待指定的 I2C 事件发生。
  • I2C_CheckEvent(I2Cx, I2C_EVENT):检查 I2C 是否已触发指定的事件。
  • 通过 Timeout 控制超时,防止程序在等待时进入死循环。

MPU6050_Init 函数

 

c

复制代码

void MPU6050_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitTypeDef GPIO_InitStruture; GPIO_InitStruture.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStruture.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStruture.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStruture); I2C_DeInit(I2C2); I2C_InitTypeDef I2C_InitStructrue; I2C_InitStructrue.I2C_Ack = I2C_Ack_Enable; I2C_InitStructrue.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructrue.I2C_ClockSpeed = 100000; I2C_InitStructrue.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructrue.I2C_Mode = I2C_Mode_I2C; I2C_InitStructrue.I2C_OwnAddress1 = 0x00; I2C_Init(I2C2, &I2C_InitStructrue); I2C_Cmd(I2C2, ENABLE); // 设置MPU6050寄存器 MPU6050_Register_W(MPU_PWR_MGMT1_REG, 0x01); // 设置电源管理寄存器 MPU6050_Register_W(MPU_PWR_MGMT2_REG, 0x00); // 关闭休眠模式 MPU6050_Register_W(MPU_SAMPLE_RATE_REG, 0x09); // 设置采样率 MPU6050_Register_W(MPU_CFG_REG, 0x06); // 配置低通滤波器 MPU6050_Register_W(MPU_GYRO_CFG_REG, 0x18); // 设置陀螺仪的量程 MPU6050_Register_W(MPU_ACCEL_CFG_REG, 0x18); // 设置加速度计的量程 }

  • 功能:初始化 I2C 总线和 MPU6050 传感器。
  • 通过 RCC_APB1PeriphClockCmdRCC_APB2PeriphClockCmd 启用 I2C2 和 GPIOB 时钟。
  • 配置 GPIOB 的引脚 10 和 11 为 I2C2 的 SDA 和 SCL。
  • 设置 I2C 参数,如时钟速率、应答使能、地址模式等。
  • 最后,配置 MPU6050 寄存器来启用其工作状态、关闭休眠模式、设置采样率、配置滤波器等。

MPU6050_Register_W 函数

 

c

复制代码

void MPU6050_Register_W(uint8_t MPU6050_Reg_Addr, uint8_t Data) { I2C_GenerateSTART(I2C2, ENABLE); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT); I2C_Send7bitAddress(I2C2, MPU6050_Address, I2C_Direction_Transmitter); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED); I2C_SendData(I2C2, MPU6050_Reg_Addr); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTING); I2C_SendData(I2C2, Data); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED); I2C_GenerateSTOP(I2C2, ENABLE); }

  • 功能:通过 I2C 向 MPU6050 写入数据。
  • 先生成启动信号,然后发送设备地址和写操作指令。
  • 接着发送寄存器地址和数据,最后生成停止信号。

MPU6050_Regiter_R 函数

 

c

复制代码

uint8_t MPU6050_Regiter_R(uint8_t MPU6050_Reg_Addr) { uint8_t Data; I2C_GenerateSTART(I2C2, ENABLE); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT); I2C_Send7bitAddress(I2C2, MPU6050_Address, I2C_Direction_Transmitter); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED); I2C_SendData(I2C2, MPU6050_Reg_Addr); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED); I2C_GenerateSTART(I2C2, ENABLE); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT); I2C_Send7bitAddress(I2C2, MPU6050_Address, I2C_Direction_Receiver); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED); I2C_AcknowledgeConfig(I2C2, DISABLE); I2C_GenerateSTOP(I2C2, ENABLE); MPU6050_WaitEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED); Data = I2C_ReceiveData(I2C2); return Data; }

  • 功能:通过 I2C 从 MPU6050 读取数据。
  • 首先发送设备地址和寄存器地址,接着生成重复启动信号以切换到接收模式。
  • 禁用 ACK 并生成停止信号后,读取接收到的数据。

MPU6050_RegState_Data 函数

 

c

复制代码

void MPU6050_RegState_Data(int16_t* Acce_X, int16_t* Acce_Y, int16_t* Acce_Z, int16_t* GYRO_X, int16_t* GYRO_Y, int16_t* GYRO_Z) { uint8_t DataH, DataL; // 读取加速度计和陀螺仪的数据 // 合并高低字节并保存到传入的变量 }

  • 功能:读取加速度计和陀螺仪的三轴数据,并将结果合并成 16 位数据(高字节和低字节合并)。
  • 通过调用 MPU6050_Regiter_R 函数读取每个轴的数据。

MPU6050_ID 函数

 

c

复制代码

uint8_t MPU6050_ID(void) { return MPU6050_Regiter_R(MPU_DEVICE_ID_REG); // 读取并返回设备ID }

  • 功能:读取 MPU6050 的设备 ID。

MPU6050_Struct_Data 函数

 

c

复制代码

MPU6050_Data* MPU6050_Struct_Data(void) { static MPU6050_Data sensorData; // 定义静态结构体变量,确保返回的指针有效 uint8_t DataH, DataL; // 读取传感器数据并存储到结构体

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

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

相关文章

springboot337校园失物招领系统pf(论文+源码)_kaic

校园失物招领网站的设计与实现 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定校园失物招领网站…

智能探针技术:实现可视、可知、可诊的主动网络运维策略

网络维护的重要性 网络运维是确保网络系统稳定、高效、安全运行的关键活动。在当今这个高度依赖信息技术的时代&#xff0c;网络运维的重要性不仅体现在技术层面&#xff0c;更关乎到企业运营的方方面面。网络运维具有保障网络的稳定性、提升网络运维性能、降低企业运营成本等…

mybatis笔记01——初始配置

JavaEE三层架构&#xff1a;表现层&#xff08;负责与用户的交互&#xff0c;通常实现了用户界面&#xff09;、业务逻辑层&#xff08;处理核心业务规则和逻辑&#xff0c;是应用程序的“心脏”。&#xff09;、数据访问层&#xff08;负责与数据源&#xff08;如数据库&#…

第7篇 寻找最大数___ARM C语言程序<三>

Q&#xff1a;可以将寻找到的最大数结果显示在DE1-SoC开发板的硬件外设如红色LED上吗&#xff1f; A&#xff1a;基本原理&#xff1a;对红色LED的Data寄存器进行写操作即可。DE1-SoC_Computer系统上连接到红色LED的并行端口的内存映射地址为0xFF200000&#xff0c;是一个18位…

力扣刷题TOP101:6.BM7 链表中环的入口结点

目录&#xff1a; 目的 思路 复杂度 记忆秘诀 python代码 目的 {1,2},{3,4,5}, 3 是环入口。 思路 这个任务是找到带环链表的环入口。可以看作是上一题龟兔赛跑&#xff08;Floyd 判圈算法&#xff09;的延续版&#xff1a;乌龟愤愤不平地举报兔子跑得太快&#xff0c;偷偷…

webrtc视频会议学习(三)

文章目录 关联&#xff1a;源码搭建coturn服务器nginx配置ice配置需服务器要开放的端口 效果 关联&#xff1a; webrtcP2P音视频通话&#xff08;一&#xff09; webrtcP2P音视频通话&#xff08;二&#xff09; webrtc视频会议学习&#xff08;三&#xff09; 源码 WebRTC…

mac上的建议xftp 工具

mac上的建议xftp 工具 最近使用mac比较频繁了&#xff0c;但是第一次重度使用mac里面有很多的工具都是新的&#xff0c;有的window版本的工具无法使用。 xftp 的平替 Cyberduck 从它的官网上下载是免费的&#xff0c;但是如果使用 Apple store 要花费198呢。这不就剩下一大笔…

paimon的四种changelog模式(1)-input模式

环境创建 CREATE CATALOG fs_catalog WITH (typepaimon,warehousefile:/data/soft/paimon/catalog );USE CATALOG fs_catalog;drop table if exists t_changelog_input;CREATE TABLE t_changelog_input (age BIGINT,money BIGINT,hh STRING,PRIMARY KEY (hh) NOT ENFORCED )WIT…

【趣味】斗破苍穹修炼文字游戏HTML,CSS,JS

目录 图片展示 游戏功能 扩展功能 完整代码 实现一个简单的斗破苍穹修炼文字游戏&#xff0c;你可以使用HTML、CSS和JavaScript结合来构建游戏的界面和逻辑。以下是一个简化版的游戏框架示例&#xff0c;其中包含玩家修炼的过程、增加修炼进度和显示经验值的基本功能。 图片…

一款现代化的轻量级跨平台Redis桌面客户端

Tiny RDM‌ 是一款现代化的轻量级跨平台Redis桌面客户端&#xff0c;专为开发和运维人员设计&#xff0c;旨在提供便捷、高效的Redis操作体验。它支持macOS、Windows和Linux操作系统&#xff0c;安装包大小约为10MB&#xff0c;具有广泛的兼容性和便携性‌。 功能特性 ‌轻量级…

【大数据学习 | Spark调优篇】Spark之JVM调优

1. Java虚拟机垃圾回收调优的背景 如果在持久化RDD的时候&#xff0c;持久化了大量的数据&#xff0c;那么Java虚拟机的垃圾回收就可能成为一个性能瓶颈。因为Java虚拟机会定期进行垃圾回收&#xff0c;此时就会追踪所有的java对象&#xff0c;并且在垃圾回收时&#xff0c;找…

《使用Python进行数据挖掘:理论、应用与案例研究》

嘿&#xff0c;今天我要给你们介绍一本使用Python进行数据挖掘的好书。这本书是由吴迪博士撰写的&#xff0c;他是雷曼学院商学院的助理教授&#xff0c;也是数据科学的实战派。 在这个时代&#xff0c;数据多得让人眼花缭乱&#xff0c;要从中找出有用的信息&#xff0c;那可不…

C++之C++11新特性(三)--- 智能指针

目录 一、智能指针 1.1 为什么需要智能指针 1.2 内存泄漏 1.2.1 内存泄漏的基本概念 1.2.2 内存泄漏的分类 1.2.3 如何避免内存泄漏 1.3 智能指针的使用及其原理 1.3.1 RAII 1.3.2 智能指针的基本原理 1.3.3 auto_ptr 1.3.4 unique_ptr 1.3.5 shared_ptr 1.3.6 sha…

Flink学习连载文章8--时间语义

Time的分类 (时间语义) EventTime:事件(数据)时间,是事件/数据真真正正发生时/产生时的时间 IngestionTime:摄入时间,是事件/数据到达流处理系统的时间 ProcessingTime:处理时间,是事件/数据被处理/计算时的系统的时间 EventTime的重要性 假设&#xff0c;你正在去往地下停…

【Docker】部署nginx

docker部署nginx docker部署nginx镜像加速器1、拉取nginx镜像2、创建nginx容器3、浏览器访问 docker部署nginx 镜像加速器 备注&#xff1a;阿里云镜像加速地址 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors可用的镜像源&#xff1a; https://https://reg…

github webhooks 实现网站自动更新

本文目录 Github Webhooks 介绍Webhooks 工作原理配置与验证应用云服务器通过 Webhook 自动部署网站实现复制私钥编写 webhook 接口Github 仓库配置 webhook以服务的形式运行 app.py Github Webhooks 介绍 Webhooks是GitHub提供的一种通知方式&#xff0c;当GitHub上发生特定事…

Rust SQLx CLI 同步迁移数据库

上文我们介绍了SQLx及SQLite&#xff0c;并介绍了如何使用代码同步迁移数据库。本文介绍Sqlx cli 命令行工具&#xff0c;介绍如何安装、使用&#xff0c;利用其提供的命令实现数据表同步迁移。Java生态中有flyway, sqlx cli 功能类似&#xff0c;利用命令行工具可以和其他语言…

论文笔记-WWW2024-ClickPrompt

论文笔记-WWW2024-ClickPrompt: CTR Models are Strong Prompt Generators for Adapting Language Models to CTR Prediction ClickPrompt: CTR模型是大模型适配CTR预测任务的强大提示生成器摘要1.引言2.预备知识2.1传统CTR预测2.2基于PLM的CTR预测 3.方法3.1概述3.2模态转换3.…

解析客服知识库搭建的五个必要性

在当今竞争激烈的商业环境中&#xff0c;客服知识库的搭建已成为企业提升服务质量、优化客户体验的重要手段。一个完善的客服知识库不仅能帮助企业高效管理客户服务流程&#xff0c;还能显著提升客户满意度和忠诚度。以下是搭建客服知识库的五个必要性&#xff1a; 1. 提升服务…

css—轮播图实现

一、背景 最近和朋友在一起讨论的时候&#xff0c;我们提出了这样的一个提问&#xff0c;难道轮播图的效果只能通过js来实现吗&#xff1f;经过我们的一系列的争论&#xff0c;发现了这是可以通过纯css来实现这一效果的&#xff0c;CSS轮播图也是一种常见的网页展示方式&#x…