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

【江协STM32】10-2/3 MPU6050简介、软件I2C读写MPU6050

1. MPU6050简介

  • MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景
  • 3轴加速度计(Accelerometer):测量X、Y、Z轴的加速度
  • 3轴陀螺仪传感器(Gyroscope):测量X、Y、Z轴的角速度

           

1.1 主要参数

  • 16位ADC采集传感器的模拟信号,量化范围:-32768~32767
  • 加速度计满量程选择:±2、±4、±8、±16(g)
  • 陀螺仪满量程选择: ±250、±500、±1000、±2000(°/sec)
  • 可配置的数字低通滤波器
  • 可配置的时钟源
  • 可配置的采样分频

I2C从机地址:1101000(AD0=0)、1101001(AD0=1)
如果在程序中用十六进制表示,一般有两种表示方式,以1101000地址为例。第一种,直接把7位二进制数转换为十六进制,110 1000就是0x68,所以可以说MPU6050的从机地址是0x68。在I2C通信时序中,第一个字节的高7位是从机地址,最低位是读写位,所以如果认为0x68是从机地址,在发送第一个字节时,需要先把0x68左移1位,再按位或上读写位。第二种,把0x68左移1位后的数据当做从机地址。0x68左移1位后是0xD0,则MPU6050的从机地址就是0xD0,这时在实际发送第一个字节时,如果需要写,就直接把0xD0当作第一个字节,如果需要读,就或上0x01,即0xD1当作第一个字节。

1.2 硬件电路

MPU6050模块原理图

XCL、XDA:MPU6050的6轴传感器不够用,需要进行扩展时使用,通常用于外接磁力计或者气压计,MPU6050的主机接口可以直接访问这些扩展芯片的数据,在MPU6050内有DMP单元进行数据融合和姿态解算。

1.3 模块框图

2. 软件I2C读写MPU6050

2.1 接线图

SCL接PB10、SDA接PB11。由于本节代码使用的是软件I2C,即用普通的GPIO口手动翻转电平,不需要STM32内部的外设资源支持,所以这里端口可以任意指定,也可以SCL接PA8,SDA接PA9等。

根据I2C协议的硬件规定,SCL和SDA均应外挂上拉电阻,由于模块内部自带上拉电阻,所以不需要外接。XCL和XDA用于扩展的接口,不使用。AD0引脚修改从机地址的最低位,由于模块内接了下拉电阻,所以引脚悬空相当于接地。INT中断信号输出脚,不使用。

2.2 代码

程序的整体架构:

  1. 首先,建立I2C通信层的.c和.h模块。在通信层中,写好I2C底层的GPIO初始化和6个时序基本单元(起始、终止、发送一个字节、接收一个字节、发送应答、接收应答)。
  2. 再建立MPU6050的.c的.h模块。在此层,基于I2C通信模块实现指定地址读、指定地址写,再实现写寄存器对芯片进行配置、读寄存器得到传感器数据。
  3. 最后在main.c中调用MPU6050模块,初始化,获取数据,显示数据。

由于使用的是软件I2C,所以stm32的I2C库函数就不需要看了,只需要使用GPIO的读写函数。 

MyI2C.c(防止和库函数的函数重名)

