软件I2C读写MPU6050代码

news2024/11/26 17:36:33

1、硬件电路

  • SCL引到了STM32的PB10号引脚,SDA引到了PB11号引脚
  • 软件I2C协议: 用普通GPIO口,手动反转电平实现协议,不需要STM32内部的外设资源支持,故端口是可以任意指定
  • MPU605在SCL和SDA自带了两个上拉电阻,故不需要额外接上拉电阻
  • AD0引脚:修改从机地址的最低位,其内置了下拉电阻,故引脚悬空时,相当于接地
  • INT:中断信号输出引脚,没用到,不接

2、I2C部分代码解释 

(1)发送字节

void MyI2C_SendByte(uint8_t Byte)
{
    //先把数据放到SDA上面,然后SCL先置1,再置零,将SDA上面的数据送出去
	uint8_t i;
	for (i = 0; i < 8; i ++)
	{
		MyI2C_W_SDA(Byte & (0x80 >> i));//先去最高位
		MyI2C_W_SCL(1);//驱动时钟走一个脉冲
		MyI2C_W_SCL(0);
	}
}
  •  除了终止条件,SCL以高电平结束,所有单元以低电平结束,方便各个单元的拼接
  •  趁着SCL是低电平,先把数据放在SDA上,再MyI2C_W_SCL(1);MyI2C_W_SCL(0);
  • SCL是原本是低电平,此时先高电平再低电平,使得SDA走一个时钟,读取SCL的数据

 (2)读取字节

SCL低电平期间,从机将数据位依次放到SDA线上(高位先行)

 

uint8_t MyI2C_ReceiveByte(void)
{
    //SDA先置1,这个时候从机把第一个数据放到SDA上,然后SCL置1,读取从机的数据
	uint8_t i, Byte = 0x00;
	MyI2C_W_SDA(1);//主机释放SDA,从机把数据放到SDA,这时,主机释放SCL,SCL高电平,主机就能读取数据(高位先行)
	for (i = 0; i < 8; i ++)
	{
		MyI2C_W_SCL(1);//SCL高电平,主机就可能读取数据了
        //置1之后读取SDA的数据
		if (MyI2C_R_SDA() == 1){Byte |= (0x80 >> i);}//如果不是高电平,就默认是写进0
		MyI2C_W_SCL(0);
	}
	return Byte;//把接收的字节放回过去
}
  • 接收一个字节,开始时,SCL为低电平,从机把数据放在SDA,为了防止主机干扰从机写入数据
  • 主机先释放SDA,释放SDA相当于切换为输入模式,故在SCL低电平时,从机会把数据放到SDA
  • 如果从机想发1,就释放SDA,发0,拉低SDA,然后主机释放SCL,在SCL高电平期间,读取SDA
  • 即在SCL为低电平的时候,SDA写入数据,等SCL释放时,读SDA数据,即为读写分离的方式
  • 故在读写数据的时候,SCL是在SDA低电平的时候变化,在高电平的时候不变,

        在起始和终止的时候,SCL是在SDA高电平的时候变化 

(3)接收应答 

  • 函数进来时,SCL为低电平,主机释放SDA,防止干扰从机,同时从机把应答位放在SDA上,
  • SCL高电平,主机读取应答位,SCL低电平,进入下一个时序单元
uint8_t MyI2C_ReceiveAck(void)
{
    //将SDA置1后,这个时候从机把应答位放在SDA上,这个时候只需要SCL置1,后置零,读取数据即可,记得是        
    //在SCL为高电平的时候读取数据,然后读取完之后SCL再置零
	uint8_t AckBit;
	MyI2C_W_SDA(1);
	MyI2C_W_SCL(1);
	AckBit = MyI2C_R_SDA();//此处不一定是1,
	MyI2C_W_SCL(0);
	return AckBit;
}
  • AckBit = MyI2C_R_SDA();//此处不一定是1,  
  • 原因:I2C的引脚都是开漏输出+弱上拉配置,主机输出1,并不是强制SDA为高电平而是释放SDA
  •  I2C是在进行通信,主机释放SDA,从机在的情况下,有义务将SDA拉低,故读到0,代表从机给了应答,1则从机应答 

 3、MyI2C.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
 
