Linux用户层I2C读取LSM6DSL陀螺仪记录

news2024/11/14 18:44:27
硬件外设
开发板Lubancat V2/dev/i2c-3
LSM6DSL陀螺仪i2c(7bit地址0x6a)

开发板配置I2C

开发板采用Lubancat-V2,运行Linux内核4.19

使用I2C3外设

因为i2c3外设的设备树默认没有启用,所以在 /boot/uEnv/uEnv.txt 打开,也即取消i2c3-m0注释

随后重启/reboot激活I2C3设备

终端输入

ls  /dev/i2c-*

得到

至此开发板的I2C配置完成

LSM6DSL接口板硬件

此处原理图是LSM6DS3TR-C,其引脚定义和寄存器定义与LSM6DSL一致

完成:供电+SDA连线(到Lubancat I2C3 SDA)+SCL连线(到Lubancat I2C3 SCL)

LSM6DSL特性

LSM6DSL默认上电之后加速度的ODR=0,即不输出加速度数据,所以需要手动配置,此外默认加速度测量范围-2g ~ 2g

 LSM6DSL默认上电之后陀螺仪的ODR=0,即不输出角速度数据,所以需要手动配置,此外默认角速度测量范围0~250dps

代码实现

i2c_lsm6dsl_linux.h 主要作用是声明寄存器地址、函数等


#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>

/************** I2C Address *****************/

#define LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW 0x6a  // SAD[0] = 0
#define LSM6DSL_ACC_GYRO_I2C_ADDRESS_HIGH 0x6b // SAD[0] = 1

/************** Who am I  *******************/

#define LSM6DSL_ACC_GYRO_WHO_AM_I 0x6A

/************** Device Register  *******************/

#define LSM6DSL_ACC_GYRO_FUNC_CFG_ACCESS 0x01

#define LSM6DSL_ACC_GYRO_SENSOR_SYNC_TIME 0x04
#define LSM6DSL_ACC_GYRO_SENSOR_RES_RATIO 0x05

#define LSM6DSL_ACC_GYRO_FIFO_CTRL1 0x06
#define LSM6DSL_ACC_GYRO_FIFO_CTRL2 0x07
#define LSM6DSL_ACC_GYRO_FIFO_CTRL3 0x08
#define LSM6DSL_ACC_GYRO_FIFO_CTRL4 0x09
#define LSM6DSL_ACC_GYRO_FIFO_CTRL5 0x0A

#define LSM6DSL_ACC_GYRO_DRDY_PULSE_CFG_G 0x0B
#define LSM6DSL_ACC_GYRO_INT1_CTRL 0x0D
#define LSM6DSL_ACC_GYRO_INT2_CTRL 0x0E
#define LSM6DSL_ACC_GYRO_WHO_AM_I_REG 0x0F
#define LSM6DSL_ACC_GYRO_CTRL1_XL 0x10
#define LSM6DSL_ACC_GYRO_CTRL2_G 0x11
#define LSM6DSL_ACC_GYRO_CTRL3_C 0x12
#define LSM6DSL_ACC_GYRO_CTRL4_C 0x13
#define LSM6DSL_ACC_GYRO_CTRL5_C 0x14
#define LSM6DSL_ACC_GYRO_CTRL6_C 0x15
#define LSM6DSL_ACC_GYRO_CTRL7_G 0x16
#define LSM6DSL_ACC_GYRO_CTRL8_XL 0x17
#define LSM6DSL_ACC_GYRO_CTRL9_XL 0x18
#define LSM6DSL_ACC_GYRO_CTRL10_C 0x19

#define LSM6DSL_ACC_GYRO_MASTER_CONFIG 0x1A
#define LSM6DSL_ACC_GYRO_WAKE_UP_SRC 0x1B
#define LSM6DSL_ACC_GYRO_TAP_SRC 0x1C
#define LSM6DSL_ACC_GYRO_D6D_SRC 0x1D
#define LSM6DSL_ACC_GYRO_STATUS_REG 0x1E

