LV.12 D24 陀螺仪实验 学习笔记

一、陀螺仪实验代码分析

    设置GPB_2引脚和GPB_3引脚功能为I2C传输引脚


#include "exynos_4412.h"/****************MPU6050内部寄存器地址****************/#define	SMPLRT_DIV		0x19	//陀螺仪采样率,典型值:0x07(125Hz)
#define	CONFIG			0x1A	//低通滤波频率,典型值:0x06(5Hz)
#define	GYRO_CONFIG		0x1B	//陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
#define	ACCEL_CONFIG	0x1C	//加速计自检、测量范围及高通滤波频率,典型值:0x18(不自检,2G,5Hz)
#define	ACCEL_XOUT_H	0x3B
#define	ACCEL_XOUT_L	0x3C
#define	ACCEL_YOUT_H	0x3D
#define	ACCEL_YOUT_L	0x3E
#define	ACCEL_ZOUT_H	0x3F
#define	ACCEL_ZOUT_L	0x40
#define	TEMP_OUT_H		0x41
#define	TEMP_OUT_L		0x42
#define	GYRO_XOUT_H		0x43
#define	GYRO_XOUT_L		0x44
#define	GYRO_YOUT_H		0x45
#define	GYRO_YOUT_L		0x46
#define	GYRO_ZOUT_H		0x47
#define	GYRO_ZOUT_L		0x48
#define	PWR_MGMT_1		0x6B	//电源管理,典型值:0x00(正常启用)
#define	WHO_AM_I		0x75	//IIC地址寄存器(默认数值0x68,只读)
#define	SlaveAddress	0x68	//MPU6050-I2C地址/************************延时函数************************/void mydelay_ms(int time)
{int i,j;while(time--){for(i=0;i<5;i++)for(j=0;j<514;j++);}
}/*********************************************************************** 函数功能:I2C向特定地址写一个字节* 输入参数:* 		slave_addr: I2C从机地址* 			  addr: 芯片内部特定地址* 			  data:写入的数据
**********************************************************************/void iic_write (unsigned char slave_addr, unsigned char addr, unsigned char data)
{/*对时钟源进行512倍预分频  打开IIC中断(每次完成一个字节的收发后中断标志位会自动置位)*/I2C5.I2CCON = I2C5.I2CCON | (1<<6) | (1<<5);/*设置IIC模式为主机发送模式  使能IIC发送和接收*/I2C5.I2CSTAT = 0xd0;/*将第一个字节的数据写入发送寄存器  即从机地址和读写位(MPU6050-I2C地址+写位0)*/I2C5.I2CDS = slave_addr<<1;/*设置IIC模式为主机发送模式  发送起始信号启用总线  使能IIC发送和接收*/I2C5.I2CSTAT = 0xf0;/*等待从机接受完一个字节后产生应答信号(应答后中断挂起位自动置位)*/while(!(I2C5.I2CCON & (1<<4)));/*将要发送的第二个字节数据(即MPU6050内部寄存器的地址)写入发送寄存器*/I2C5.I2CDS = addr;/*清除中断挂起标志位  开始下一个字节的发送*/I2C5.I2CCON = I2C5.I2CCON & (~(1<<4));/*等待从机接受完一个字节后产生应答信号(应答后中断挂起位自动置位)*/while(!(I2C5.I2CCON & (1<<4)));/*将要发送的第三个字节数据(即要写入到MPU6050内部指定的寄存器中的数据)写入发送寄存器*/I2C5.I2CDS = data;/*清除中断挂起标志位  开始下一个字节的发送*/I2C5.I2CCON = I2C5.I2CCON & (~(1<<4));/*等待从机接受完一个字节后产生应答信号(应答后中断挂起位自动置位)*/while(!(I2C5.I2CCON & (1<<4)));/*发送停止信号  结束本次通信*/I2C5.I2CSTAT = 0xD0;/*清除中断挂起标志位*/I2C5.I2CCON = I2C5.I2CCON & (~(1<<4));/*延时*/mydelay_ms(10);
}/*********************************************************************** 函数功能:I2C从特定地址读取1个字节的数据* 输入参数:         slave_addr: I2C从机地址* 			       addr: 芯片内部特定地址* 返回参数: unsigned char: 读取的数值
**********************************************************************/unsigned char iic_read(unsigned char slave_addr, unsigned char addr)
{unsigned char data = 0;/*对时钟源进行512倍预分频  打开IIC中断(每次完成一个字节的收发后中断标志位会自动置位)*/I2C5.I2CCON = I2C5.I2CCON | (1<<6) | (1<<5);/*设置IIC模式为主机发送模式  使能IIC发送和接收*/I2C5.I2CSTAT = 0xd0;/*将第一个字节的数据写入发送寄存器  即从机地址和读写位(MPU6050-I2C地址+写位0)*/I2C5.I2CDS = slave_addr<<1;/*设置IIC模式为主机发送模式  发送起始信号启用总线  使能IIC发送和接收*/I2C5.I2CSTAT = 0xf0;/*等待从机接受完一个字节后产生应答信号(应答后中断挂起位自动置位)*/while(!(I2C5.I2CCON & (1<<4)));/*将要发送的第二个字节数据(即要读取的MPU6050内部寄存器的地址)写入发送寄存器*/I2C5.I2CDS = addr;/*清除中断挂起标志位  开始下一个字节的发送*/I2C5.I2CCON = I2C5.I2CCON & (~(1<<4));/*等待从机接受完一个字节后产生应答信号(应答后中断挂起位自动置位)*/while(!(I2C5.I2CCON & (1<<4)));/*清除中断挂起标志位  重新开始一次通信  改变数据传送方向*/I2C5.I2CCON = I2C5.I2CCON & (~(1<<4));/*将第一个字节的数据写入发送寄存器  即从机地址和读写位(MPU6050-I2C地址+读位1)*/I2C5.I2CDS = slave_addr << 1 | 0x01;/*设置IIC为主机接收模式  发送起始信号  使能IIC收发*/I2C5.I2CSTAT = 0xb0;/*等待从机接收到数据后应答*/while(!(I2C5.I2CCON & (1<<4)));/*禁止主机应答信号(即开启非应答  因为只接收一个字节)  清除中断标志位*/I2C5.I2CCON = I2C5.I2CCON & (~(1<<7))&(~(1<<4));/*等待接收从机发来的数据*/while(!(I2C5.I2CCON & (1<<4)));/*将从机发来的数据读取*/data = I2C5.I2CDS;/*直接发起停止信号结束本次通信*/I2C5.I2CSTAT = 0x90;/*清除中断挂起标志位*/I2C5.I2CCON = I2C5.I2CCON & (~(1<<4));/*延时等待停止信号稳定*/mydelay_ms(10);return data;}/*********************************************************************** 函数功能:MPU6050初始化
**********************************************************************/void MPU6050_Init ()
{iic_write(SlaveAddress, PWR_MGMT_1, 0x00); 		//设置使用内部时钟8Miic_write(SlaveAddress, SMPLRT_DIV, 0x07);		//设置陀螺仪采样率iic_write(SlaveAddress, CONFIG, 0x06);			//设置数字低通滤波器iic_write(SlaveAddress, GYRO_CONFIG, 0x18);		//设置陀螺仪量程+-2000度/siic_write(SlaveAddress, ACCEL_CONFIG, 0x0);		//设置加速度量程+-2g
}/*********************************************************************** 函数功能:主函数**********************************************************************/int main(void)
{unsigned char zvalue_h,zvalue_l;						//存储读取结果short int zvalue;/*设置GPB_2引脚和GPB_3引脚功能为I2C传输引脚*/GPB.CON = (GPB.CON & ~(0xF<<12)) | 0x3<<12;			 	//设置GPB_3引脚功能为I2C_5_SCLGPB.CON = (GPB.CON & ~(0xF<<8))  | 0x3<<8;				//设置GPB_2引脚功能为I2C_5_SDAuart_init(); 											//初始化串口MPU6050_Init();											//初始化MPU6050printf("\n********** I2C test!! ***********\n");while(1){zvalue_h = iic_read(SlaveAddress, GYRO_ZOUT_H);		//获取MPU6050-Z轴角速度高字节zvalue_l = iic_read(SlaveAddress, GYRO_ZOUT_L);		//获取MPU6050-Z轴角速度低字节zvalue  =  (zvalue_h<<8)|zvalue_l;					//获取MPU6050-Z轴角速度printf(" GYRO--Z  :Hex: %d	\n", zvalue);			//打印MPU6050-Z轴角速度mydelay_ms(100);}return 0;
}

 