#include "stm32f10x.h"                  // Device header
#include "Delay.h"void MyI2C_Init(void)
{//  需要完成2个任务://  ① 把SCL和SDA均初始化为开漏输出模式;//  ② 把SCL和SDA置高电平。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;//  SCL是PB10,SDA是PB11GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB, GPIO_Pin_10 | GPIO_Pin_11);//   置SCL和SDA高电平
}//  对操作端口的库函数进行封装
void MyI2C_W_SCL(uint8_t BitValue)//    写SCL。参数给1或0,就可以释放或拉低SCL
{GPIO_WriteBit(GPIOB, GPIO_Pin_10, (BitAction)BitValue);Delay_us(10);// 如果单片机主频较快,可以加延时,防止从机跟不上
}void MyI2C_W_SDA(uint8_t BitValue)//    写SDA。参数给1或0,就可以释放或拉低SDA
{GPIO_WriteBit(GPIOB, GPIO_Pin_11, (BitAction)BitValue);Delay_us(10);
}uint8_t MyI2C_R_SDA(void)// 读SDA
{uint8_t BitValue;BitValue = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11);Delay_us(10);return BitValue;
}//  接下来完成I2C的6个时序基本单元
//
//  1、起始条件
//  首先确保SCL和SDA释放,然后先拉低SDA,再拉低SCL
void MyI2C_Start(void)
{MyI2C_W_SDA(1);//   释放SDAMyI2C_W_SCL(1);//   释放SCLMyI2C_W_SDA(0);//   先拉低SDAMyI2C_W_SCL(0);//   再拉低SCL
}//  2、终止条件
//  SCL高电平期间,SDA从低电平切换到高电平
void MyI2C_Stop(void)
{MyI2C_W_SDA(0);//   先拉低SDA,避免SDA之前为高电平时释放无法产生上升沿MyI2C_W_SCL(1);//   再释放SCLMyI2C_W_SDA(1);//   再释放SDA
}//  3、发送一个字节
//  SCL低电平,SDA变换数据;SCL高电平,SDA保持数据稳定。放完1位后,释放SCL,拉低SCL,驱动时钟运转
void MyI2C_SendByte(uint8_t Byte)
{uint8_t i;for(i = 0; i < 8; i++){MyI2C_W_SDA(Byte & (0x80 >> i));//  首先趁SCL低电平,把Byte的最高位放在SDA线上。下一轮就是把次高位放在SDA线上//  取Byte最高位为Byte&0x80,取次高位为Byte&0x40...在循环中,使用右移i位即可实现按位与数值的变换MyI2C_W_SCL(1);//   再释放SCL。释放后从机会立刻把SDA的数据读走MyI2C_W_SCL(0);//   拉低SCL}
}//  4、接收一个字节
//  SCL低电平,从机把数据放到SDA上,为了防止主机干扰从机写入数据,主机需要先释放SDA,释放SDA也相当于切换为输入模式
//  然后主机在SCL高电平期间读取SDA,再拉低SCL。这样重复8次,主机就能读到一个字节了。
uint8_t MyI2C_ReceiveByte(void)
{uint8_t i, Byte = 0x00;MyI2C_W_SDA(1);//   主机释放SDAfor(i = 0; i < 8; i++){MyI2C_W_SCL(1);//   主机释放SCLif(MyI2C_R_SDA() == 1)//    主机读取数据{Byte |= (0x80 >> i);// 如果读取到1,就从高到低把Byte对应位置1}MyI2C_W_SCL(0);//   读取1位后拉低SCL,这时从机会把下一位数据放到SDA上}return Byte;
}//  5、发送应答
//  其实就是发送一个字节的简化
void MyI2C_SendAck(uint8_t AckBit)
{MyI2C_W_SDA(AckBit);//  函数进入时,SCL低电平,主机把AckBit放到SDA上MyI2C_W_SCL(1);//   再释放SCL。从机读取应答MyI2C_W_SCL(0);//   拉低SCL,进入下一个时序单元
}//  6、接收应答
//  其实就是接收一个字节的简化
uint8_t MyI2C_ReceiveAck(void)
{uint8_t AckBit;MyI2C_W_SDA(1);//   函数进入时SCL低电平,主机释放SDA防止干扰从机。同时,从机把应答位放在SDA上MyI2C_W_SCL(1);//   主机释放SCL,读取应答位AckBit = MyI2C_R_SDA();MyI2C_W_SCL(0);//   读取后拉低SCL,进入下一个时序单元return AckBit;
}

MyI2C.h

#ifndef __MYI2C_H
#define __MYI2C_Hvoid MyI2C_Init(void);
void MyI2C_Start(void);
void MyI2C_Stop(void);
void MyI2C_SendByte(uint8_t Byte);
uint8_t MyI2C_ReceiveByte(void);
void MyI2C_SendAck(uint8_t AckBit);
uint8_t MyI2C_ReceiveAck(void);#endif

MPU6050.c

#include "stm32f10x.h"                  // Device header
#include "MyI2C.h"
#include "MPU6050_Reg.h"#define MPU6050_ADDRESS 0xD0// 指定地址写
void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
{MyI2C_Start();MyI2C_SendByte(MPU6050_ADDRESS);// 发送从机地址+读写位MyI2C_ReceiveAck();//   接收应答MyI2C_SendByte(RegAddress);//   指定寄存器地址MyI2C_ReceiveAck();MyI2C_SendByte(Data);//   发送写入指定寄存器地址下的数据MyI2C_ReceiveAck();MyI2C_Stop();
}//  指定地址读
uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{uint8_t Data;MyI2C_Start();MyI2C_SendByte(MPU6050_ADDRESS);// 发送从机地址+读写位MyI2C_ReceiveAck();//   接收应答MyI2C_SendByte(RegAddress);//   指定寄存器地址MyI2C_ReceiveAck();MyI2C_Start();//    重复起始条件MyI2C_SendByte(MPU6050_ADDRESS | 0xD1);//   读写位1,读出数据MyI2C_ReceiveAck();Data = MyI2C_ReceiveByte();//   从机发送数据,主机接收数据MyI2C_SendAck(1);//  这里只想要1个字节,所以不给从机应答MyI2C_Stop();return Data;
}void MPU6050_Init(void)
{MyI2C_Init();MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01);//   配置PWR_MGMT_1寄存器,解除睡眠,选择X轴陀螺仪时钟MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09);//   采样率分频,决定了数据输出的快慢。10分频MPU6050_WriteReg(MPU6050_CONFIG, 0x06);//   数字低通滤波器给110MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18);//  陀螺仪配置,选择最大量程11MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18);// 加速度计配置,选择最大量程11}uint8_t MPU6050_GetID(void)
{return MPU6050_ReadReg(MPU6050_WHO_AM_I);
}//  由于需要返回6个变量,使用指针的地址传递
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, Data_L;Data_H = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);//    加速度寄存器X轴高8位Data_L = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);*AccX = (Data_H << 8) | Data_L;//   加速度计X轴的16位数据Data_H = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);Data_L = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);*AccY = (Data_H << 8) | Data_L;Data_H = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);Data_L = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);*AccZ = (Data_H << 8) | Data_L;Data_H = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);//    陀螺仪寄存器X轴高8位Data_L = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);*GyroX = (Data_H << 8) | Data_L;//   陀螺仪X轴的16位数据Data_H = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);Data_L = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);*GyroY = (Data_H << 8) | Data_L;Data_H = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);Data_L = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);*GyroZ = (Data_H << 8) | Data_L;
}