#define LSM6DSL_ACC_GYRO_OUT_TEMP_L 0x20
#define LSM6DSL_ACC_GYRO_OUT_TEMP_H 0x21
#define LSM6DSL_ACC_GYRO_OUTX_L_G 0x22
#define LSM6DSL_ACC_GYRO_OUTX_H_G 0x23
#define LSM6DSL_ACC_GYRO_OUTY_L_G 0x24
#define LSM6DSL_ACC_GYRO_OUTY_H_G 0x25
#define LSM6DSL_ACC_GYRO_OUTZ_L_G 0x26
#define LSM6DSL_ACC_GYRO_OUTZ_H_G 0x27
#define LSM6DSL_ACC_GYRO_OUTX_L_XL 0x28
#define LSM6DSL_ACC_GYRO_OUTX_H_XL 0x29
#define LSM6DSL_ACC_GYRO_OUTY_L_XL 0x2A
#define LSM6DSL_ACC_GYRO_OUTY_H_XL 0x2B
#define LSM6DSL_ACC_GYRO_OUTZ_L_XL 0x2C
#define LSM6DSL_ACC_GYRO_OUTZ_H_XL 0x2D
#define LSM6DSL_ACC_GYRO_SENSORHUB1_REG 0x2E
#define LSM6DSL_ACC_GYRO_SENSORHUB2_REG 0x2F
#define LSM6DSL_ACC_GYRO_SENSORHUB3_REG 0x30
#define LSM6DSL_ACC_GYRO_SENSORHUB4_REG 0x31
#define LSM6DSL_ACC_GYRO_SENSORHUB5_REG 0x32
#define LSM6DSL_ACC_GYRO_SENSORHUB6_REG 0x33
#define LSM6DSL_ACC_GYRO_SENSORHUB7_REG 0x34
#define LSM6DSL_ACC_GYRO_SENSORHUB8_REG 0x35
#define LSM6DSL_ACC_GYRO_SENSORHUB9_REG 0x36
#define LSM6DSL_ACC_GYRO_SENSORHUB10_REG 0x37
#define LSM6DSL_ACC_GYRO_SENSORHUB11_REG 0x38
#define LSM6DSL_ACC_GYRO_SENSORHUB12_REG 0x39
#define LSM6DSL_ACC_GYRO_FIFO_STATUS1 0x3A
#define LSM6DSL_ACC_GYRO_FIFO_STATUS2 0x3B
#define LSM6DSL_ACC_GYRO_FIFO_STATUS3 0x3C
#define LSM6DSL_ACC_GYRO_FIFO_STATUS4 0x3D
#define LSM6DSL_ACC_GYRO_FIFO_DATA_OUT_L 0x3E
#define LSM6DSL_ACC_GYRO_FIFO_DATA_OUT_H 0x3F
#define LSM6DSL_ACC_GYRO_TIMESTAMP0_REG 0x40
#define LSM6DSL_ACC_GYRO_TIMESTAMP1_REG 0x41
#define LSM6DSL_ACC_GYRO_TIMESTAMP2_REG 0x42

#define LSM6DSL_ACC_GYRO_TIMESTAMP_L 0x49
#define LSM6DSL_ACC_GYRO_TIMESTAMP_H 0x4A

#define LSM6DSL_ACC_GYRO_STEP_COUNTER_L 0x4B
#define LSM6DSL_ACC_GYRO_STEP_COUNTER_H 0x4C

#define LSM6DSL_ACC_GYRO_SENSORHUB13_REG 0x4D
#define LSM6DSL_ACC_GYRO_SENSORHUB14_REG 0x4E
#define LSM6DSL_ACC_GYRO_SENSORHUB15_REG 0x4F
#define LSM6DSL_ACC_GYRO_SENSORHUB16_REG 0x50
#define LSM6DSL_ACC_GYRO_SENSORHUB17_REG 0x51
#define LSM6DSL_ACC_GYRO_SENSORHUB18_REG 0x52

#define LSM6DSL_ACC_GYRO_FUNC_SRC 0x53
#define LSM6DSL_ACC_GYRO_TAP_CFG1 0x58
#define LSM6DSL_ACC_GYRO_TAP_THS_6D 0x59
#define LSM6DSL_ACC_GYRO_INT_DUR2 0x5A
#define LSM6DSL_ACC_GYRO_WAKE_UP_THS 0x5B
#define LSM6DSL_ACC_GYRO_WAKE_UP_DUR 0x5C
#define LSM6DSL_ACC_GYRO_FREE_FALL 0x5D
#define LSM6DSL_ACC_GYRO_MD1_CFG 0x5E
#define LSM6DSL_ACC_GYRO_MD2_CFG 0x5F