//写SCL的函数
void MyI2C_W_SCL(uint8_t BitValue)
{
	GPIO_WriteBit(GPIOB, GPIO_Pin_10, (BitAction)BitValue);
	Delay_us(10);
}
 
//写SDA的函数
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);//读取SDA的线
	Delay_us(10);
	return BitValue;
}
 
//MyI2C初始化
void MyI2C_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出模式(仍然可以输入,输入时,先输出1,再直接读取输入数据寄存器)
	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);//都为高电平,处于空闲状态
}
 
 
 
//兼容起始条件和重复条件
void MyI2C_Start(void)
{
	MyI2C_W_SDA(1);//先确保释放数据线,再释放SCL
	MyI2C_W_SCL(1);
	MyI2C_W_SDA(0);//拉低数据线,触发通讯
	MyI2C_W_SCL(0);//拉低时钟线,方便数据线上的数据变化
}
 
//终止条件
//确保释放的时候,能产生上升沿,需要先拉底数据线,后面在SCL是高电平的时候,再拉高SDA
void MyI2C_Stop(void)
{
	MyI2C_W_SDA(0);
	MyI2C_W_SCL(1);
	MyI2C_W_SDA(1);
}
//除了终止条件,SCL以高电平结束,所有单元以低电平结束,方便各个单元的拼接
 
//发送一个字节的逻辑(以stm32为视角)
void MyI2C_SendByte(uint8_t Byte)
{
	uint8_t i;
	for (i = 0; i < 8; i ++)
	{
		//除了终止条件,SCL以高电平结束,所有单元以低电平结束,方便各个单元的拼接
		//趁着SCL是低电平,先把数据放在SDA上,再让SDA走一个时钟
		MyI2C_W_SDA(Byte & (0x80 >> i));//先去最高位
		MyI2C_W_SCL(1);//驱动时钟走一个脉冲
		MyI2C_W_SCL(0);
	}
}
 
//接收一个字节,开始时,SCL为低电平,从机把数据放在SDA,为了防止主机干扰从机写入数据
//主机先释放SDA,释放SDA相当于切换为输入模式,故在SCL低电平时,从机会把数据放到SDA
//如果从机想发1,就释放SDA,发0,拉低SDA,然后主机释放SCL,在SCL高电平期间,读取SDA
//即在SCL为低电平的时候,SDA写入数据,等SCL释放时,读SDA数据,即为读写分离的方式
//故在读写数据的时候,SCL是在SDA低电平的时候变化,在高电平的时候不变,
//在起始和终止的时候,SCL是在SDA高电平的时候变化
uint8_t MyI2C_ReceiveByte(void)
{
	uint8_t i, Byte = 0x00;
	MyI2C_W_SDA(1);//主机释放SDA,从机把数据放到SDA,这时,主机释放SCL,SCL高电平,主机就能读取数据(高位先行)
	for (i = 0; i < 8; i ++)
	{
		MyI2C_W_SCL(1);//SCL高电平,主机就可能读取数据了
		if (MyI2C_R_SDA() == 1){Byte |= (0x80 >> i);}//如果不是高电平,就默认是写进0
		MyI2C_W_SCL(0);
	}
	return Byte;//把接收的字节放回过去
}
 
 
//发送应答
//函数进来时,SCL为低电平,
void MyI2C_SendAck(uint8_t AckBit)
{
	MyI2C_W_SDA(AckBit);
	MyI2C_W_SCL(1);
	MyI2C_W_SCL(0);//进入下一个时序单元
}
 
 
//接收应答
//函数进来时,SCL为低电平,主机释放SDA,防止干扰从机,同时,从机把应答位放在SDA上,
//SCL高电平,主机读取应答位,SCL低电平,进入下一个时序单元
uint8_t MyI2C_ReceiveAck(void)
{
	uint8_t AckBit;
	MyI2C_W_SDA(1);
	MyI2C_W_SCL(1);
	AckBit = MyI2C_R_SDA();//此处不一定是1,
	//原因:I2C的引脚都是开漏输出+弱上拉配置,主机输出1,并不是强制SDA为高电平而是释放SDA
	//I2C是在进行通信,主机释放SDA,从机在的情况下,有义务将SDA拉低,故读到0,代表从机给了应答,1则从机应答
	MyI2C_W_SCL(0);
	return AckBit;
}

4、MPU6050.c   在这个代码当中写到了MPU读写寄存器等函数