由于没有校准也没设置滤波,所以静止情况下不是0,正常应该是0的,然后逆时针是正数,顺时针是负数。

二、作业

1.综合项目:
实时监测开发板的放置状态,当监测到开发板水平放置时,每隔一分钟向终端上打印一次当前的时间以及开发板的状态
如:“2023-04-05 23:45:00 Status: Normal”
当监测到开发板发生倾斜时,每隔一秒钟向终端上打印一次当前的时间以及开发板的状态
如:“2023-04-05 23:45:00 Status: Warning”
同时让蜂鸣器产生“滴滴”的警报声,在警报状态下,若按下Key2按键,解除蜂鸣器的警报声
提示:
开发板水平静止放置时MPU6050的Z轴上的加速度应该等于重力加速度的值(9.8m/s2),而其X轴和Y轴上的加速度应该等于0
当开发板发生倾斜时MPU6050的Z轴上的加速度的分量会减小,而其X轴和Y轴上的加速度分量会增大
我们可以以此来判断开发板是否发生倾斜

 
#include "exynos_4412.h"/****************MPU6050内部寄存器地址****************/#define	SMPLRT_DIV		0x19	//陀螺仪采样率,典型值:0x07(125Hz)
#define	CONFIG			0x1A	//低通滤波频率,典型值:0x06(5Hz)
#define	GYRO_CONFIG		0x1B	//陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
#define	ACCEL_CONFIG	0x1C	//加速计自检、测量范围及高通滤波频率,典型值:0x18(不自检,2G,5Hz)
#define	ACCEL_XOUT_H	0x3B
#define	ACCEL_XOUT_L	0x3C
#define	ACCEL_YOUT_H	0x3D
#define	ACCEL_YOUT_L	0x3E
#define	ACCEL_ZOUT_H	0x3F
#define	ACCEL_ZOUT_L	0x40
#define	TEMP_OUT_H		0x41
#define	TEMP_OUT_L		0x42
#define	GYRO_XOUT_H		0x43
#define	GYRO_XOUT_L		0x44
#define	GYRO_YOUT_H		0x45
#define	GYRO_YOUT_L		0x46
#define	GYRO_ZOUT_H		0x47
#define	GYRO_ZOUT_L		0x48
#define	PWR_MGMT_1		0x6B	//电源管理,典型值:0x00(正常启用)
#define	WHO_AM_I		0x75	//IIC地址寄存器(默认数值0x68,只读)
#define	SlaveAddress	0x68	//MPU6050-I2C地址/************************延时函数************************/void mydelay_ms(int time)
{int i,j;while(time--){for(i=0;i<5;i++)for(j=0;j<514;j++);}
}/*********************************************************************** 函数功能:I2C向特定地址写一个字节* 输入参数:* 		slave_addr: I2C从机地址* 			  addr: 芯片内部特定地址* 			  data:写入的数据
**********************************************************************/void iic_write (unsigned char slave_addr, unsigned char addr, unsigned char data)
{/*对时钟源进行512倍预分频  打开IIC中断(每次完成一个字节的收发后中断标志位会自动置位)*/I2C5.I2CCON = I2C5.I2CCON | (1<<6) | (1<<5);/*设置IIC模式为主机发送模式  使能IIC发送和接收*/I2C5.I2CSTAT = 0xd0;/*将第一个字节的数据写入发送寄存器  即从机地址和读写位(MPU6050-I2C地址+写位0)*/I2C5.I2CDS = slave_addr<<1;/*设置IIC模式为主机发送模式  发送起始信号启用总线  使能IIC发送和接收*/I2C5.I2CSTAT = 0xf0;/*等待从机接受完一个字节后产生应答信号(应答后中断挂起位自动置位)*/while(!(I2C5.I2CCON & (1<<4)));/*将要发送的第二个字节数据(即MPU6050内部寄存器的地址)写入发送寄存器*/I2C5.I2CDS = addr;/*清除中断挂起标志位  开始下一个字节的发送*/I2C5.I2CCON = I2C5.I2CCON & (~(1<<4));/*等待从机接受完一个字节后产生应答信号(应答后中断挂起位自动置位)*/while(!(I2C5.I2CCON & (1<<4)));/*将要发送的第三个字节数据(即要写入到MPU6050内部指定的寄存器中的数据)写入发送寄存器*/I2C5.I2CDS = data;/*清除中断挂起标志位  开始下一个字节的发送*/I2C5.I2CCON = I2C5.I2CCON & (~(1<<4));/*等待从机接受完一个字节后产生应答信号(应答后中断挂起位自动置位)*/while(!(I2C5.I2CCON & (1<<4)));/*发送停止信号  结束本次通信*/I2C5.I2CSTAT = 0xD0;/*清除中断挂起标志位*/I2C5.I2CCON = I2C5.I2CCON & (~(1<<4));/*延时*/mydelay_ms(10);
}/*********************************************************************** 函数功能:I2C从特定地址读取1个字节的数据* 输入参数:         slave_addr: I2C从机地址* 			       addr: 芯片内部特定地址* 返回参数: unsigned char: 读取的数值
**********************************************************************/unsigned char iic_read(unsigned char slave_addr, unsigned char addr)
{unsigned char data = 0;/*对时钟源进行512倍预分频  打开IIC中断(每次完成一个字节的收发后中断标志位会自动置位)*/I2C5.I2CCON = I2C5.I2CCON | (1<<6) | (1<<5);/*设置IIC模式为主机发送模式  使能IIC发送和接收*/I2C5.I2CSTAT = 0xd0;/*将第一个字节的数据写入发送寄存器  即从机地址和读写位(MPU6050-I2C地址+写位0)*/I2C5.I2CDS = slave_addr<<1;/*设置IIC模式为主机发送模式  发送起始信号启用总线  使能IIC发送和接收*/I2C5.I2CSTAT = 0xf0;/*等待从机接受完一个字节后产生应答信号(应答后中断挂起位自动置位)*/while(!(I2C5.I2CCON & (1<<4)));/*将要发送的第二个字节数据(即要读取的MPU6050内部寄存器的地址)写入发送寄存器*/I2C5.I2CDS = addr;/*清除中断挂起标志位  开始下一个字节的发送*/I2C5.I2CCON = I2C5.I2CCON & (~(1<<4));/*等待从机接受完一个字节后产生应答信号(应答后中断挂起位自动置位)*/while(!(I2C5.I2CCON & (1<<4)));/*清除中断挂起标志位  重新开始一次通信  改变数据传送方向*/I2C5.I2CCON = I2C5.I2CCON & (~(1<<4));/*将第一个字节的数据写入发送寄存器  即从机地址和读写位(MPU6050-I2C地址+读位1)*/I2C5.I2CDS = slave_addr << 1 | 0x01;/*设置IIC为主机接收模式  发送起始信号  使能IIC收发*/I2C5.I2CSTAT = 0xb0;/*等待从机接收到数据后应答*/while(!(I2C5.I2CCON & (1<<4)));/*禁止主机应答信号(即开启非应答  因为只接收一个字节)  清除中断标志位*/I2C5.I2CCON = I2C5.I2CCON & (~(1<<7))&(~(1<<4));/*等待接收从机发来的数据*/while(!(I2C5.I2CCON & (1<<4)));/*将从机发来的数据读取*/data = I2C5.I2CDS;/*直接发起停止信号结束本次通信*/I2C5.I2CSTAT = 0x90;/*清除中断挂起标志位*/I2C5.I2CCON = I2C5.I2CCON & (~(1<<4));/*延时等待停止信号稳定*/mydelay_ms(10);return data;}/*********************************************************************** 函数功能:MPU6050初始化
**********************************************************************/void MPU6050_Init ()
{iic_write(SlaveAddress, PWR_MGMT_1, 0x00); 		//设置使用内部时钟8Miic_write(SlaveAddress, SMPLRT_DIV, 0x07);		//设置陀螺仪采样率iic_write(SlaveAddress, CONFIG, 0x06);			//设置数字低通滤波器iic_write(SlaveAddress, GYRO_CONFIG, 0x18);		//设置陀螺仪量程+-2000度/siic_write(SlaveAddress, ACCEL_CONFIG, 0x0);		//设置加速度量程+-2g
}/*********************************************************************** 函数功能:RTC初始化
**********************************************************************/void RTC_Init()
{//使能RTC控制RTCCON = RTCCON | 1;//校准时间RTC.BCDYEAR = 0x023; //000000100011  2023RTC.BCDMON  = 0x1;   //1RTC.BCDDAY  = 0x8;   //8RTC.BCDWEEK = 0x7;   //星期RTC.BCDHOUR = 0x11;  //11RTC.BCDMIN  = 0x32;  //32RTC.BCDSEC  = 0x50;  //50s//关闭RTC控制RTCCON = RTCCON & 0;}/*********************************************************************** 函数功能:BEEP初始化
**********************************************************************/void BEEP_Init()
{//GPD0_0设置PWM0输出功能GPD0.CON = GPD0.CON & (~(0xF)) | (0x2);//PWM0一级分频  100倍PWM.TCFG0 = PWM.TCFG0 & (~(0xFF)) | (99);//PWM0二级分频  1倍  PCLk/(99+1)/(0+1) = 1MHzPWM.TCFG1 = PWM.TCFG1 & (~(0xF));//设置PWM0自动重装 PWM.TCON = PWM.TCON | (1<<3);//设置周期 1000PWM.TCNTB0 = 1000;//占空比 60%PWM.TCMPB0 = 600;//手动装载PWM.TCON = PWM.TCON | (1 << 1);//关闭手动装载PWM.TCON = PWM.TCON & (~(1 << 1));//使能PWM0PWM.TCON = PWM.TCON | 1;
}/*********************************************************************** 函数功能:主函数**********************************************************************/int main(void)
{//存储读取结果unsigned char zvalue_h,zvalue_l,xvalue_h,xvalue_l,yvalue_h,yvalue_l;						short int zvalue,xvalue,yvalue;/*设置GPB_2引脚和GPB_3引脚功能为I2C传输引脚*/GPB.CON = (GPB.CON & ~(0xF<<12)) | 0x3<<12;			 		//设置GPB_3引脚功能为I2C_5_SCLGPB.CON = (GPB.CON & ~(0xF<<8))  | 0x3<<8;					//设置GPB_2引脚功能为I2C_5_SDAuart_init(); 												//初始化串口MPU6050_Init();												//初始化MPU6050RTC_Init();													//RTC初始化BEEP_Init();												//BEEP初始化printf("\n********** I2C test!! ***********\n");PWM.TCON = PWM.TCON & (~(1));								//关闭BEEPwhile(1){zvalue_h = iic_read(SlaveAddress, ACCEL_ZOUT_H);		//获取MPU6050-Z轴加速度高字节zvalue_l = iic_read(SlaveAddress, ACCEL_ZOUT_L);		//获取MPU6050-Z轴加速度低字节zvalue  =  (zvalue_h<<8)|zvalue_l;						//获取MPU6050-Z轴加速度xvalue_h = iic_read(SlaveAddress, ACCEL_XOUT_H);		//获取MPU6050-Z轴加速度高字节xvalue_l = iic_read(SlaveAddress, ACCEL_XOUT_L);		//获取MPU6050-Z轴加速度低字节xvalue  =  (xvalue_h<<8)|xvalue_l;						//获取MPU6050-Z轴加速度yvalue_h = iic_read(SlaveAddress, ACCEL_YOUT_H);		//获取MPU6050-Z轴加速度高字节yvalue_l = iic_read(SlaveAddress, ACCEL_YOUT_L);		//获取MPU6050-Z轴加速度低字节yvalue  =  (yvalue_h<<8)|yvalue_l;						//获取MPU6050-Z轴加速度#if 1		if(zvalue < 19000 & ((xvalue > 1200) | (yvalue > 1200) | (xvalue < 500) | (yvalue < 100))){printf("20%x-%x-%x %x %x:%x:%x  Status: Warning\n",RTC.BCDYEAR,RTC.BCDMON,RTC.BCDDAY,RTC.BCDWEEK,RTC.BCDHOUR,RTC.BCDMIN,RTC.BCDSEC);PWM.TCON = PWM.TCON | 1;mydelay_ms(500);PWM.TCON = PWM.TCON & (~(1));mydelay_ms(490);}else{printf("20%x-%x-%x %x %x:%x:%x  Status: Normal\n",RTC.BCDYEAR,RTC.BCDMON,RTC.BCDDAY,RTC.BCDWEEK,RTC.BCDHOUR,RTC.BCDMIN,RTC.BCDSEC);PWM.TCON = PWM.TCON & (~(1));mydelay_ms(100);}
#endif//printf("X: %d  Y: %d  Z: %d\n", xvalue, yvalue ,zvalue);//打印MPU6050-x,y,Z轴加速度//mydelay_ms(100);}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAP UI5 walkthrough step9 Component Configuration

在之前的章节中&#xff0c;我们已经介绍完了MVC的架构和实现&#xff0c;现在我们来讲一下&#xff0c;SAPUI5的结构 这一步&#xff0c;我们将所有的UI资产从index.html里面独立封装在一个组件里面 这样组件就变得独立&#xff0c;可复用了。这样&#xff0c;无所什么时候我…

基于SpringBoot+Vue学生成绩管理系统前后端分离(源码+数据库)

一、项目简介 本项目是一套基于SpringBootVue学生成绩管理系统&#xff0c;主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目可以直接作为bishe使用。 项目都经过严格调试&#xff0c;确…

为“异常”努力是值得的

异常是OO语言处理错误的方式,在C中&#xff0c;鼓励使用异常。侯捷再书中谈起异常&#xff0c;“十年前撰写“未将异常考虑在内的”函数是为一种美好实践&#xff0c;而今我们致力于写出“异常安全码”。”可见异常安全的重要。 说起异常安全&#xff0c;首先就要是异常的出现…

自定义GPTs的Actions 调用外部API测试 返回API的结果:成功

我的自定义GPT&#xff1a;https://chat.openai.com/g/g-sOqIFZgIy-superbrain 效果&#xff1a;chatGPT调用我的天气接口返回天气。 可以看见把json结果变成md格式(人方便阅读)了。与物理世界连接成功&#xff0c;太强大了。 我建的测试示例&#xff1a;https://3.wjsou.…

王炸升级!PartyRock 10分钟构建 AI 应用

前言 一年一度的亚马逊云科技的 re:Invent 可谓是全球云计算、科技圈的狂欢&#xff0c;每次都能带来一些最前沿的方向标&#xff0c;这次也不例外。在看完一些 keynote 和介绍之后&#xff0c;我也去亲自体验了一些最近发布的内容。其中让我感受最深刻的无疑是 PartyRock 了。…

物联网+AI智慧工地云平台源码(SaaS模式)

智慧工地云平台充分运用数字化技术&#xff0c;聚焦施工现场岗位一线&#xff0c;依托物联网、互联网、AI等技术&#xff0c;围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三大体系为基础应用&#xff0c;实现全面高效的工程管…

spring IOC介绍

spring的Ioc真是个好东西啊&#xff0c;那它到底是什么东西呢&#xff0c;控制反转&#xff0c;到底是怎么转的呢&#xff1f; 假设啊你现在是一个导演&#xff0c;想排部戏&#xff0c;那是不是得需要演员和舞台(spring中的bean)&#xff0c;如果按平常的编程思维就是new 一个…

蓝牙物联网对接技术难点有哪些?

#物联网# 蓝牙物联网对接技术难点主要包括以下几个方面&#xff1a; 1、设备兼容性&#xff1a;蓝牙技术有多种版本和规格&#xff0c;如蓝牙4.0、蓝牙5.0等&#xff0c;不同版本之间的兼容性可能存在问题。同时&#xff0c;不同厂商生产的蓝牙设备也可能存在兼容性问题。 2、…

枚举类的final修饰

今天开发跟我反馈了一个很奇怪的问题&#xff0c;说有个对象的状态属性是枚举类&#xff0c;设置了该对象的状态后&#xff0c;插入数据库&#xff0c;这个状态没了&#xff0c;凭空消失了&#xff0c;变成了空白字符串。这让人感觉非常奇怪&#xff0c;整个问题排查后得到的结…

低代码平台选型标准:功能、应用与优劣势分析

在数字化转型的浪潮下&#xff0c;中小企业面临满足市场需求、提高效率和竞争力的挑战。低代码平台做为数字化转型的重要工具&#xff0c;为中小企业带来了快速开发和定制应用程序解决方案。但是&#xff0c;在很多低代码平台中&#xff0c;选择是一个重要的环节。企业应该根据…

docker---资源控制

docker的资源控制 对容器使用宿主机的资源进行限制。 三种控制方向&#xff1a;CPU 内存 磁盘I/O docker使用linux自带的功能cgroup&#xff1b;control groups是linux内核系统提供的一种可以限制记录&#xff0c;隔离进程所使用的物理资源机制。 docker借助此…

自定义TypeHandler 将mysql返回的逗号分隔的String转换到List

sql执行如下&#xff1a; 这里我定义的接受类&#xff1a; 但是这里报了错JSON parse error: Cannot deserialize value of type java.util.ArrayList<java.lang.String>from Object value (token JsonToken.START_OBJECT); nested exception is com.fasterxml.jackson…