#define LSM6DSL_ACC_GYRO_OUT_MAG_RAW_X_L 0x66
#define LSM6DSL_ACC_GYRO_OUT_MAG_RAW_X_H 0x67
#define LSM6DSL_ACC_GYRO_OUT_MAG_RAW_Y_L 0x68
#define LSM6DSL_ACC_GYRO_OUT_MAG_RAW_Y_H 0x69
#define LSM6DSL_ACC_GYRO_OUT_MAG_RAW_Z_L 0x6A
#define LSM6DSL_ACC_GYRO_OUT_MAG_RAW_Z_H 0x6B

#define LSM6DSL_ACC_GYRO_X_OFS_USR 0x73
#define LSM6DSL_ACC_GYRO_Y_OFS_USR 0x74
#define LSM6DSL_ACC_GYRO_Z_OFS_USR 0x75

/************** Embedded functions register mapping  *******************/
#define LSM6DSL_ACC_GYRO_SLV0_ADD 0x02
#define LSM6DSL_ACC_GYRO_SLV0_SUBADD 0x03
#define LSM6DSL_ACC_GYRO_SLAVE0_CONFIG 0x04
#define LSM6DSL_ACC_GYRO_SLV1_ADD 0x05
#define LSM6DSL_ACC_GYRO_SLV1_SUBADD 0x06
#define LSM6DSL_ACC_GYRO_SLAVE1_CONFIG 0x07
#define LSM6DSL_ACC_GYRO_SLV2_ADD 0x08
#define LSM6DSL_ACC_GYRO_SLV2_SUBADD 0x09
#define LSM6DSL_ACC_GYRO_SLAVE2_CONFIG 0x0A
#define LSM6DSL_ACC_GYRO_SLV3_ADD 0x0B
#define LSM6DSL_ACC_GYRO_SLV3_SUBADD 0x0C
#define LSM6DSL_ACC_GYRO_SLAVE3_CONFIG 0x0D
#define LSM6DSL_ACC_GYRO_DATAWRITE_SRC_MODE_SUB_SLV0 0x0E
#define LSM6DSL_ACC_GYRO_CONFIG_PEDO_THS_MIN 0x0F

#define LSM6DSL_ACC_GYRO_SM_STEP_THS 0x13
#define LSM6DSL_ACC_GYRO_PEDO_DEB_REG 0x14
#define LSM6DSL_ACC_GYRO_STEP_COUNT_DELTA 0x15

#define LSM6DSL_ACC_GYRO_MAG_SI_XX 0x24
#define LSM6DSL_ACC_GYRO_MAG_SI_XY 0x25
#define LSM6DSL_ACC_GYRO_MAG_SI_XZ 0x26
#define LSM6DSL_ACC_GYRO_MAG_SI_YX 0x27
#define LSM6DSL_ACC_GYRO_MAG_SI_YY 0x28
#define LSM6DSL_ACC_GYRO_MAG_SI_YZ 0x29
#define LSM6DSL_ACC_GYRO_MAG_SI_ZX 0x2A
#define LSM6DSL_ACC_GYRO_MAG_SI_ZY 0x2B
#define LSM6DSL_ACC_GYRO_MAG_SI_ZZ 0x2C
#define LSM6DSL_ACC_GYRO_MAG_OFFX_L 0x2D
#define LSM6DSL_ACC_GYRO_MAG_OFFX_H 0x2E
#define LSM6DSL_ACC_GYRO_MAG_OFFY_L 0x2F
#define LSM6DSL_ACC_GYRO_MAG_OFFY_H 0x30
#define LSM6DSL_ACC_GYRO_MAG_OFFZ_L 0x31
#define LSM6DSL_ACC_GYRO_MAG_OFFZ_H 0x32

/* Accelero Full_ScaleSelection */
#define LSM6DSL_ACC_FULLSCALE_2G ((uint8_t)0x00)  /*!< �2 g */
#define LSM6DSL_ACC_FULLSCALE_4G ((uint8_t)0x08)  /*!< �4 g */
#define LSM6DSL_ACC_FULLSCALE_8G ((uint8_t)0x0C)  /*!< �8 g */
#define LSM6DSL_ACC_FULLSCALE_16G ((uint8_t)0x04) /*!< �16 g */