#include "stm32f10x.h"                  // Device header
#include "MyI2C.h"
#include "MPU6050_Reg.h"
 
#define MPU6050_ADDRESS		0xD0
 
//基于I2C通信的模块,实现指定地址读、指定地址写,再实现写寄存器对芯片进行配置,读寄存器得到传感器数据
 
//指定地址写
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 | 0x01);//读
	MyI2C_ReceiveAck();
	//若想要给多个数据,则用for循环接收,然后MyI2C_SendAck(0),最后再写1
	Data = MyI2C_ReceiveByte();
	MyI2C_SendAck(1);//1不给从机应答,0给从机应答(想读多个字节,给应答),如果在这里给了应答,那么从机就会源源不断发送数据
	MyI2C_Stop();
	
	return Data;//地址
}
 
 
 
 
//目前的配置:解除睡眠、选择陀螺仪时钟,6个轴均不待机,采样分频为10
//滤波参数给最大,陀螺仪个加速度计都选择最大量程
void MPU6050_Init(void)
{
	MyI2C_Init();
	MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01);
	//电源管理寄存器1:翻手册:一位一位赋值,不复位,解除睡眠,不需要循环,温度传感器失能,001:选择x轴的螺旋仪时钟
	MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);
	//电源管理寄存器2:00:不需要循环模式唤醒频率,后6位,每个轴的待机位,全部给0,不需要待机
	MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09);//10分频
	//采样率分频,这8位决定了数据的快慢,值越小越快,根据实际的需求来,
	MPU6050_WriteReg(MPU6050_CONFIG, 0x06);
	//配置寄存器:前两位:没用,第3位到5位:000不需要外部同步,最后三位:110,最平滑的数字低通滤波器
	MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18);
	//陀螺仪配置寄存器:前面三位:自测使能,不自测;4、5位:满量程选择,11,选择最大量程,后面三位无关位
	MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18);
	//加速度计配置寄存器:自测给000,满量程给最大量程11,用不到高通滤波器00
}
 
uint8_t MPU6050_GetID(void)
{
	return MPU6050_ReadReg(MPU6050_WHO_AM_I);
}
 
/*
获取数据
加速度传感器的输出数据(x轴y轴和z轴的加速度)
陀螺仪传感器的输出数据(x轴y轴和z轴的角速度)
改变MPU6050传感器的姿态,6个数据就会对应变化
*/
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(MPU6050_ACCEL_XOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);
	*AccX = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);
	*AccY = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);
	*AccZ = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);
	*GyroX = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);
	*GyroY = (DataH << 8) | DataL;
	
	DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);
	DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);
	*GyroZ = (DataH << 8) | DataL;
}

5、MPU6050_Reg.c

#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//加速度寄存器X轴的高8位
#define	MPU6050_ACCEL_XOUT_L	0x3C//加速度寄存器X轴的低8位
#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//陀螺仪的x轴
#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//电源管理寄存器1,地址是0x6B
#define	MPU6050_PWR_MGMT_2		0x6C//电源管理寄存器2,地址是0x6B
#define	MPU6050_WHO_AM_I		0x75
 
#endif

6、main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "MPU6050.h"
 
uint8_t ID;
int16_t AX, AY, AZ, GX, GY, GZ;
//写好I2C底层的GPIO初始化和6各时序基本单元
//起始、终止、发送一个字节、接受一个字节、发送应答和接收应答
 
int main(void)
{
	OLED_Init();
	MPU6050_Init();
	
	
	OLED_ShowString(1, 1, "ID:");
	ID = MPU6050_GetID();
	OLED_ShowHexNum(1, 4, ID, 2);
	
	while (1)
	{
		MPU6050_GetData(&AX, &AY, &AZ, &GX, &GY, &GZ);
		OLED_ShowSignedNum(2, 1, AX, 5);
		OLED_ShowSignedNum(3, 1, AY, 5);
		OLED_ShowSignedNum(4, 1, AZ, 5);
		OLED_ShowSignedNum(2, 8, GX, 5);
		OLED_ShowSignedNum(3, 8, GY, 5);
		OLED_ShowSignedNum(4, 8, GZ, 5);
	}
}

7、从机地址

该设备中只有AD0一个引脚,故只有两个名字,若有AD0和AD1两个引脚,则有4个名字