MPU6050.h

#ifndef __MPU6050_H
#define __MPU6050_Hvoid MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data);
uint8_t MPU6050_ReadReg(uint8_t RegAddress);void MPU6050_Init(void);
void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ,int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ);
uint8_t MPU6050_GetID(void);#endif

MPU6050_Reg.h

#ifndef __MPU6050_REG_H
#define __MPU6050_REG_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#endif

main.c

#include "stm32f10x.h"                  // Device 
#include "Delay.h"
#include "MPU6050.h"int16_t AX, AY, AZ, GX, GY, GZ;int main(void)
{OLED_Init();MPU6050_Init();OLED_ShowString(1, 1, "ID:");OLED_ShowHexNum(1, 4, MPU6050_GetID(), 2);OLED_ShowString(1, 7, "Acc|Gyro");OLED_ShowString(2, 1, "X       |");OLED_ShowString(3, 1, "Y       |");OLED_ShowString(4, 1, "Z       |");while(1){MPU6050_GetData(&AX, &AY, &AZ, &GX, &GY, &GZ);OLED_ShowSignedNum(2, 3, AX, 5);OLED_ShowSignedNum(3, 3, AY, 5);OLED_ShowSignedNum(4, 3, AZ, 5);OLED_ShowSignedNum(2, 10, GX, 5);OLED_ShowSignedNum(3, 10, GY, 5);OLED_ShowSignedNum(4, 10, GZ, 5);}
}