/* Accelero Full Scale Sensitivity */
#define LSM6DSL_ACC_SENSITIVITY_2G ((float)0.061f)  /*!< accelerometer sensitivity with 2 g full scale  [mgauss/LSB] */
#define LSM6DSL_ACC_SENSITIVITY_4G ((float)0.122f)  /*!< accelerometer sensitivity with 4 g full scale  [mgauss/LSB] */
#define LSM6DSL_ACC_SENSITIVITY_8G ((float)0.244f)  /*!< accelerometer sensitivity with 8 g full scale  [mgauss/LSB] */
#define LSM6DSL_ACC_SENSITIVITY_16G ((float)0.488f) /*!< accelerometer sensitivity with 12 g full scale [mgauss/LSB] */

/* Accelero Power Mode selection */
#define LSM6DSL_ACC_GYRO_LP_XL_DISABLED ((uint8_t)0x00) /* LP disabled*/
#define LSM6DSL_ACC_GYRO_LP_XL_ENABLED ((uint8_t)0x10)  /* LP enabled*/

/* Output Data Rate */
#define LSM6DSL_ODR_BITPOSITION ((uint8_t)0xF0) /*!< Output Data Rate bit position */
#define LSM6DSL_ODR_POWER_DOWN ((uint8_t)0x00)  /* Power Down mode       */
#define LSM6DSL_ODR_13Hz ((uint8_t)0x10)        /* Low Power mode        */
#define LSM6DSL_ODR_26Hz ((uint8_t)0x20)        /* Low Power mode        */
#define LSM6DSL_ODR_52Hz ((uint8_t)0x30)        /* Low Power mode        */
#define LSM6DSL_ODR_104Hz ((uint8_t)0x40)       /* Normal mode           */
#define LSM6DSL_ODR_208Hz ((uint8_t)0x50)       /* Normal mode           */
#define LSM6DSL_ODR_416Hz ((uint8_t)0x60)       /* High Performance mode */
#define LSM6DSL_ODR_833Hz ((uint8_t)0x70)       /* High Performance mode */
#define LSM6DSL_ODR_1660Hz ((uint8_t)0x80)      /* High Performance mode */
#define LSM6DSL_ODR_3330Hz ((uint8_t)0x90)      /* High Performance mode */
#define LSM6DSL_ODR_6660Hz ((uint8_t)0xA0)      /* High Performance mode */

/* Gyro Full Scale Selection */
#define LSM6DSL_GYRO_FS_245 ((uint8_t)0x00)
#define LSM6DSL_GYRO_FS_500 ((uint8_t)0x04)
#define LSM6DSL_GYRO_FS_1000 ((uint8_t)0x08)
#define LSM6DSL_GYRO_FS_2000 ((uint8_t)0x0C)

/* Gyro Full Scale Sensitivity */
#define LSM6DSL_GYRO_SENSITIVITY_245DPS ((float)8.750f)  /**< Sensitivity value for 245 dps full scale  [mdps/LSB] */
#define LSM6DSL_GYRO_SENSITIVITY_500DPS ((float)17.50f)  /**< Sensitivity value for 500 dps full scale  [mdps/LSB] */
#define LSM6DSL_GYRO_SENSITIVITY_1000DPS ((float)35.00f) /**< Sensitivity value for 1000 dps full scale [mdps/LSB] */
#define LSM6DSL_GYRO_SENSITIVITY_2000DPS ((float)70.00f) /**< Sensitivity value for 2000 dps full scale [mdps/LSB] */

/* Gyro Power Mode selection */
#define LSM6DSL_ACC_GYRO_LP_G_DISABLED ((uint8_t)0x00) /* LP disabled*/
#define LSM6DSL_ACC_GYRO_LP_G_ENABLED ((uint8_t)0x80)  /* LP enabled*/

/* Block Data Update */
#define LSM6DSL_BDU_CONTINUOS ((uint8_t)0x00)
#define LSM6DSL_BDU_BLOCK_UPDATE ((uint8_t)0x40)

/* Auto-increment */
#define LSM6DSL_ACC_GYRO_IF_INC_DISABLED ((uint8_t)0x00)
#define LSM6DSL_ACC_GYRO_IF_INC_ENABLED ((uint8_t)0x04)

uint8_t lsm6dsl_readID(int fd);

void lsm6dsl_acc_init(int fd);
void lsm6dsl_acc_read_xyz(int fd, int16_t *pData);

void lsm6dsl_gyro_init(int fd);
void lsm6dsl_gyro_read_xyz(int fd, int16_t *pData);