最后一位为0,否则就是把控制权交出去

I2C从机地址:1101000(AD0=0)——>1101 0000 0xD0

                        1101001(AD0=1)——>1101 0010 0xD2

8、验证结果 

将陀螺仪 放在水平位置上

显示屏读出的六个数据是

+00130 -00018

-00017 -00003

+01943 -00007

验证数据

配置的是量程最大的18g,故1943/32768=x/16g x=0.949g,接近1

把设备上倾,x轴正值,下倾,x轴负值

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

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

相关文章

漏刻有时地理信息系统说明文档(LOCKGIS、php后台管理、三端一体PC-H5-微信小程序、百度地图jsAPI二次开发、标注弹窗导航)

漏刻有时地理信息系统LOCKGIS 前言一、运行环境&#xff08;一&#xff09;环境检查&#xff08;二&#xff09;权限检查&#xff08;三&#xff09;函数支持&#xff08;四&#xff09;域名相关 二、核心代码&#xff08;一&#xff09;坐标展示&#xff08;二&#xff09;实时…

Excel快捷键大全(2023最新版总结)

案例&#xff1a;Excel快捷键大全 【作为一名打工人&#xff0c;我总是要用到Excel表格&#xff0c;大家平常在使用Excel时都有什么比较好用的快捷键推荐吗&#xff1f;】 Excel是一款功能强大的电子表格软件&#xff0c;可以用于数据管理、计算、分析和报表生成等多种任务。…

HDFS的数据流

1.HDFS写数据流程 &#xff08;1&#xff09;客户端通过Distributed FileSystem模块向NameNode请求上传文件&#xff0c;NameNode检查目标文件是否已存在&#xff0c;父目录是否存在。 &#xff08;2&#xff09;NameNode返回是否可以上传。 &#xff08;3&#xff09;客户端…

Shell系统编程三剑客之----AWK

目录 1.AWK工具简介 2.AWK的基本格式 3.AWK工作原理 4.常见的内建变量&#xff08;可直接用&#xff09; 二&#xff1a; AWK实例 1.按行输出文本 2.按字段输出文本 3.通过管道、双引号调用 Shell 命令 4.date命令输出时间 5. 查看内存使用占比 6.查看cpu使用占比 7.…

【linux】shell编程—快捷命令

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、快捷排序 - sort二、快捷去重 - uniq三、快捷替换 - tr四、快速裁剪 - cut五、文件拆分 - split六、文件合并 - paste七、变量扫描器 - eval 一、快捷排序 - so…

5个良心好用的Windows神级软件,让你打开新世界的大门

今天再次推荐5个良心好用的Windows神级软件&#xff0c;每一个都是完全免费&#xff0c;堪称神器&#xff0c;让你打开新世界的大门。 1.PPT插件——OneKeyTools OK插件是一款免费的PPT插件&#xff0c;让你的PPT制作有无限可能&#xff01;它的功能&#xff0c;太多了&#…

CoCo数据集-目标检测指标MAP

文章目录 一、前言二、评价指标的一些概念2.1.一些概念2.2.概念介绍2.3.MAP求解 三、理解CoCo的评价指标四、总结五、学习视频、Coco官方地址 一、前言 前面学习了coco数据集但是不知道它的评价指标&#xff0c;所以写下来作为自己的笔记&#xff0c;以后还是直接在这写好再保…

算法设计期末考试

算法设计期末考试 1.分治法3选11.1全排列1.2二分法--金块问题1.3子数组换位问题 2.贪心选2题2.1 活动安排2.2 活动安排&#xff08;改&#xff09;2.3 最优装载2.4 多机调度2.5 最优服务次序问题2.6 多处最优服务次序问题 3.动态规划选1-2题3.1最长公共子序列3.2最大子段和3.3 …

这个原因,让你自动化测试年薪30W+也不能躺平

其实这个问题&#xff0c;我们遇到到很多次&#xff1a; “自动化就可以满足我现在的公司需求&#xff0c;为什么不躺平&#xff0c;还要继续学测开&#xff1f;” 每次遇到这个问题后&#xff0c;立马就会有一个“涨薪效应”&#xff1a;收到粉丝们的高薪offer ​ 其实&#x…

星河案例ㅣ中国电信 X 冲量在线:基于智算中心的隐私计算应用实践