其他引用的头文件和c代码可在此处查阅:Delay.h(【江协STM32】3-2 LED闪烁&LED流水灯&蜂鸣器,第1.3节) 

相关文章:

【江协STM32】10-2/3 MPU6050简介、软件I2C读写MPU6050

1. MPU6050简介 MPU6050是一个6轴姿态传感器&#xff0c;可以测量芯片自身X、Y、Z轴的加速度、角速度参数&#xff0c;通过数据融合&#xff0c;可进一步得到姿态角&#xff0c;常应用于平衡车、飞行器等需要检测自身姿态的场景3轴加速度计&#xff08;Accelerometer&#xff…...

【首发 1day】WordPress Crypto 插件存在前台任意用户登录漏洞(CVE-2024-9989)

漏洞描述 WordPress 的 Crypto 插件在 2.15 及以下版本(包括 2.15)中容易受到身份验证绕过攻击。这是由于对 ‘crypto_connect_ajax_process’ 函数中 ‘crypto_connect_ajax_process::log_in’ 函数的任意方法调用有限。这使得未经身份验证的攻击者可以以站点上的任何现有…...

c语言-----常识问题

1.VS的C4996错误 由于微软在VS2013中不建议再使用C的传统库函数scanf,strcpy,sprintf等&#xff0c;所以直接使用这些库函数会提示C4996错误&#xff1a; VS建议采用带_s的函数&#xff0c;如scanf_s、strcpy_s&#xff0c;但这些并不是标准C函数。 要想继续使用此函数&…...

MIUI显示/隐藏5G开关的方法,信号弱时开启手机Wifi通话方法

5G网速虽快&#xff0c;手机功耗也大。 1.取消MIUI强制的5G&#xff0c;手动设置4G的方法&#xff01; 【小米澎湃OS, Xiaomi HyperOS显示/隐藏5G开关的方法】 1.1.小米MIUI系统升级后&#xff0c;被强制连5G&#xff0c;手动设置开关被隐藏&#xff0c;如下图&#xff1a; 1…...

超简单,使用Kube-Vip实现K8s高可用VIP详细教程

具体步骤如下&#xff1a; 以下步骤在其中一个 master 上操作即可&#xff0c; 1、参数配置 export VIP192.168.0.110 export INTERFACEens33 export KVVERSIONv0.8.7VIP 是虚拟IP地址&#xff0c;和主机同一个网段&#xff0c;且未被占用。INTERFACE 是你当前主机的网络接口…...

中国数字化发展的问题与机会

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案,帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、埃域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能,如智能化推荐、…...

为什么ip属地一会河南一会江苏

在使用互联网的过程中&#xff0c;许多用户可能会遇到这样一个问题&#xff1a;自己的IP属地一会儿显示为河南&#xff0c;一会儿又变成了江苏。这种现象可能会让人感到困惑&#xff0c;甚至产生疑虑&#xff0c;担心自己的网络活动是否受到了某种影响。为了解答这一疑问&#…...

【机器学习】神经网络(BP算法)含具体计算过程

目录 神经元的“激活函数” 多层前馈网络结构​编辑 BP(BackPropagation:误差逆传播算法) BP算法推导 手动计算BP神经网络的权值来实现学习 前向传播(正向运算)的过程 隐藏层输入&#xff1a; 隐藏层输出&#xff1a; 输出层输入&#xff1a; 输出层输出&#xff1a; …...

【HarmonyOS NEXT】鸿蒙应用点9图的处理(draw9patch)

【HarmonyOS NEXT】鸿蒙应用点9图的处理&#xff08;draw9patch&#xff09; 一、前言&#xff1a; 首先在鸿蒙中是不支持安卓 .9图的图片直接使用。只有类似拉伸的处理方案&#xff0c;鸿蒙提供的Image组件有与点九图相同功能的API设置。 可以通过设置resizable属性来设置R…...

