STM32F407硬件I2C实现MPU6050通讯(CUBEIDE)
STM32F407硬件I2C实现MPU6050通讯
文章目录
- STM32F407硬件I2C实现MPU6050通讯
- cubeide设置
- 写操作与读操作函数实现
- 复位,读取温度,角度等函数封装
- mpu6050.c
- mpu6050.h
- 代码分析
- DMP移植
- 1.修改头文件路径为自己的头文件路径
- 2.修改I2C读写函数为自己mcu平台的读写函数
- 3.修改延时函数为自己平台的延时函数
- 4.修改MPU6050的地址
- 使用举例
工程代码
https://download.csdn.net/download/weixin_52849254/87886714
cubeide设置
I2C1通道可选择三种不同的通讯协议:I2C、SMBus-Alert-mode、SMBus-two-wire-Interface。
SMBus (System Management Bus,系统管理总线), 为系统和电源管理这样的任务提供了一条控制总线,SMBus与I2C总线之间在时序特性上存在一些差别
修改速度为50000
写操作与读操作函数实现
/*** @brief Manages error callback by re-initializing I2C.* @param Addr: I2C Address* @retval None*/
static void I2Cx_Error(uint8_t Addr)
{/* 恢复I2C寄存器为默认值 */HAL_I2C_DeInit(&hi2c1);/* 重新初始化I2C外设 */MX_I2C1_Init();
}
/*** @brief 写寄存器,这是提供给上层的接口* @param slave_addr: 从机地址* @param reg_addr:寄存器地址* @param len:写入的长度* @param data_ptr:指向要写入的数据* @retval 正常为0,不正常为非0*/
int Sensors_I2C_WriteRegister(uint8_t slave_addr,uint8_t reg_addr,uint8_t len,uint8_t *data_ptr)
{HAL_StatusTypeDef status = HAL_OK;status = HAL_I2C_Mem_Write(&hi2c1, slave_addr, reg_addr, I2C_MEMADD_SIZE_8BIT,data_ptr, len,I2Cx_FLAG_TIMEOUT);/* 检查通讯状态 */if(status != HAL_OK){/* 总线出错处理 */I2Cx_Error(slave_addr);}while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY){}/* 检查SENSOR是否就绪进行下一次读写操作 */while (HAL_I2C_IsDeviceReady(&hi2c1, slave_addr, I2Cx_FLAG_TIMEOUT, I2Cx_FLAG_TIMEOUT) == HAL_TIMEOUT);/* 等待传输结束 */while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY){}return status;
}/*** @brief 读寄存器,这是提供给上层的接口* @param slave_addr: 从机地址* @param reg_addr:寄存器地址* @param len:要读取的长度* @param data_ptr:指向要存储数据的指针* @retval 正常为0,不正常为非0*/
int Sensors_I2C_ReadRegister(uint8_t slave_addr,uint8_t reg_addr,uint8_t len,uint8_t *data_ptr)
{HAL_StatusTypeDef status = HAL_OK;status =HAL_I2C_Mem_Read(&hi2c1,slave_addr,reg_addr,I2C_MEMADD_SIZE_8BIT,data_ptr,len,I2Cx_FLAG_TIMEOUT);/* 检查通讯状态 */if(status != HAL_OK){/* 总线出错处理 */I2Cx_Error(slave_addr);}while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY){}/* 检查SENSOR是否就绪进行下一次读写操作 */while (HAL_I2C_IsDeviceReady(&hi2c1, slave_addr, I2Cx_FLAG_TIMEOUT, I2Cx_FLAG_TIMEOUT) == HAL_TIMEOUT);/* 等待传输结束 */while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY){}return status;
}
这段代码是关于使用I2C进行寄存器读写的函数实现。
首先,代码中定义了一个静态函数I2Cx_Error,用于处理I2C出错的情况。在函数中,首先通过调用HAL_I2C_DeInit函数将I2C寄存器恢复为默认值,然后调用MX_I2C1_Init函数重新初始化I2C外设。
接下来,代码包含了两个函数Sensors_I2C_WriteRegister和Sensors_I2C_ReadRegister,分别用于写寄存器和读寄存器操作。
Sensors_I2C_WriteRegister函数用于向从设备写入数据。它接受从设备地址(slave_addr)、寄存器地址(reg_addr)、要写入的数据长度(len)和指向要写入数据的指针(data_ptr)作为参数。在函数中,通过调用HAL_I2C_Mem_Write函数进行I2C的内存写操作。如果通信状态不正常,即status不等于HAL_OK,则调用I2Cx_Error函数进行错误处理。然后,通过循环等待I2C传输完成,并检查SENSOR是否就绪进行下一次读写操作。
Sensors_I2C_ReadRegister函数用于从从设备读取数据。它接受从设备地址(slave_addr)、寄存器地址(reg_addr)、要读取的数据长度(len)和指向存储数据的指针(data_ptr)作为参数。在函数中,通过调用HAL_I2C_Mem_Read函数进行I2C的内存读操作。如果通信状态不正常,即status不等于HAL_OK,则调用I2Cx_Error函数进行错误处理。然后,通过循环等待I2C传输完成,并检查SENSOR是否就绪进行下一次读写操作。
最后,函数返回status表示操作的状态。
综上所述,这段代码实现了使用I2C进行寄存器读写的功能,并在通信出错时进行了错误处理。
复位,读取温度,角度等函数封装
mpu6050.c
#include "mpu6050.h"
#include "usart.h"
#include "i2c.h"
#include "main.h"#define MPU_ERROR I2C_ERROR
#define MPU_INFO I2C_INFO/*** @brief 写数据到MPU6050寄存器* @param reg_add:寄存器地址* @param reg_data:要写入的数据* @retval */
void MPU6050_WriteReg(uint8_t reg_add,uint8_t reg_dat)
{Sensors_I2C_WriteRegister(MPU6050_ADDRESS,reg_add,1,®_dat);
}/*** @brief 从MPU6050寄存器读取数据* @param reg_add:寄存器地址* @param Read:存储数据的缓冲区* @param num:要读取的数据量* @retval */
void MPU6050_ReadData(uint8_t reg_add,unsigned char* Read,uint8_t num)
{Sensors_I2C_ReadRegister(MPU6050_ADDRESS,reg_add,num,Read);
}/*** @brief 往MPU6050的指定寄存器写入一字节数据* @param addr: MPU6050的IIC通讯地址* reg : MPU6050寄存器地址* dat : 写入的数据* @retval MPU6050_EOK : 函数执行成功* MPU6050_EACK: IIC通讯ACK错误,函数执行失败*/
uint8_t mpu6050_write_byte(uint8_t addr, uint8_t reg, uint8_t dat)
{return Sensors_I2C_WriteRegister(addr, reg, 1, &dat);
}
/*** @brief 读取MPU6050指定寄存器的值* @param addr: MPU6050的IIC通讯地址* reg : MPU6050寄存器地址* dat: 读取到的寄存器的值* @retval MPU6050_EOK : 函数执行成功* MPU6050_EACK: IIC通讯ACK错误,函数执行失败*/
uint8_t mpu6050_read_byte(uint8_t addr, uint8_t reg, uint8_t *dat)
{return Sensors_I2C_ReadRegister(addr, reg, 1, dat);
}/*** @brief 初始化MPU6050芯片* @param * @retval */
void MPU6050_Init(void)
{//在初始化之前要延时一段时间,若没有延时,则断电后再上电数据可能会出错Delay(100);MPU6050_WriteReg(MPU6050_RA_PWR_MGMT_1, 0x00); //解除休眠状态MPU6050_WriteReg(MPU6050_RA_SMPLRT_DIV , 0x07); //陀螺仪采样率MPU6050_WriteReg(MPU6050_RA_CONFIG , 0x06); MPU6050_WriteReg(MPU6050_RA_ACCEL_CONFIG , 0x01); //配置加速度传感器工作在4G模式MPU6050_WriteReg(MPU6050_RA_GYRO_CONFIG, 0x18); //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)Delay(200);
}/*** @brief 读取MPU6050的ID* @param * @retval 正常返回1,异常返回0*/
uint8_t MPU6050ReadID(void)
{unsigned char Re = 0;MPU6050_ReadData(MPU6050_RA_WHO_AM_I,&Re,1); //读器件地址printf("Re = %x\r\n",Re);if(Re != 0x68){MPU_ERROR("MPU6050 dectected error!\r\n检测不到MPU6050模块,请检查模块与开发板的接线");return 0;}else{MPU_INFO("MPU6050 ID = %d\r\n",Re);return 1;}}/*** @brief 读取MPU6050的加速度数据* @param * @retval */
void MPU6050ReadAcc(short *accData)
{uint8_t buf[6];MPU6050_ReadData(MPU6050_ACC_OUT, buf, 6);accData[0] = (buf[0] << 8) | buf[1];accData[1] = (buf[2] << 8) | buf[3];accData[2] = (buf[4] << 8) | buf[5];
}/*** @brief 读取MPU6050的角加速度数据* @param * @retval */
void MPU6050ReadGyro(short *gyroData)
{uint8_t buf[6];MPU6050_ReadData(MPU6050_GYRO_OUT,buf,6);gyroData[0] = (buf[0] << 8) | buf[1];gyroData[1] = (buf[2] << 8) | buf[3];gyroData[2] = (buf[4] << 8) | buf[5];
}/*** @brief 读取MPU6050的原始温度数据* @param * @retval */
void MPU6050ReadTemp(short *tempData)
{uint8_t buf[2];MPU6050_ReadData(MPU6050_RA_GYRO_XOUT_H,buf,2); //读取温度值*tempData = (buf[0] << 8) | buf[1];
}/*** @brief 读取MPU6050的温度数据,转化成摄氏度* @param * @retval */
void MPU6050_ReturnTemp(float *Temperature)
{short temp3;uint8_t buf[2];MPU6050_ReadData(MPU6050_RA_GYRO_XOUT_H,buf,2); //读取温度值temp3= (buf[0] << 8) | buf[1]; *Temperature=((double) temp3/340.0)+36.53;}/*** @brief MPU6050软件复位* @param 无* @retval 无*/
void mpu6050_sw_reset(void)
{mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_PWR_MGMT_1, 0x80);HAL_Delay(100);mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_PWR_MGMT_1, 0x00);
}/*** @brief MPU6050设置陀螺仪传感器量程范围* @param frs: 0 --> ±250dps* 1 --> ±500dps* 2 --> ±1000dps* 3 --> ±2000dps* @retval MPU6050_EOK : 函数执行成功* MPU6050_EACK: IIC通讯ACK错误,函数执行失败*/
uint8_t mpu6050_set_gyro_fsr(uint8_t fsr)
{return mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_GYRO_CONFIG, fsr << 3);
}/*** @brief MPU6050设置加速度传感器量程范围* @param frs: 0 --> ±2g* 1 --> ±4g* 2 --> ±8g* 3 --> ±16g* @retval MPU6050_EOK : 函数执行成功* MPU6050_EACK: IIC通讯ACK错误,函数执行失败*/
uint8_t mpu6050_set_accel_fsr(uint8_t fsr)
{return mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_ACCEL_CONFIG, fsr << 3);
}/*** @brief MPU6050设置数字低通滤波器频率* @param lpf: 数字低通滤波器的频率(Hz)* @retval MPU6050_EOK : 函数执行成功* MPU6050_EACK: IIC通讯ACK错误,函数执行失败*/
uint8_t mpu6050_set_lpf(uint16_t lpf)
{uint8_t dat;if (lpf >= 188){dat = 1;}else if (lpf >= 98){dat = 2;}else if (lpf >= 42){dat = 3;}else if (lpf >= 20){dat = 4;}else if (lpf >= 10){dat = 5;}else{dat = 6;}return mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_CONFIG, dat);
}/*** @brief MPU6050设置采样率* @param rate: 采样率(4~1000Hz)* @retval MPU6050_EOK : 函数执行成功* MPU6050_EACK: IIC通讯ACK错误,函数执行失败*/
uint8_t mpu6050_set_rate(uint16_t rate)
{uint8_t ret;uint8_t dat;if (rate > 1000){rate = 1000;}if (rate < 4){rate = 4;}dat = 1000 / rate - 1;ret = mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_SMPLRT_DIV, dat);if (ret != MPU6050_EOK){return ret;}ret = mpu6050_set_lpf(rate >> 1);if (ret != MPU6050_EOK){return ret;}return MPU6050_EOK;
}/*** @brief MPU6050获取温度值* @param temperature: 获取到的温度值(扩大了100倍)* @retval MPU6050_EOK : 函数执行成功* MPU6050_EACK: IIC通讯ACK错误,函数执行失败*/
uint8_t mpu6050_get_temperature(int16_t *temp)
{uint8_t dat[2];uint8_t ret;int16_t raw = 0;ret = Sensors_I2C_ReadRegister(MPU6050_ADDRESS, MPU6050_RA_TEMP_OUT_H, 2, dat);if (ret == MPU6050_EOK){raw = ((uint16_t)dat[0] << 8) | dat[1];*temp = (int16_t)((36.53f + ((float)raw / 340)) * 100);}return ret;
}/*** @brief MPU6050获取陀螺仪值* @param gx,gy,gz: 陀螺仪x、y、z轴的原始度数(带符号)* @retval MPU6050_EOK : 函数执行成功* MPU6050_EACK: IIC通讯ACK错误,函数执行失败*/
uint8_t mpu6050_get_gyroscope(int16_t *gx, int16_t *gy, int16_t *gz)
{uint8_t dat[6];uint8_t ret;ret = Sensors_I2C_ReadRegister(MPU6050_ADDRESS, MPU6050_RA_GYRO_XOUT_H, 6, dat);if (ret == MPU6050_EOK){*gx = ((uint16_t)dat[0] << 8) | dat[1];*gy = ((uint16_t)dat[2] << 8) | dat[3];*gz = ((uint16_t)dat[4] << 8) | dat[5];}return ret;
}/*** @brief MPU6050获取加速度值* @param ax,ay,az: 加速度x、y、z轴的原始度数(带符号)* @retval MPU6050_EOK : 函数执行成功* MPU6050_EACK: IIC通讯ACK错误,函数执行失败*/
uint8_t mpu6050_get_accelerometer(int16_t *ax, int16_t *ay, int16_t *az)
{uint8_t dat[6];uint8_t ret;ret = Sensors_I2C_ReadRegister(MPU6050_ADDRESS, MPU6050_RA_ACCEL_XOUT_H, 6, dat);if (ret == MPU6050_EOK){*ax = ((uint16_t)dat[0] << 8) | dat[1];*ay = ((uint16_t)dat[2] << 8) | dat[3];*az = ((uint16_t)dat[4] << 8) | dat[5];}return ret;
}/*** @brief MPU6050初始化* @param 无* @retval MPU6050_EOK: 函数执行成功* MPU6050_EID: 获取ID错误,函数执行失败*/
uint8_t mpu6050_init(void)
{uint8_t id;// mpu6050_hw_init(); /* MPU6050硬件初始化 */
// mpu6050_iic_init(); /* 初始化IIC接口 */mpu6050_sw_reset(); /* MPU6050软件复位 */mpu6050_set_gyro_fsr(3); /* 陀螺仪传感器,±2000dps */mpu6050_set_accel_fsr(0); /* 加速度传感器,±2g */mpu6050_set_rate(50); /* 采样率,50Hz */mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_INT_ENABLE, 0X00); /* 关闭所有中断 */mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_USER_CTRL, 0X00); /* 关闭IIC主模式 */mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_FIFO_EN, 0X00); /* 关闭FIFO */mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_INT_PIN_CFG, 0X80); /* INT引脚低电平有效 */mpu6050_read_byte(MPU6050_ADDRESS, MPU6050_WHO_AM_I, &id); /* 读取设备ID */printf("id = %d\r\n",id);if (id != 0x68){return MPU6050_EID;}mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_PWR_MGMT_1, 0x01); /* 设置CLKSEL,PLL X轴为参考 */mpu6050_write_byte(MPU6050_ADDRESS, MPU6050_RA_PWR_MGMT_2, 0x00); /* 加速度与陀螺仪都工作 */mpu6050_set_rate(50); /* 采样率,50Hz */return MPU6050_EOK;
}
mpu6050.h
#ifndef __MPU6050_H
#define __MPU6050_H
#include "main.h"// MPU6050, Standard address 0x68
#define MPU6050_ADDRESS 0xD0
//
#define MPU6050_WHO_AM_I 0x75
#define MPU6050_SMPLRT_DIV 0 //8000Hz
#define MPU6050_DLPF_CFG 0
#define MPU6050_GYRO_OUT 0x43 //MPU6050陀螺仪数据寄存器地址
#define MPU6050_ACC_OUT 0x3B //MPU6050加速度数据寄存器地址#define MPU6050_RA_XG_OFFS_TC 0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU6050_RA_YG_OFFS_TC 0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU6050_RA_ZG_OFFS_TC 0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
#define MPU6050_RA_X_FINE_GAIN 0x03 //[7:0] X_FINE_GAIN
#define MPU6050_RA_Y_FINE_GAIN 0x04 //[7:0] Y_FINE_GAIN
#define MPU6050_RA_Z_FINE_GAIN 0x05 //[7:0] Z_FINE_GAIN
#define MPU6050_RA_XA_OFFS_H 0x06 //[15:0] XA_OFFS
#define MPU6050_RA_XA_OFFS_L_TC 0x07
#define MPU6050_RA_YA_OFFS_H 0x08 //[15:0] YA_OFFS
#define MPU6050_RA_YA_OFFS_L_TC 0x09
#define MPU6050_RA_ZA_OFFS_H 0x0A //[15:0] ZA_OFFS
#define MPU6050_RA_ZA_OFFS_L_TC 0x0B
#define MPU6050_RA_XG_OFFS_USRH 0x13 //[15:0] XG_OFFS_USR
#define MPU6050_RA_XG_OFFS_USRL 0x14
#define MPU6050_RA_YG_OFFS_USRH 0x15 //[15:0] YG_OFFS_USR
#define MPU6050_RA_YG_OFFS_USRL 0x16
#define MPU6050_RA_ZG_OFFS_USRH 0x17 //[15:0] ZG_OFFS_USR
#define MPU6050_RA_ZG_OFFS_USRL 0x18
#define MPU6050_RA_SMPLRT_DIV 0x19 // 采样频率分频器
#define MPU6050_RA_CONFIG 0x1A // 配置寄存器
#define MPU6050_RA_GYRO_CONFIG 0x1B // 陀螺仪配置寄存器
#define MPU6050_RA_ACCEL_CONFIG 0x1C // 加速度计配置寄存器
#define MPU6050_RA_FF_THR 0x1D
#define MPU6050_RA_FF_DUR 0x1E
#define MPU6050_RA_MOT_THR 0x1F // 运动检测阀值设置寄存器
#define MPU6050_RA_MOT_DUR 0x20
#define MPU6050_RA_ZRMOT_THR 0x21
#define MPU6050_RA_ZRMOT_DUR 0x22
#define MPU6050_RA_FIFO_EN 0x23 // FIFO使能寄存器
#define MPU6050_RA_I2C_MST_CTRL 0x24
#define MPU6050_RA_I2C_SLV0_ADDR 0x25
#define MPU6050_RA_I2C_SLV0_REG 0x26
#define MPU6050_RA_I2C_SLV0_CTRL 0x27
#define MPU6050_RA_I2C_SLV1_ADDR 0x28
#define MPU6050_RA_I2C_SLV1_REG 0x29
#define MPU6050_RA_I2C_SLV1_CTRL 0x2A
#define MPU6050_RA_I2C_SLV2_ADDR 0x2B
#define MPU6050_RA_I2C_SLV2_REG 0x2C
#define MPU6050_RA_I2C_SLV2_CTRL 0x2D
#define MPU6050_RA_I2C_SLV3_ADDR 0x2E
#define MPU6050_RA_I2C_SLV3_REG 0x2F
#define MPU6050_RA_I2C_SLV3_CTRL 0x30
#define MPU6050_RA_I2C_SLV4_ADDR 0x31
#define MPU6050_RA_I2C_SLV4_REG 0x32
#define MPU6050_RA_I2C_SLV4_DO 0x33
#define MPU6050_RA_I2C_SLV4_CTRL 0x34
#define MPU6050_RA_I2C_SLV4_DI 0x35
#define MPU6050_RA_I2C_MST_STATUS 0x36
#define MPU6050_RA_INT_PIN_CFG 0x37 // 中断/旁路设置寄存器
#define MPU6050_RA_INT_ENABLE 0x38 // 中断使能寄存器
#define MPU6050_RA_DMP_INT_STATUS 0x39
#define MPU6050_RA_INT_STATUS 0x3A
#define MPU6050_RA_ACCEL_XOUT_H 0x3B // 加速度值,X轴高8位寄存器
#define MPU6050_RA_ACCEL_XOUT_L 0x3C
#define MPU6050_RA_ACCEL_YOUT_H 0x3D
#define MPU6050_RA_ACCEL_YOUT_L 0x3E
#define MPU6050_RA_ACCEL_ZOUT_H 0x3F
#define MPU6050_RA_ACCEL_ZOUT_L 0x40
#define MPU6050_RA_TEMP_OUT_H 0x41 // 温度值高八位寄存器
#define MPU6050_RA_TEMP_OUT_L 0x42
#define MPU6050_RA_GYRO_XOUT_H 0x43 // 陀螺仪值,X轴高8位寄存器
#define MPU6050_RA_GYRO_XOUT_L 0x44
#define MPU6050_RA_GYRO_YOUT_H 0x45
#define MPU6050_RA_GYRO_YOUT_L 0x46
#define MPU6050_RA_GYRO_ZOUT_H 0x47
#define MPU6050_RA_GYRO_ZOUT_L 0x48
#define MPU6050_RA_EXT_SENS_DATA_00 0x49
#define MPU6050_RA_EXT_SENS_DATA_01 0x4A
#define MPU6050_RA_EXT_SENS_DATA_02 0x4B
#define MPU6050_RA_EXT_SENS_DATA_03 0x4C
#define MPU6050_RA_EXT_SENS_DATA_04 0x4D
#define MPU6050_RA_EXT_SENS_DATA_05 0x4E
#define MPU6050_RA_EXT_SENS_DATA_06 0x4F
#define MPU6050_RA_EXT_SENS_DATA_07 0x50
#define MPU6050_RA_EXT_SENS_DATA_08 0x51
#define MPU6050_RA_EXT_SENS_DATA_09 0x52
#define MPU6050_RA_EXT_SENS_DATA_10 0x53
#define MPU6050_RA_EXT_SENS_DATA_11 0x54
#define MPU6050_RA_EXT_SENS_DATA_12 0x55
#define MPU6050_RA_EXT_SENS_DATA_13 0x56
#define MPU6050_RA_EXT_SENS_DATA_14 0x57
#define MPU6050_RA_EXT_SENS_DATA_15 0x58
#define MPU6050_RA_EXT_SENS_DATA_16 0x59
#define MPU6050_RA_EXT_SENS_DATA_17 0x5A
#define MPU6050_RA_EXT_SENS_DATA_18 0x5B
#define MPU6050_RA_EXT_SENS_DATA_19 0x5C
#define MPU6050_RA_EXT_SENS_DATA_20 0x5D
#define MPU6050_RA_EXT_SENS_DATA_21 0x5E
#define MPU6050_RA_EXT_SENS_DATA_22 0x5F
#define MPU6050_RA_EXT_SENS_DATA_23 0x60
#define MPU6050_RA_MOT_DETECT_STATUS 0x61
#define MPU6050_RA_I2C_SLV0_DO 0x63
#define MPU6050_RA_I2C_SLV1_DO 0x64
#define MPU6050_RA_I2C_SLV2_DO 0x65
#define MPU6050_RA_I2C_SLV3_DO 0x66
#define MPU6050_RA_I2C_MST_DELAY_CTRL 0x67
#define MPU6050_RA_SIGNAL_PATH_RESET 0x68
#define MPU6050_RA_MOT_DETECT_CTRL 0x69
#define MPU6050_RA_USER_CTRL 0x6A // 用户控制寄存器
#define MPU6050_RA_PWR_MGMT_1 0x6B // 电源管理寄存器1
#define MPU6050_RA_PWR_MGMT_2 0x6C // 电源管理寄存器2
#define MPU6050_RA_BANK_SEL 0x6D
#define MPU6050_RA_MEM_START_ADDR 0x6E
#define MPU6050_RA_MEM_R_W 0x6F
#define MPU6050_RA_DMP_CFG_1 0x70
#define MPU6050_RA_DMP_CFG_2 0x71
#define MPU6050_RA_FIFO_COUNTH 0x72
#define MPU6050_RA_FIFO_COUNTL 0x73
#define MPU6050_RA_FIFO_R_W 0x74
#define MPU6050_RA_WHO_AM_I 0x75 // 器件ID寄存器#define MPU6050_TC_PWR_MODE_BIT 7
#define MPU6050_TC_OFFSET_BIT 6
#define MPU6050_TC_OFFSET_LENGTH 6
#define MPU6050_TC_OTP_BNK_VLD_BIT 0#define MPU6050_VDDIO_LEVEL_VLOGIC 0
#define MPU6050_VDDIO_LEVEL_VDD 1#define MPU6050_CFG_EXT_SYNC_SET_BIT 5
#define MPU6050_CFG_EXT_SYNC_SET_LENGTH 3
#define MPU6050_CFG_DLPF_CFG_BIT 2
#define MPU6050_CFG_DLPF_CFG_LENGTH 3#define MPU6050_EXT_SYNC_DISABLED 0x0
#define MPU6050_EXT_SYNC_TEMP_OUT_L 0x1
#define MPU6050_EXT_SYNC_GYRO_XOUT_L 0x2
#define MPU6050_EXT_SYNC_GYRO_YOUT_L 0x3
#define MPU6050_EXT_SYNC_GYRO_ZOUT_L 0x4
#define MPU6050_EXT_SYNC_ACCEL_XOUT_L 0x5
#define MPU6050_EXT_SYNC_ACCEL_YOUT_L 0x6
#define MPU6050_EXT_SYNC_ACCEL_ZOUT_L 0x7#define MPU6050_DLPF_BW_256 0x00
#define MPU6050_DLPF_BW_188 0x01
#define MPU6050_DLPF_BW_98 0x02
#define MPU6050_DLPF_BW_42 0x03
#define MPU6050_DLPF_BW_20 0x04
#define MPU6050_DLPF_BW_10 0x05
#define MPU6050_DLPF_BW_5 0x06#define MPU6050_GCONFIG_FS_SEL_BIT 4
#define MPU6050_GCONFIG_FS_SEL_LENGTH 2#define MPU6050_GYRO_FS_250 0x00
#define MPU6050_GYRO_FS_500 0x01
#define MPU6050_GYRO_FS_1000 0x02
#define MPU6050_GYRO_FS_2000 0x03#define MPU6050_ACONFIG_XA_ST_BIT 7
#define MPU6050_ACONFIG_YA_ST_BIT 6
#define MPU6050_ACONFIG_ZA_ST_BIT 5
#define MPU6050_ACONFIG_AFS_SEL_BIT 4
#define MPU6050_ACONFIG_AFS_SEL_LENGTH 2
#define MPU6050_ACONFIG_ACCEL_HPF_BIT 2
#define MPU6050_ACONFIG_ACCEL_HPF_LENGTH 3#define MPU6050_ACCEL_FS_2 0x00
#define MPU6050_ACCEL_FS_4 0x01
#define MPU6050_ACCEL_FS_8 0x02
#define MPU6050_ACCEL_FS_16 0x03#define MPU6050_DHPF_RESET 0x00
#define MPU6050_DHPF_5 0x01
#define MPU6050_DHPF_2P5 0x02
#define MPU6050_DHPF_1P25 0x03
#define MPU6050_DHPF_0P63 0x04
#define MPU6050_DHPF_HOLD 0x07#define MPU6050_TEMP_FIFO_EN_BIT 7
#define MPU6050_XG_FIFO_EN_BIT 6
#define MPU6050_YG_FIFO_EN_BIT 5
#define MPU6050_ZG_FIFO_EN_BIT 4
#define MPU6050_ACCEL_FIFO_EN_BIT 3
#define MPU6050_SLV2_FIFO_EN_BIT 2
#define MPU6050_SLV1_FIFO_EN_BIT 1
#define MPU6050_SLV0_FIFO_EN_BIT 0#define MPU6050_MULT_MST_EN_BIT 7
#define MPU6050_WAIT_FOR_ES_BIT 6
#define MPU6050_SLV_3_FIFO_EN_BIT 5
#define MPU6050_I2C_MST_P_NSR_BIT 4
#define MPU6050_I2C_MST_CLK_BIT 3
#define MPU6050_I2C_MST_CLK_LENGTH 4#define MPU6050_CLOCK_DIV_348 0x0
#define MPU6050_CLOCK_DIV_333 0x1
#define MPU6050_CLOCK_DIV_320 0x2
#define MPU6050_CLOCK_DIV_308 0x3
#define MPU6050_CLOCK_DIV_296 0x4
#define MPU6050_CLOCK_DIV_286 0x5
#define MPU6050_CLOCK_DIV_276 0x6
#define MPU6050_CLOCK_DIV_267 0x7
#define MPU6050_CLOCK_DIV_258 0x8
#define MPU6050_CLOCK_DIV_500 0x9
#define MPU6050_CLOCK_DIV_471 0xA
#define MPU6050_CLOCK_DIV_444 0xB
#define MPU6050_CLOCK_DIV_421 0xC
#define MPU6050_CLOCK_DIV_400 0xD
#define MPU6050_CLOCK_DIV_381 0xE
#define MPU6050_CLOCK_DIV_364 0xF#define MPU6050_I2C_SLV_RW_BIT 7
#define MPU6050_I2C_SLV_ADDR_BIT 6
#define MPU6050_I2C_SLV_ADDR_LENGTH 7
#define MPU6050_I2C_SLV_EN_BIT 7
#define MPU6050_I2C_SLV_BYTE_SW_BIT 6
#define MPU6050_I2C_SLV_REG_DIS_BIT 5
#define MPU6050_I2C_SLV_GRP_BIT 4
#define MPU6050_I2C_SLV_LEN_BIT 3
#define MPU6050_I2C_SLV_LEN_LENGTH 4#define MPU6050_I2C_SLV4_RW_BIT 7
#define MPU6050_I2C_SLV4_ADDR_BIT 6
#define MPU6050_I2C_SLV4_ADDR_LENGTH 7
#define MPU6050_I2C_SLV4_EN_BIT 7
#define MPU6050_I2C_SLV4_INT_EN_BIT 6
#define MPU6050_I2C_SLV4_REG_DIS_BIT 5
#define MPU6050_I2C_SLV4_MST_DLY_BIT 4
#define MPU6050_I2C_SLV4_MST_DLY_LENGTH 5#define MPU6050_MST_PASS_THROUGH_BIT 7
#define MPU6050_MST_I2C_SLV4_DONE_BIT 6
#define MPU6050_MST_I2C_LOST_ARB_BIT 5
#define MPU6050_MST_I2C_SLV4_NACK_BIT 4
#define MPU6050_MST_I2C_SLV3_NACK_BIT 3
#define MPU6050_MST_I2C_SLV2_NACK_BIT 2
#define MPU6050_MST_I2C_SLV1_NACK_BIT 1
#define MPU6050_MST_I2C_SLV0_NACK_BIT 0#define MPU6050_INTCFG_INT_LEVEL_BIT 7
#define MPU6050_INTCFG_INT_OPEN_BIT 6
#define MPU6050_INTCFG_LATCH_INT_EN_BIT 5
#define MPU6050_INTCFG_INT_RD_CLEAR_BIT 4
#define MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT 3
#define MPU6050_INTCFG_FSYNC_INT_EN_BIT 2
#define MPU6050_INTCFG_I2C_BYPASS_EN_BIT 1
#define MPU6050_INTCFG_CLKOUT_EN_BIT 0#define MPU6050_INTMODE_ACTIVEHIGH 0x00
#define MPU6050_INTMODE_ACTIVELOW 0x01#define MPU6050_INTDRV_PUSHPULL 0x00
#define MPU6050_INTDRV_OPENDRAIN 0x01#define MPU6050_INTLATCH_50USPULSE 0x00
#define MPU6050_INTLATCH_WAITCLEAR 0x01#define MPU6050_INTCLEAR_STATUSREAD 0x00
#define MPU6050_INTCLEAR_ANYREAD 0x01#define MPU6050_INTERRUPT_FF_BIT 7
#define MPU6050_INTERRUPT_MOT_BIT 6
#define MPU6050_INTERRUPT_ZMOT_BIT 5
#define MPU6050_INTERRUPT_FIFO_OFLOW_BIT 4
#define MPU6050_INTERRUPT_I2C_MST_INT_BIT 3
#define MPU6050_INTERRUPT_PLL_RDY_INT_BIT 2
#define MPU6050_INTERRUPT_DMP_INT_BIT 1
#define MPU6050_INTERRUPT_DATA_RDY_BIT 0// TODO: figure out what these actually do
// UMPL source code is not very obivous
#define MPU6050_DMPINT_5_BIT 5
#define MPU6050_DMPINT_4_BIT 4
#define MPU6050_DMPINT_3_BIT 3
#define MPU6050_DMPINT_2_BIT 2
#define MPU6050_DMPINT_1_BIT 1
#define MPU6050_DMPINT_0_BIT 0#define MPU6050_MOTION_MOT_XNEG_BIT 7
#define MPU6050_MOTION_MOT_XPOS_BIT 6
#define MPU6050_MOTION_MOT_YNEG_BIT 5
#define MPU6050_MOTION_MOT_YPOS_BIT 4
#define MPU6050_MOTION_MOT_ZNEG_BIT 3
#define MPU6050_MOTION_MOT_ZPOS_BIT 2
#define MPU6050_MOTION_MOT_ZRMOT_BIT 0#define MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT 7
#define MPU6050_DELAYCTRL_I2C_SLV4_DLY_EN_BIT 4
#define MPU6050_DELAYCTRL_I2C_SLV3_DLY_EN_BIT 3
#define MPU6050_DELAYCTRL_I2C_SLV2_DLY_EN_BIT 2
#define MPU6050_DELAYCTRL_I2C_SLV1_DLY_EN_BIT 1
#define MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT 0#define MPU6050_PATHRESET_GYRO_RESET_BIT 2
#define MPU6050_PATHRESET_ACCEL_RESET_BIT 1
#define MPU6050_PATHRESET_TEMP_RESET_BIT 0#define MPU6050_DETECT_ACCEL_ON_DELAY_BIT 5
#define MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH 2
#define MPU6050_DETECT_FF_COUNT_BIT 3
#define MPU6050_DETECT_FF_COUNT_LENGTH 2
#define MPU6050_DETECT_MOT_COUNT_BIT 1
#define MPU6050_DETECT_MOT_COUNT_LENGTH 2#define MPU6050_DETECT_DECREMENT_RESET 0x0
#define MPU6050_DETECT_DECREMENT_1 0x1
#define MPU6050_DETECT_DECREMENT_2 0x2
#define MPU6050_DETECT_DECREMENT_4 0x3#define MPU6050_USERCTRL_DMP_EN_BIT 7
#define MPU6050_USERCTRL_FIFO_EN_BIT 6
#define MPU6050_USERCTRL_I2C_MST_EN_BIT 5
#define MPU6050_USERCTRL_I2C_IF_DIS_BIT 4
#define MPU6050_USERCTRL_DMP_RESET_BIT 3
#define MPU6050_USERCTRL_FIFO_RESET_BIT 2
#define MPU6050_USERCTRL_I2C_MST_RESET_BIT 1
#define MPU6050_USERCTRL_SIG_COND_RESET_BIT 0#define MPU6050_PWR1_DEVICE_RESET_BIT 7
#define MPU6050_PWR1_SLEEP_BIT 6
#define MPU6050_PWR1_CYCLE_BIT 5
#define MPU6050_PWR1_TEMP_DIS_BIT 3
#define MPU6050_PWR1_CLKSEL_BIT 2
#define MPU6050_PWR1_CLKSEL_LENGTH 3#define MPU6050_CLOCK_INTERNAL 0x00
#define MPU6050_CLOCK_PLL_XGYRO 0x01
#define MPU6050_CLOCK_PLL_YGYRO 0x02
#define MPU6050_CLOCK_PLL_ZGYRO 0x03
#define MPU6050_CLOCK_PLL_EXT32K 0x04
#define MPU6050_CLOCK_PLL_EXT19M 0x05
#define MPU6050_CLOCK_KEEP_RESET 0x07#define MPU6050_PWR2_LP_WAKE_CTRL_BIT 7
#define MPU6050_PWR2_LP_WAKE_CTRL_LENGTH 2
#define MPU6050_PWR2_STBY_XA_BIT 5
#define MPU6050_PWR2_STBY_YA_BIT 4
#define MPU6050_PWR2_STBY_ZA_BIT 3
#define MPU6050_PWR2_STBY_XG_BIT 2
#define MPU6050_PWR2_STBY_YG_BIT 1
#define MPU6050_PWR2_STBY_ZG_BIT 0#define MPU6050_WAKE_FREQ_1P25 0x0
#define MPU6050_WAKE_FREQ_2P5 0x1
#define MPU6050_WAKE_FREQ_5 0x2
#define MPU6050_WAKE_FREQ_10 0x3#define MPU6050_BANKSEL_PRFTCH_EN_BIT 6
#define MPU6050_BANKSEL_CFG_USER_BANK_BIT 5
#define MPU6050_BANKSEL_MEM_SEL_BIT 4
#define MPU6050_BANKSEL_MEM_SEL_LENGTH 5#define MPU6050_WHO_AM_I_BIT 6
#define MPU6050_WHO_AM_I_LENGTH 6#define MPU6050_DMP_MEMORY_BANKS 8
#define MPU6050_DMP_MEMORY_BANK_SIZE 256
#define MPU6050_DMP_MEMORY_CHUNK_SIZE 16void MPU6050ReadTemp(short *tempData);
void MPU6050ReadGyro(short *gyroData);
void MPU6050ReadAcc(short *accData);
void MPU6050_ReturnTemp(float*Temperature);
void MPU6050_Init(void);
uint8_t MPU6050ReadID(void);
void MPU6050_WriteReg(uint8_t reg_add,uint8_t reg_dat);
void MPU6050_ReadData(uint8_t reg_add,unsigned char* Read,uint8_t num);void MPU6050_PWR_MGMT_1_INIT(void);/* 操作函数 */
uint8_t mpu6050_write(uint8_t addr, uint8_t reg, uint8_t len, uint8_t *dat); /* 往ATK-MS6050的指定寄存器连续写入指定数据 */
uint8_t mpu6050_write_byte(uint8_t addr, uint8_t reg, uint8_t dat); /* 往ATK-MS6050的指定寄存器写入一字节数据 */
uint8_t mpu6050_read(uint8_t addr, uint8_t reg, uint8_t len, uint8_t *dat); /* 连续读取ATK-MS6050指定寄存器的值 */
uint8_t mpu6050_read_byte(uint8_t addr, uint8_t reg, uint8_t *dat); /* 读取ATK-MS6050指定寄存器的值 */
void mpu6050_sw_reset(void); /* ATK-MS6050软件复位 */
uint8_t mpu6050_set_gyro_fsr(uint8_t fsr); /* ATK-MS6050设置陀螺仪传感器量程范围 */
uint8_t mpu6050_set_accel_fsr(uint8_t fsr); /* ATK-MS6050设置加速度传感器量程范围 */
uint8_t mpu6050_set_lpf(uint16_t lpf); /* ATK-MS6050设置数字低通滤波器频率 */
uint8_t mpu6050_set_rate(uint16_t rate); /* ATK-MS6050设置采样率 */
uint8_t mpu6050_get_temperature(int16_t *temp); /* ATK-MS6050获取温度值 */
uint8_t mpu6050_get_gyroscope(int16_t *gx, int16_t *gy, int16_t *gz); /* ATK-MS6050获取陀螺仪值 */
uint8_t mpu6050_get_accelerometer(int16_t *ax, int16_t *ay, int16_t *az); /* ATK-MS6050获取加速度值 */
uint8_t mpu6050_init(void);/* 函数错误代码 */
#define MPU6050_EOK 0 /* 没有错误 */
#define MPU6050_EID 1 /* ID错误 */
#define MPU6050_EACK 2 /* IIC通讯ACK错误 */#endif /*__MPU6050*/
代码分析
主要涉及与MPU6050传感器通信和配置相关的函数。以下是对每个函数的简要说明:
MPU6050_WriteReg(uint8_t reg_add,uint8_t reg_dat): 将数据写入MPU6050寄存器的函数。
MPU6050_ReadData(uint8_t reg_add,unsigned char* Read,uint8_t num): 从MPU6050寄存器读取数据的函数。
mpu6050_write_byte(uint8_t addr, uint8_t reg, uint8_t dat): 向MPU6050指定寄存器写入一字节数据的函数。
mpu6050_read_byte(uint8_t addr, uint8_t reg, uint8_t *dat): 读取MPU6050指定寄存器的值的函数。
MPU6050_Init(void): 初始化MPU6050芯片的函数,包括解除休眠状态和配置传感器参数等。
MPU6050ReadID(void): 读取MPU6050的ID,并检查是否能够正确识别MPU6050模块。
MPU6050ReadAcc(short *accData): 读取MPU6050的加速度数据。
MPU6050ReadGyro(short *gyroData): 读取MPU6050的角加速度数据。
MPU6050ReadTemp(short *tempData): 读取MPU6050的原始温度数据。
MPU6050_ReturnTemp(float *Temperature): 将读取到的温度数据转化为摄氏度。
mpu6050_sw_reset(void): 执行MPU6050的软件复位操作。
mpu6050_set_gyro_fsr(uint8_t fsr): 设置MPU6050陀螺仪传感器的量程范围。
mpu6050_set_accel_fsr(uint8_t fsr): 设置MPU6050加速度传感器的量程范围。
mpu6050_set_lpf(uint16_t lpf): 设置MPU6050的数字低通滤波器频率。
mpu6050_set_rate(uint16_t rate): 设置MPU6050的采样率。
mpu6050_get_temperature(int16_t *temp): 获取MPU6050的温度值。
mpu6050_get_gyroscope(int16_t *gx, int16_t *gy, int16_t *gz): 获取MPU6050的陀螺仪值。
mpu6050_get_accelerometer(int16_t *ax, int16_t *ay, int16_t *az): 获取MPU6050的加速度值。
mpu6050_init(void): 对MPU6050进行初始化的函数。
这些函数可以用于控制和读取MPU6050传感器的数据。请确保正确连接MPU6050模块,并在代码中适当调用这些函数来实现您的应用逻
DMP移植
先获取到移植所需的文件,我使用的文件来自正点原子陀螺仪资料,见文件添加进工程,再进行自己mcu的适配修改
1.修改头文件路径为自己的头文件路径
inv_mpu.c
修改
inv_mpu_dmp_motion_driver.c
修改
2.修改I2C读写函数为自己mcu平台的读写函数
inv_mpu.c
修改为
3.修改延时函数为自己平台的延时函数
inv_mpu.c
修改为
inv_mpu_dmp_motion_driver.c
修改
4.修改MPU6050的地址
mpu6050.h
修改MPU6050地址为0XD0
inv_mpu.c
修改MPU6050地址为0XD0
软件I2C读取时不需要修改这个地址
使用举例
/* 初始化MPU6050 */PRINT_LOG("<<File:%s Line:%d Function:%s>>\r\n ", __FILE__, __LINE__, __FUNCTION__);int ret = 0;float pit, rol, yaw;int16_t acc_x, acc_y, acc_z;int16_t gyr_x, gyr_y, gyr_z;int16_t temp;ret = 1;ret = mpu6050_init();if (ret != 0){PRINT_LOG("<<File:%s Line:%d Function:%s>>\r\n ", __FILE__, __LINE__, __FUNCTION__);printf("MPU6050 init failed!\r\n");}ret = 1;while(ret){/* 初始化MPU6050 DMP */ret = mpu6050_dmp_init();if (ret != 0){printf("MPU6050 DMP init failed!\r\n");}}while (1){/* 获取MPU6050 DMP处理后的数据 */ret = mpu6050_dmp_get_data(&pit, &rol, &yaw);/* 获取MPU6050加速度值 */ret += mpu6050_get_accelerometer(&acc_x, &acc_y, &acc_z);/* 获取MPU6050陀螺仪值 */ret += mpu6050_get_gyroscope(&gyr_x, &gyr_y, &gyr_z);/* 获取MPU6050温度值 */ret += mpu6050_get_temperature(&temp);/* 上传相关数据信息至串口调试助手 */printf("pit: %.2f, rol: %.2f, yaw: %.2f,\r\n ", pit, rol, yaw);printf("acc_x: %d, acc_y: %d, acc_z: %d, \r\n", acc_x, acc_y, acc_z);printf("gyr_x: %d, gyr_y: %d, gyr_z: %d, \r\n", gyr_x, gyr_y, gyr_z);printf("temp: %d\r\n", temp);ret = mpu6050_dmp_get_data(&pit, &rol, &yaw);printf("pit: %.2f, rol: %.2f, yaw: %.2f,\r\n ", pit, rol, yaw);HAL_Delay(5000);
// mpu6050_init();
// mpu6050_dmp_init();}
这段代码初始化了MPU6050传感器,并使用DMP(数字运动处理)模块获取传感器的姿态数据(俯仰、横滚和偏航),加速度数据,陀螺仪数据和温度数据。然后,它通过串口调试助手打印这些数据。在主循环中,代码等待5秒钟后重复获取和打印数据。
请注意,上述代码可能需要根据您的具体硬件配置和要求进行修改和适应。确保正确连接MPU6050模块,并根据您的需求进行必要的初始化和配置。
如果文章对您有帮助,点赞支持👍,感谢🤝
相关文章:
STM32F407硬件I2C实现MPU6050通讯(CUBEIDE)
STM32F407硬件I2C实现MPU6050通讯 文章目录 STM32F407硬件I2C实现MPU6050通讯cubeide设置写操作与读操作函数实现复位,读取温度,角度等函数封装mpu6050.cmpu6050.h代码分析 DMP移植1.修改头文件路径为自己的头文件路径2.修改I2C读写函数为自己mcu平台的读…...
HTML5 语义元素(一)页面结构
本篇主要介绍HTML5增加的语义元素中关于页面结构方面的,包含: <article>、<aside>、<figure>、<figcaption>、<footer>、<header>、<main>、<nav>、<section>等元素。 目录 1. 语义元素介绍 1.…...
嵌套滚动实践:onInterceptTouchEvent与NestedScrolling【实用为准】
嵌套滚动:内外两层均可滚动,比如上半部分是一个有限的列表,下半部分是WebView,在内层上半部分展示到底的时候,外部父布局整体滚动内部View,将底部WevView拉起来,滚动到顶部之后再将滚动交给内部…...
Redis入门 - 5种基本数据类型
原文首更地址,阅读效果更佳! Redis入门 - 5种基本数据类型 | CoderMast编程桅杆https://www.codermast.com/database/redis/five-base-datatype.html 说明 在我们平常的业务中基本只会使用到Redis的基本数据类型(String、List、Hash、Set、…...
mybatis-plus用法(一)
MyBatis-plus 是一款 Mybatis 增强工具,用于简化开发,提高效率。下文使用缩写 mp来简化表示 MyBatis-plus,本文主要介绍 mp 整合 Spring Boot 的使用。 (5条消息) mybatis-plus用法(二)_渣娃工程师的博客-CSDN博客 1…...
源码安装包管理
1. 源码包基本概述 在linux环境下面安装源码包是比较常见的, 早期运维管理工作中,大部分软件都是通过源码安装的。那么安装一个源码包,是需要我们自己把源代码编译成二进制的可执行文件。 源码包的编译用到了linux系统里的编译器,通常源码包…...
Vue|获取表单数据
在Vue中获取表单数据有多种方式,具体取决于你使用的是哪种表单元素和你的需求。 1. 单个表单元素: 如果你只需要获取单个表单元素的值,可以使用v-model指令将表单元素的值绑定到Vue实例的一个属性上。例如: <input type&quo…...
微信小程序入门学习02-TDesign中的自定义组件
目录 1 显示文本2 自定义组件3 变量定义4 值绑定总结 我们上一篇讲解了TDesign模板的基本用法,如何开始阅读模板。本篇我们讲解一下自定义组件的用法。 1 显示文本 官方模板在顶部除了显示图片外,还显示了一段文字介绍。文字是嵌套在容器组件里…...
【linux kernel】linux media子系统分析之media控制器设备
文章目录 一、抽象媒体设备模型二、媒体设备三、Entity四、Interfaces五、Pad六、Link七、Media图遍历八、使用计数和电源处理九、link设置十、Pipeline和Media流十一、链接验证十二、媒体控制器设备的分配器API 本文基于linux内核 4.19.4,抽象媒体设备模型框架的相…...
Scala--03
第6章 面向对象 Scala 的面向对象思想和Java 的面向对象思想和概念是一致的。 Scala 中语法和 Java 不同,补充了更多的功能。 6.1类和对象详解 6.1.1组成结构 构造函数: 在创建对象的时候给属性赋值 成员变量: 成员方法(函数) 局部变量 代码块 6.1.2构造器…...
【MongoDB】--MongoDB高级功能
目录 一、前言二、聚合管道aggregate1、示例说明2、具体代码实现一、前言 这里主要记录mongodb一些高级功能使用,如聚合。 二、聚合管道aggregate 聚合操作将来自多个文档的值组合在一起,并且可以对分组数据执行各种操作以返回单个结果,主要用于处理数据(诸如统计平均值,…...
C# new与malloc
目录 C# new与malloc C# new与malloc的区别 C# new关键字底层做的操作 C# new与malloc new关键字: new关键字在C#中用于实例化对象,并为其分配内存。它是面向对象编程的基本操作之一。使用new关键字可以在托管堆上分配内存,同时调用对象的构…...
微软MFC技术简明介绍
我是荔园微风,作为一名在IT界整整25年的老兵,今天来看一下微软MFC技术简明介绍 Visual C 与 MFC 微软公司于1992年上半年推出了C/C 7.0 产品时初次向世人介绍了MFC 1.0,这个产品包含了20,000行C原始代码,60个以上的Windows相关类…...
汽车电子Autosar之车载以太网
前言 近些年来,随着为了让汽车更加安全、智能、环保等,一系列的高级辅助驾驶功能喷涌而出。未来满足这些需求,就对传统的电子电器架构带来了严峻的考验,需要越来越多的电子部件参与信息交互,导致对网络传输速率&#x…...
MSP430_C语言例程注释详
本章选择了一些简单的C语言程序例题,这些程序的结构简单,编程技巧不多,题目虽然 简单,但是非常适合入门单片机的学习者学习MSP430单片机的C 语言编程。 如下列出了C语言例题运行的MSP430F149实验板硬件资源环境,熟悉…...
Vb+access库存管理系统(论文+开题报告+源代码+目录)
库存信息管理系统的基本问题1.1 库存信息管理系统的简介 本系统是为了提高腾达公司自动化办公的水平、经过详细的调查分析初步制定了腾达公司库存信息管理系统。基于WINDOWS 98 平台,使用Microsoft Access97, 在Visual Basic 6.0编程环境下开发的库存信息管理系统。该系统采用…...
Java 数组
在 Java 语言中,数组是一种基本的数据结构,可以存储一组相同类型的数据。本篇技术博客将详细介绍 Java 语言中的数组,包括一维数组和多维数组,以及数组的使用方法和注意事项。 一维数组 一维数组是指只有一行的数组,…...
CSDN 编程竞赛五十八期题解
竞赛总览 CSDN 编程竞赛五十八期:比赛详情 (csdn.net) 竞赛题解 题目1、打家劫舍 有一个小偷计划偷窃沿街的房屋,每间房内都藏有一定的现金,影响偷窃行为的唯一制约因素就是相邻的房屋装有相互连通的防盗系统。如果两间相邻的房屋在同一晚…...
Unity入门6——光源组件
一、参数面板 二、参数介绍 Type:光源类型 Spot:聚光灯 Range:发光距离Spot Angle:光锥角度Directional:方向光Point:点光源Area(Baked Only):面光源 仅烘焙。预先算好&…...
C语言之动态内存分配(1)
目录 本章重点 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 几个经典的笔试题 柔性数组 动态内存管理—自己维护自己的内存空间的大小 首先我们申请一个变量,再申请一个数组 这是我们目前知道的向内存申请…...
AIGC新时代,注意政策走向,产业方向,拥抱可信AI。需要了解基本理论,基础模型,前沿进展,产品应用,以及小小的项目复现
AIGC(AI-Generated Content,AI生成内容)是指基于生成对抗网络(GAN)、大型预训练模型等人工智能技术的方法,通过对已有数据进行学习和模式识别,以适当的泛化能力生成相关内容的技术。类似的概念还…...
如何白嫖一年CSDN会员?618活动!亲测有效!!!
活动详情 CSDN会员免费送一年,仅剩3天! 下载权益延长一年! 一年一次的机会,错过了就要再等明年! 博主已经领取到了! 会员权益 1、修改专属域名,别人都是https://blog.csdn.net/qq_xxxxxxxx&a…...
微服务: 00-rabbitmq出现的异常以及解决方案
目录 前言: 问题概述: 1. rabbitmq初始安装配置异常 -> 1.1 rabbitmq报您与此网站连接不是私密连接 --->1.1.1 上述问题解决方案 ---> 1.1.2 依次执行下面代码 -> 1.2 解决用户的No access情况 -> 1.2.1 使用设置的账号密码进行登录 -> 1.2.2 点击 Ad…...
Vue3与Vue2比较
Vue.js 3相对于Vue.js 2带来了一些重大变化,其中包括一些语法变化。 下面是Vue.js 2和Vue.js 3的一些语法差异比较: 一、语法差异比较 1.组件的注册方式不同 在Vue.js 2中,我们使用Vue.component()或者Vue.extend()方式创建一个组件。但是…...
如何对待工作中的失误?
在日复一日的工作中,我们免不了会产生一些失误,会因此感到沮丧和失望。但如何正确地对待和处理这些失误才是最重要的,它直接影响到我们的工作表现和个人成长。一起来谈谈作为职场人的你时如何处理工作中的失误的吧! 一、在面对失…...
使用css3如何实现一个文字打印效果
前言 在很多网站首页介绍页里,为了吸引用户,暂留更长时间,使用了一些css3动画的 示例效果 文字打印.gif 实现这个动画原理 想要实现这个动画,改变元素的宽度,结合动画css3关键帧实现 具体代码如下所示 <!DOCTYPE html> <html lang"en"><head><m…...
【雕爷学编程】Arduino动手做(115)---HB100多普勒雷达模块
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…...
深度学习笔记之Transformer(一)注意力机制基本介绍
深度学习笔记之Transformer——注意力机制基本介绍 引言回顾: Seq2seq \text{Seq2seq} Seq2seq模型中的注意力机制注意力机制的简单描述注意力机制的机器学习范例: Nadaraya-Watson \text{Nadaraya-Watson} Nadaraya-Watson核回归 Nadaraya-Watson \text…...
基于SpringBoot的SSM整合案例 -- SpringBoot快速入门保姆级教程(四)
文章目录 前言1.设计创建数据库表tbl_book2.创建新的SpringBoot模块,勾选相关依赖3. 添加SpringBoot创建项目时没有提供的相关坐标4.根据数据库表创建实体类Book5.编写dao层操作BookDao6.编写Service服务层接口BookService7.编写服务层实现类BookServiceImpl8.编写B…...
占据80%中国企业出海市场,亚马逊云科技如何为出海客户提供更多资源和附加值
亚马逊云科技就可以做到,作为占据80%中国企业出海市场的亚马逊云科技,其覆盖全球的业务体系,从亚马逊海外购、亚马逊全球开店、亚马逊智能硬件与服务,Amazon Alexa,Amazon Music都是属于亚马逊云科技“梦之队”的一员。…...
阜阳商城网站建设/seo外链友情链接
准备环境:VS.2003, windows2003(IIS6.0)SP1因为偶然的原因,需要调试几个asp页面,但手动上只有UltraEdit和VS.net.知道InterDev可以调试,可以装起来以后,总是出错。我本身对其也不熟悉,也没时间摸索…...
wordpress. 评论插件/怎么弄属于自己的网站
1. 前言从2020年10月开始,基于亚马孙云科技 Graviton2 的缓存实例逐步推出,客户可以在使用 Amazon ElastiCache for Redis上使用这些实例。Graviton2 处理器由 Amazon Web Services 使用 64 位 ARM Neoverse 内核定制,对第一代亚马逊云科技 G…...
商城网站开发那家好/成都网站快速排名优化
1:复制表结构及数据到新表 select * into 目的数据库名.dbo.目的表名 from 原表名 select * into my0735home.dbo.infoMianTest from infoMian 2:备份表的一部分列(不写*而写出列的列表) select 列名1,列名2,列名3 into 目的数据库名.dbo.目的表名 from …...
网页版梦幻西游官网/武汉网站seo德升
功能单元的最大扇入扇出工具分析文档名称:功能单元最大扇入扇出工具分析作 者:日 期:1. 概念由于度量的目标是C源代码,所以“功能单元的最大扇入扇出”的含义如下:功能单元:c语言的函数。扇入:有多少其他函…...
网站建设的好处有什么用/引擎seo如何优化
系统流程如下图所示 首先数据交换流程为数据库<—>后台<---->前台 Dao层负责和数据库进行数据交互,services负责事务逻辑处理,action为struts部分,主要负责页面跳转时的数据传送。在web.xml文件中,有 <?xml version"1…...
电子商务网站基本功能/天津关键词优化专家
微信公众号:infoQc如有问题或建议,请公众号留言最近更新:2018-08-19 包装类型 在讲解正文之前,我很想问这么一个问题:"Java为我们提供了8种基本数据类型,为什么还需要提供各自的包装类型呢?…...