▏摘要 中国电信是中国三大运营商之一&#xff0c;为响应国家“东数西算”工程的全新数据中心形态&#xff0c;中国电信引入隐私计算平台&#xff0c;对内实现数据确权跟踪、对外实现数据共享交易&#xff0c;盘活中国电信分布在全国不同区域的数据资源和算力资源&#xff0c;…

软件测试行业对新人友好吗?为什么?

随着信息技术的迅猛发展&#xff0c;软件测试行业成为了一个备受青睐的职业领域&#xff0c;但是对于没有经验和专业背景的新人来说&#xff0c;进入这个行业是否容易&#xff0c;是否有足够的发展空间呢&#xff1f;接下来从多个方面分析和介绍。 如果你想学习软件测试&#…

踩坑:MapperScannerConfigurer导致@PropertySource中@Value无效

问题描述 问题描述&#xff1a;在配置类中使用PropertySource引入了.properties文件&#xff0c;但是使用Value注入时&#xff0c;结果竟然null。 郁闷了一上午。 在Spring与MyBatis整合时&#xff0c;需要注入MyBatis的自动扫描配置类MapperScannerConfigurer的Bean 我用的是…

[Orillusion]-使用 -windwos-4行命令

前两天看了webgpu的开源库Orillusion | 专业 WebGPU 引擎 Orillusion感觉很不错的样子&#xff0c;准备试一下。因为都是做OpenGL和windows桌面端。 web有点小陌生&#xff0c;记录一下。 准备&#xff1a; Google Chrome Canary 最新版&#xff0c;老版本有问题 nodejs 版…

ChatGPT商业源码授权

ChatGPT商业源码是由OpenAI公司开发并拥有版权的&#xff0c;未经授权擅自使用、复制、分发或修改可能涉及侵犯知识产权等法律问题&#xff0c;并可能会受到相应的法律惩罚。 如果您需要使用ChatGPT商业版&#xff0c;可以考虑通过OpenAI官方渠道进行授权购买。此外&#x…

ENSP网络综合实验(WALN+隧道+NAT)

实验拓扑 https://wwa.lanzoub.com/ivTyH0w8vz6d 设备接入、汇聚交换机&#xff08;S3700、S5700&#xff09;、路由器&#xff08;AR3200&#xff09;为例。 接入层&#xff1a;用户角色包括员工&#xff08;接入方式包括有线和无线&#xff09;和访客&#xff08;仅能通过无…

深入了解ribbon源码

ribbon源码解析 自动装配 依赖 <!--添加ribbon的依赖--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency>spring-cloud-starter-netflix-…

skywalking agent使用kafka数据传输

安装Zookeeper 下载相应版本的zookeeper 解压文件 tar -vxzf apache-zookeeper-3.8.0-bin.tar.gz进入conf目录下&#xff0c;复制zoo_sample.cfg文件&#xff0c;这个是官方提供的配置样例&#xff0c;我们修改复制的文件名称未zoo.cfg。 进入bin目录&#xff0c;启动zookeep…

医院三级质控信息化支撑工具之一

建立组织,完善管理制度 新华社北京3月23日电 近日&#xff0c;中共中央办公厅、国务院办公厅印发了《关于进一步完善医疗卫生服务体系的意见》&#xff0c;并发出通知&#xff0c;要求各地区各部门结合实际认真贯彻落实。(原文地址:中共中央办公厅 国务院办公厅印发《关于进一步…

【读论文】Seeing Beyond the Brain:MinD-Vis

Seeing Beyond the Brain: Conditional Diffusion Model with Sparse Masked Modeling for Vision Decoding CVPR 2023 基于稀疏掩膜的条件扩散模型视觉解码 背景 了解大脑活动并恢复编码信息是认知神经科学的关键目标&#xff0c;但由于脑信号的复杂潜在表征以及相关数据&a…

Nginx 配置 安全认证 反向代理 HDFS web 页面

Nginx 配置安全认证 反向代理 HDFS web 页面 这样做的目的是&#xff1a;相对安全一些&#xff0c;之前都是直接“裸奔”经常被攻击很讨厌 文章目录 1、下载 NGINX2、解压 NGINX3、编译 NGINX4、编译后&#xff0c;确认 NGINX 安装目录5、配置 NGINX 为系统服务6、安装 密码生…