Swift语言的网络编程

Swift语言的网络编程探秘 随着移动互联网的迅猛发展&#xff0c;网络编程已经成为开发者必备的核心技能之一。尤其在iOS开发领域&#xff0c;Swift语言作为Apple官方推荐的编程语言&#xff0c;以其简洁的语法和强大的功能受到了广泛的关注。本文将深入探讨Swift语言的网络编程…...

江科大STM32入门——UART通信笔记总结

wx&#xff1a;嵌入式工程师成长日记 1、简介 简单双向串口通信有两根通信线(发送端TX和接收端RX)TX与RX要交叉连接当只需单向的数据传输时&#xff0c;可以只接一根通信线当电平标准不一致时&#xff0c;需要加电平转换芯片 传输模式&#xff1a;全双工&#xff1b;时钟&…...

2. 使用springboot做一个音乐播放器软件项目【框架搭建与配置文件】

上一章文章 我们做了 音乐播放器这个项目的 前期规划 项目需求&#xff0c; 环境安装 和 springboot框架的 搭建与配置。如果有小伙伴没看过 第一章文章 可以去看一下 https://blog.csdn.net/Drug_/article/details/144994317 今天这篇文章 我们来 主要分享一些 我们在开发中…...

历代iPhone运行内存大小和电池容量信息

系列设备名称充电端口标配充电线PD快充无线充电 (W)标配充电器电池容量 (mAh)发布时间RAM运存iPhone 16iPhone 16 Pro MaxUSB Type-CUSB-C to USB-C支持25无47472024/9/108GB LPDDR5XiPhone 16 ProUSB Type-CUSB-C to USB-C支持25无35772024/9/108GB LPDDR5XiPhone 16 PlusUSB …...

(STM32笔记)十二、DMA的基础知识与用法 第三部分

我用的是正点的STM32F103来进行学习&#xff0c;板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话&#xff0c;用的也是这个板子和教程。 DMA的基础知识与用法 三、DMA程序验证1、DMA 存储器到存储器模式实验&#xff08;1&#xff09;DMA结构体解释&#xff08;2…...

ThinkPHP 8高效构建Web应用-获取请求对象

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…...

深入解析 Python 2 与 Python 3 的差异与演进

Python 2 和 Python 3 是 Python 编程语言的两个主要版本。Python 3 于 2008 年发布&#xff0c;旨在解决 Python 2 中的一些设计缺陷&#xff0c;并引入了许多新特性。虽然 Python 2 在很长一段时间内仍然被广泛使用&#xff0c;但自 2020 年 1 月 1 日起&#xff0c;Python 2…...

57. Three.js案例-创建一个带有聚光灯和旋转立方体的3D场景

57. Three.js案例-创建一个带有聚光灯和旋转立方体的3D场景 实现效果 该案例实现了使用Three.js创建一个带有聚光灯和旋转立方体的3D场景。 知识点 WebGLRenderer&#xff08;WebGL渲染器&#xff09; THREE.WebGLRenderer 是 Three.js 中用于将场景渲染为 WebGL 内容的核…...

移动端可互动轮播图

首先通过事件监听获得到初始滑动位置&#xff0c;并关闭掉轮播图的自动轮播定时器 //设置事件代理 $(".slider").on("touchstart", function (e) {// 当滑动触发的时候关闭定时器clearInterval(time);// 开始时的pxstartX e.touches[0].clientX; }); 然…...

深入讲解 Docker 及实践

Docker 是现代化应用开发、测试和生产环境部署中不可或缺的工具。它能够为开发人员提供与生产环境一致的开发环境&#xff0c;同时支持高效的容器化部署、资源隔离、容器编排等高级功能。尤其在微服务架构和云原生应用中&#xff0c;Docker 更是提供了简化的流程和高效的可扩展…...

科大讯飞前端面试题及参考答案( 上)