i2c_lsm6dsl_linux.c 作用是对LSM6DSL加速度初始化函数、陀螺仪初始化函数、数据读取函数定义,并定义main入口函数


#include "i2c_lsm6dsl_linux.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>

#include <linux/i2c.h>
#include <linux/i2c-dev.h>

int main(int argc, char **argv)
{
    if (argc < 2)
    {
        printf("wrong use!!!\n");
        printf("usage: %s [dev]\n", argv[0]);
        return -1;
    }

    int fd = open(argv[1], O_RDWR);
    if (fd < 0)
    {
        printf("can not open %s\n", argv[1]);
        return -2;
    }

    lsm6dsl_acc_init(fd);
    lsm6dsl_gyro_init(fd);

    uint8_t id = lsm6dsl_readID(fd);
    printf("lsm6dsl id = %d\n", id);

    uint16_t acce_raw_data[3];
    uint16_t gyro_raw_data[3];

    for (int i = 0; i < 10; i++)
    {
        lsm6dsl_acc_read_xyz(fd, acce_raw_data);
        printf("raw acce: [x, y, z] = [%d, %d, %d]\n", acce_raw_data[0], acce_raw_data[1], acce_raw_data[2]);

        sleep(1);

        lsm6dsl_gyro_read_xyz(fd, gyro_raw_data);
        printf("raw gyro: [x, y, z] = [%d, %d, %d]\n", gyro_raw_data[0], gyro_raw_data[1], gyro_raw_data[2]);

        sleep(1);
    }

    return 0;
}

static int i2c_read(int fd, uint8_t addr, uint8_t reg_addr, uint8_t *val, uint16_t rd_cnt)
{
    ioctl(fd, I2C_TENBIT, 0); /* 设置7位地址 */

    /* 设置从机地址 */
    if (ioctl(fd, I2C_SLAVE, addr) < 0)
    {
        printf("fail to set i2c slave address!\n");
        close(fd);
        return -1;
    }

    /* 设置收不到ACK的重试次数 */
    ioctl(fd, I2C_RETRIES, 5);

    if (write(fd, &reg_addr, 1) == 1)
    {
        if (read(fd, val, rd_cnt) == rd_cnt)
            return 0;
    }
    else
    {
        return -1;
    }
}

static int i2c_write(int fd, uint8_t addr, uint8_t reg_addr, uint8_t val)
{
    ioctl(fd, I2C_TENBIT, 0); /* 设置7位地址 */

    /* 设置从机地址 */
    if (ioctl(fd, I2C_SLAVE, addr) < 0)
    {
        printf("fail to set i2c slave address!\n");
        close(fd);
        return -1;
    }

    /* 设置收不到ACK的重试次数 */
    ioctl(fd, I2C_RETRIES, 5);

    uint8_t write_arr[2];
    write_arr[0] = reg_addr;
    write_arr[1] = val;
    if (write(fd, write_arr, 2) == 2)
        return 0;
    else
        return -2;
}

uint8_t lsm6dsl_readID(int fd)
{
    uint8_t lsm6dsl_id = 0;
    i2c_read(fd, LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_WHO_AM_I_REG, &lsm6dsl_id, 1);

    return lsm6dsl_id;
}

void lsm6dsl_acc_init(int fd)
{
    /* 因为LSM6DSL默认上电之后加速度不输出(ODR=0),需要在 LSM6DSL_ACC_GYRO_CTRL1_XL 寄存器进行配置
        在此寄存器顺便将加速度的测量范围配置为 -16g ~ +16g
     */
    uint8_t tmp = LSM6DSL_ODR_833Hz | LSM6DSL_ACC_FULLSCALE_16G;
    i2c_write(fd, LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL1_XL, tmp);

    i2c_read(fd, LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL3_C, &tmp, 1);
    tmp |= LSM6DSL_BDU_CONTINUOS;
    tmp |= LSM6DSL_ACC_GYRO_IF_INC_ENABLED;
    i2c_write(fd, LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL3_C, tmp);
}

void lsm6dsl_acc_read_xyz(int fd, int16_t *pData)
{
    uint8_t acce_rd_buf[6];
    i2c_read(fd, LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_OUTX_L_XL, acce_rd_buf, 6);

    for (int i = 0; i < 3; i++)
    {
        pData[i] = (acce_rd_buf[2 * i + 1] << 8) | acce_rd_buf[2 * i];
    }
}

void lsm6dsl_gyro_init(int fd)
{
    /* 因为LSM6DSL默认上电之后陀螺仪不输出(ODR=0),需要在 LSM6DSL_ACC_GYRO_CTRL2_G 寄存器进行配置
        在此寄存器顺便将加速度的测量范围配置为 -16g ~ +16g
    */
    uint8_t tmp = 0;
    i2c_read(fd, LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL2_G, &tmp, 1);

    tmp |= LSM6DSL_ODR_833Hz;
    tmp |= LSM6DSL_GYRO_FS_1000;
    i2c_write(fd, LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL2_G, tmp);

    i2c_read(fd, LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL3_C, &tmp, 1);
    tmp |= LSM6DSL_BDU_CONTINUOS;
    tmp |= LSM6DSL_ACC_GYRO_IF_INC_ENABLED;
    i2c_write(fd, LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_CTRL3_C, tmp);
}

void lsm6dsl_gyro_read_xyz(int fd, int16_t *pData)
{
    uint8_t acce_rd_buf[6];
    i2c_read(fd, LSM6DSL_ACC_GYRO_I2C_ADDRESS_LOW, LSM6DSL_ACC_GYRO_OUTX_L_G, acce_rd_buf, 6);

    for (int i = 0; i < 3; i++)
    {
        pData[i] = (acce_rd_buf[2 * i + 1] << 8) | acce_rd_buf[2 * i];
    }
}

需要注意的是在API函数read  和 write 函数中LSM6DSL地址是7bit地址(最高位是0)

终端输入使用gcc编译:

gcc ./i2c_lsm6dsl_linux.c -o lsm6dsl

运行测试实例:

访问 /dev/i2c-3 需要root权限

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

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

相关文章

LINUX网络编程:应用层和协议定制

目录 1.协议定制 2.序列化和反序列化 ​编辑 3.tcp为什么是全双工 4.Tcp保证接收数据的完整性 1.协议定制 定制协议就是通信双方都遵守的协定 加上 符合通信和业务处理的结构化数据&#xff0c;就是struct或class。 例&#xff1a;佩奇使用微信向乔治发送了【你好】&…

51单片机——实时时钟

1、DS1302介绍 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时&#xff0c;且具有闰年补偿等多种功能 RTC(Real Time Clock)&#xff1a;实时时钟&#xff0c;是一种集成电路&#xff0c;通常称为时钟…

华为OD机试真题 - 最长的顺子 - 动态规划(Java/Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Java/Python/JS/C/C++)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX…

【Linux修行路】进程通信——消息队列、信号量

目录 ⛳️推荐 一、消息队列 1.1 实现原理 1.2 消息队列接口 1.2.1 msgget——创建、获取一个消息队列 1.2.2 msgctl——释放消息队列、获取消息队列属性 1.2.3 msgsnd——发送数据 1.2.4 msgrcv——从消息队列中检索数据块 1.3 消息队列的指令操作 二、信号量 2.1 …

Java、python、php版 保险业务管理与数据分析系统 社会保险档案管理系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

700. 二叉搜索树中的搜索(迭代)

目录 一&#xff1a;题目&#xff1a; 三&#xff1a;结果 二&#xff1a;代码&#xff1a;: 一&#xff1a;题目&#xff1a; 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的…

Ubuntu 超详细保姆级安装教程(每步都有截图)

文章目录 下载安装VMware检查网络适配器Ubuntu下载创建虚拟机启动虚拟机安装 VWware Tools安装 SSH 连接工具配置静态IP 下载安装VMware Desktop Hypervisor Solutions | VMware 官网下载速度慢的可以使用我百度网盘分享的链接来下载 百度网盘 | VMware 17.5.2 百度网盘没有…

vulnhub靶场-DC2

一、环境配置 1.下载地址&#xff1a;https://www.vulnhub.com/entry/dc-2,311/ 2.靶场配置&#xff1a;Nat模式 更改hosts文件&#xff0c;官网提示需要更改hosts文件才能访问到网站&#xff0c;否则访问不了 kali进入编辑模式vim&#xff0c;添加上自己的靶机ip地址保存即可…

Java进阶13讲__第八讲

集合&#xff1a;Collection&#xff0c;List&#xff0c;Set&#xff0c;Map 集合体系 集合结构 单列集合 1.Collection 1.初识Collection package cn.hdc.oop8.Collection;import java.util.ArrayList; import java.util.HashSet; import java.util.List;/*** 目标&#xf…