前端有用到哪些数据结构? 在前端开发中,会运用到多种数据结构,以下是一些常见的类型及其应用场景。 数组(Array) 数组是一种有序的元素集合,可以存放不同类型的数据(在 JavaScript 等前端常用语言中)。比如在构建一个网页的列表展示时,像新闻列表、商品列表等,我们可…...

本地导入封装的模块 在docker内报错ImportError

本地封装了一个login方法 在写testcase的时候去复用这个方法 但是进入docker运行的时候一直报上面的错误 目录 出现的原因&#xff1a; 解决方法&#xff1a; 1. 根据docker的路径写绝对路径 2. 用sys 加入path到code 作用&#xff1a; 好处&#xff1a; 出现的原因…...

Java-日志技术大全

一&#xff1a;目录 1.jul的使用 2.log4j的使用 3.logback的使用 4.log4j2的使用 二&#xff1a;jul使用 jul是JDK自带的日志技术&#xff0c;不需要导入其他依赖&#xff0c;默认的级别为info 1.关键组件&#xff1a; (1).Logger&#xff1a;记录器 (2).Handler&…...

ARP-Batch-Retargeting 部署实战

git 地址&#xff1a; https://github.com/Shimingyi/ARP-Batch-Retargeting bpy安装&#xff1a; pypi上搜索 bpy bpy 4.3.0&#xff0c;4.2.0版本报错&#xff1a; Traceback (most recent call last):File "E:\project\jijia_4d\retarget\ARP-Batch-Retargeting-…...

二分查找题目:寻找峰值 II

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法证明代码复杂度分析 题目 标题和出处 标题&#xff1a;寻找峰值 II 出处&#xff1a;1901. 寻找峰值 II 难度 7 级 题目描述 要求 一个二维网格中的峰值元素是指其值严格大于相邻值&#xff08;左、…...

调和级数不为整数的证明

文章目录 1. 问题引入2. 证明2.1 引理12.2 引理22.3 引理3&#xff1a;2.4 核心证明&#xff1a; 3. 参考 1. 问题引入 s ( n ) 1 1 2 1 3 ⋯ 1 n , n ∈ N ∗ , n ≥ 2 s(n) 1\frac{1}{2}\frac{1}{3}\cdots\frac{1}{n}, \quad \\n \in N^*, n \ge2 s(n)121​31​⋯n1​,…...

Redis 源码分析-内部数据结构 dict

Redis 源码分析-内部数据结构 dict 在上一篇 Redis 数据库源码分析 提到了 Redis 其实用了全局的 hash 表来存储所有的键值对&#xff0c;即下方图示的 dict&#xff0c;dict 中有两个数组&#xff0c;其中 ht[1] 只在 rehash 时候才真正用到&#xff0c;平时都是指向 null&am…...

git相关操作笔记

git相关操作笔记 1. git init git init 是一个 Git 命令&#xff0c;用于初始化一个新的 Git 仓库。执行该命令后&#xff0c;Git 会在当前目录创建一个 .git 子目录&#xff0c;这是 Git 用来存储所有版本控制信息的地方。 使用方法如下&#xff1a; &#xff08;1&#xff…...

STM32小实验2

定时器实验 TIM介绍 TIM&#xff08;Timer&#xff09;定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断…...

Oracle Dataguard(主库为双节点集群)配置详解(2):备库安装 Oracle 软件

Oracle Dataguard&#xff08;主库为双节点集群&#xff09;配置详解&#xff08;2&#xff09;&#xff1a;备库安装 Oracle 软件 目录 Oracle Dataguard&#xff08;主库为双节点集群&#xff09;配置详解&#xff08;2&#xff09;&#xff1a;备库安装 Oracle 软件一、Orac…...

基于 Pod 和 Service 注解的服务发现

基于 Pod 和 Service 注解的服务发现 背景 很多应用会为 Pod 或 Service 打上一些注解用于 Prometheus 的服务发现&#xff0c;如 prometheus.io/scrape: "true"&#xff0c;这种注解并不是 Prometheus 官方支持的&#xff0c;而是社区的习惯性用法&#xff0c;要使…...