前端面试模拟:常见的3个JavaScript经典考题

在一次备受期待的前端开发高级岗位面试中&#xff0c;你紧张地走进了会议室&#xff0c;对面坐着的是一位经验丰富的技术面试官。窗外阳光明媚&#xff0c;屋内却有一丝令人紧张的静谧。 第一问&#xff1a;如何使用JavaScript实现事件委托&#xff1f; 面试官微微一笑&#xf…

实战项目:俄罗斯方块(一)

文章目录 &#x1f34a;自我介绍&#x1f34a;vt100 控制码1.概述2.数字格式①常用数字控制码②常用控制码 &#x1f34a;绘制方格 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我…

猫头虎分享:关于 Mac OS 系统 .DS_Store 文件的起源、作用及管理全指南

&#x1f42f;猫头虎分享&#xff1a;关于 Mac OS 系统 .DS_Store 文件的起源、作用及管理全指南 &#x1f42f; 猫头虎 分享&#xff1a;关于 Mac OS系统 .DS_Store 文件的起源和作用 今天猫头虎带您深入探讨 Mac OS 系统中的 .DS_Store 文件。作为一名开发者&#xff0c;您…

科研绘图系列:R语言差异基因四分图(Quad plot)

介绍 四分图(Quad plot)是一种数据可视化技术,通常用于展示四个变量之间的关系。它由四个子图组成,每个子图都显示两个变量之间的关系。四分图的布局通常是2x2的网格,每个格子代表一个变量对的散点图。 在四分图中,通常: 第一个子图显示变量A和B的关系。第二个子图显示…

足浴城消费系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;商品分类管理&#xff0c;商品信息管理&#xff0c;购买信息管理&#xff0c;会员卡申请管理&#xff0c;包厢信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;公告…

苍穹外卖项目前端DAY01

前端DAY01 1、基于脚手架创建前端工程 使用Vue CLI创建前端工程&#xff1a; 方式一&#xff1a;vue create 项目名称方式二&#xff1a;vue ui&#xff08;比较慢&#xff09; 2、vue基本使用方法 Vue的组件文件以.vue结尾&#xff0c;每个组件由三个部分组成&#xff1a; …

AJAX day-02 HTTP格式JSON格式

目录 一. 计算机网络 1.1 网络参考模型 1.2 各层重要对应的协议 1.3 DNS解析&#xff08;域名解析服务器&#xff09; 1.4 FTP&#xff08;文件传输协议&#xff09; 1.5 UDP&#xff08;用户数据报协议&#xff09; 1.6 TCP(传输控制协议) 1.7 IP(网际互连协议) 1.8 …

[Leetcode 46][Medium]-全排列-回溯(全排列问题)

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题地址 二、整体思路 对于全排列问题&#xff0c;很明显要用回溯法。但是和组合问题不一样的是全排列问题是可以取先前遍历的元素的。因此需要另外新建一个状态数组来存储所有元素是否被访问过的状态。回溯时把状态…

QT Sql 实现多个股票成交明细数据文件制成数据库并支持查询

一.背景 上一篇我们学会了,如何用python自动化爬出交易软件的历史成交明细分笔数据,如果你没看到的话,这里有链接: AI 通过python脚本自动化导出交易软件某一天的分笔成交明细-CSDN博客,我们接着讲如何讲用QT分析这些数据并制成数据库文件来查询。 二.效果图 三.实现步骤 …

【Qt】关于QMenuBar创建方式的讨论

关于QMenuBar创建方式的讨论 如果在创建项目的时候&#xff0c;没有勾选自动生成ui文件&#xff0c;此时上述代码是正确的&#xff1b;而如果勾选了自动生成ui文件&#xff0c;上述代码则会出现内存泄漏的问题。因为Qt已经生成了一个QMenuBar了 由于之前程序已经自己创建好了一…

Mysql基础练习题 1083.销售分析2 (力扣)

编写一个解决方案&#xff0c;报告那些买了 S8 而没有买 iPhone 的 买家。注意&#xff0c;S8 和 iPhone 是 Product 表中显示的产品。 题目连接&#xff1a; https://leetcode.cn/problems/sales-analysis-ii/description/ 建表插入数据&#xff1a; Create table If Not …