操作系统之文件的逻辑结构

目录 无结构文件&#xff08;流式文件&#xff09; 有结构文件&#xff08;记录式文件&#xff09; 分类&#xff1a; 顺序文件 特点&#xff1a; 存储方式&#xff1a; 逻辑结构&#xff1a; 优缺点&#xff1a; 索引文件 目的&#xff1a; 结构&#xff1a; 特点…...

网络分析与监控:阿里云拨测方案解密

作者&#xff1a;俞嵩(榆松) 随着互联网的蓬勃发展&#xff0c;网络和服务的稳定性已成为社会秩序中不可或缺的一部分。一旦网络和服务发生故障&#xff0c;其带来的后果将波及整个社会、企业和民众的生活质量&#xff0c;造成难以估量的损失。 2020 年 12 月&#xff1a; Ak…...

vue实现虚拟列表滚动

<template> <div class"cont"> //box 视图区域Y轴滚动 滚动的是box盒子 滚动条显示的也是因为box<div class"box">//itemBox。 一个空白的盒子 计算高度为所有数据的高度 固定每一条数据高度为50px<div class"itemBox" :st…...

服务器/电脑与代码仓gitlab/github免密连接

git config --global user.name "xxxx" git config --global user.email "xxxxxx163.com" #使用注册GitHub的邮箱 生成对应邮箱的密码对 ssh-keygen -t rsa -b 4096 -C "xxxxxx163.com" 把公钥id_rsa.pub拷贝到github中 Setting----->…...

用户界面软件03

一种标准的满足不同的非功能性需求的技术是对子系统进行不同的考虑……但是一个用户 界面要求有大量的域层面的信息&#xff0c;以符合比较高的人机工程标准&#xff0c;所以&#xff0c;这些分开的子系统还是 紧密地耦合在一起的。 一个软件架构师的标准反应是将不同的非功能…...

年会抽奖Html

在这里插入图片描述 <!-- <video id"backgroundMusic" src"file:///D:/background.mp3" loop autoplay></video> --> <divstyle"width: 290px; height: 580px; margin-left: 20px; margin-top: 20px; background: url(D:/nianhu…...

(一)Ubuntu20.04版本的ROS环境配置与基本概述

前言 ROS不需要在特定的环境下进行安装&#xff0c;不管你是Ubuntu的什么版本或者还是虚拟机都可以按照教程进行安装。 1.安装ROS 一键安装ros及ros2 wget http://fishros.com/install -O fishros && . fishros 按照指示安装你想要的ros。 ros和ros2是可以兼容的…...

深入分析线程安全问题的本质

深入分析线程安全问题的本质 1. 并发编程背后的性能博弈2. 什么是线程安全问题&#xff1f;3. 源头之一&#xff1a;原子性问题3.1. 原子性问题示例3.2. 原子性问题分析3.3. 如何解决原子性问题&#xff1f; 4. 源头之二&#xff1a;可见性问题4.1. 为什么会有可见性问题&#…...

58. Three.js案例-创建一个带有红蓝配置的半球光源的场景

58. Three.js案例-创建一个带有红蓝配置的半球光源的场景 实现效果 本案例展示了如何使用Three.js创建一个带有红蓝配置的半球光源的场景&#xff0c;并在其中添加一个旋转的球体。通过设置不同的光照参数&#xff0c;可以观察到球体表面材质的变化。 知识点 WebGLRenderer …...

插入实体自增主键太长,mybatis-plaus自增主键

1、问题 spring-boot整合mybtais执行insert语句时&#xff0c;主键id为长文本数据。 2、分析问题 1)数据库主键是否自增 2&#xff09;数据库主键的种子值设置的多少 3、解决问题 1&#xff09;数据库主键设置的时自增 3&#xff09;种子值是1 所以排查是数据库的问题 4、继…...

【利用 Unity + Mirror 网络框架、Node.js 后端和 MySQL 数据库】

要实现一个简单的1v1战斗小游戏&#xff0c;利用 Unity Mirror 网络框架、Node.js 后端和 MySQL 数据库&#xff0c;我们可以将其分为几个主要部分&#xff1a;客户端&#xff08;Unity&#xff09;、服务器&#xff08;Node.js&#xff09;和数据库&#xff08;MySQL&#xf…...

https原理

一、基本概念 1、https概念 https&#xff08;全称&#xff1a; Hypertext Transfer Protocol Secure&#xff0c;超文本传输安全协议&#xff09;&#xff0c;是以安全为目标的http通道&#xff0c;简单讲是http的安全版。 2、为啥说http协议不安全呢&#xff1f; 我们用h…...

如何处理京东商品详情接口返回的JSON数据中的缺失值?

1.在 Python 中处理缺失值 使用if - else语句进行检查和处理 假设通过requests库获取了接口返回的 JSON 数据&#xff0c;并使用json模块进行解析&#xff0c;存储在data变量中。 import json import requestsurl "YOUR_API_URL" response requests.get(url) dat…...

window对象

bom dom部分学完了&#xff0c;来看看bom吧~ bom是整个浏览器&#xff0c;本质上bom与dom是包含的关系&#xff0c;window是里面最大的对象 调用的方法默认对象是window&#xff0c;一般都会省略前面的window 创建的全局变量也是属于window的&#xff0c;当然window也可以省…...

(五)ROS通信编程——参数服务器

前言 参数服务器在ROS中主要用于实现不同节点之间的数据共享&#xff08;P2P&#xff09;。参数服务器相当于是独立于所有节点的一个公共容器&#xff0c;可以将数据存储在该容器中&#xff0c;被不同的节点调用&#xff0c;当然不同的节点也可以往其中存储数据&#xff0c;关…...

MySQL常用命令之汇总(Summary of Commonly Used Commands in MySQL)

MySQL常用命令汇总 简介 ‌MySQL是一个广泛使用的开源关系型数据库管理系统&#xff0c;由瑞典的MySQL AB公司开发&#xff0c;现属于Oracle公司。‌ MySQL支持SQL&#xff08;结构化查询语言&#xff09;&#xff0c;这是数据库操作的标准语言&#xff0c;用户可以使用SQL进…...

更新至2023年,各省数字经济变量/各省数字经济相关指标数据集(20个指标)

更新至2023年&#xff0c;各省数字经济相关指标数据集&#xff08;20个指标&#xff09; 1、时间&#xff1a;更新至2023年&#xff0c;具体时间如下 2、指标&#xff1a;互联网宽带接入端口(万个)&#xff08;2006-2023&#xff09;、互联网宽带接入用户(万户)&#xff08;2…...

聚类系列 (二)——HDBSCAN算法详解

在进行组会汇报的时候&#xff0c;为了引出本研究动机&#xff08;论文尚未发表&#xff0c;暂不介绍&#xff09;&#xff0c;需要对DBSCAN、OPTICS、和HDBSCAN算法等进行详细介绍。在查询相关资料的时候&#xff0c;发现网络上对于DBSCAN算法的介绍非常多与细致&#xff0c;但…...

【JavaEE】—— SpringBoot项目集成百度千帆AI大模型(对话Chat V2)

本篇文章在SpringBoot项目中集成百度千帆提供的大模型接口实现Chat问答效果&#xff1a; 一、百度智能云 百度千帆大模型平台是百度智能云推出的一个企业级一站式大模型与AI原生应用开发及服务平台。 注册地址&#xff1a;https://qianfan.cloud.baidu.com/ 注册成功后&…...

一种更激进的Hook实现方案猜想

XXX原创不原创不清楚&#xff0c;暂定为原创。毕竟windows 大神很多XXX 昨天才发现不是原创&#xff0c;这种方案是VEH HOOK的一种实现方案。VEH HOOK很久很久以前都被广泛使用了。只是自己没听说过。好悲哀呀。。。。 激进的猜想&#xff1a; 如果VEH HOOK在内核态处理异常…...