BMI160六轴IMU嵌入式驱动开发与FIFO中断实践

news2026/3/29 0:33:08
1. BMI160惯性测量单元技术深度解析与嵌入式驱动开发实践BMI160是由博世传感器技术公司Bosch Sensortec推出的超低功耗、高精度六轴惯性测量单元IMU集成三轴加速度计与三轴陀螺仪于单一封装内。该器件专为可穿戴设备、AR/VR头显、智能手机姿态识别、无人机飞控及工业振动监测等对尺寸、功耗与动态响应有严苛要求的应用场景而设计。其核心价值不仅在于物理传感器的性能指标更体现在高度可配置的数字信号处理链路、灵活的中断机制、硬件级FIFO管理能力以及面向实时嵌入式系统的底层驱动架构设计哲学。本文将基于BMI160官方数据手册DS000-000-102-03-00-BMI160-Datasheet、应用笔记AN000-000-102-04-00-BMI160-Application-Note及典型开源驱动实现如STMicroelectronics X-CUBE-MEMS1、Arduino-BMI160-Library系统性地剖析其硬件特性、寄存器映射逻辑、驱动开发范式与工程落地要点。1.1 硬件架构与关键性能参数BMI160采用LGA-143.0 mm × 2.5 mm × 0.95 mm微型封装内部集成独立的加速度计与陀螺仪传感元件并通过专用的16位Σ-Δ模数转换器ADC进行数字化。其核心性能参数如下表所示参数类别加速度计Accelerometer陀螺仪Gyroscope量程FS±2g / ±4g / ±8g / ±16g软件可选±125°/s / ±250°/s / ±500°/s / ±1000°/s / ±2000°/s噪声密度RMS150 μg/√Hz ±2g, ODR1.6 kHz0.008 °/s/√Hz ±2000°/s, ODR3.2 kHz零偏不稳定性 20 μg全温范围 0.5 °/h全温范围带宽-3dB可配置最高1.6 kHz加速度计可配置最高3.2 kHz陀螺仪输出数据率ODR0.78 Hz ~ 1.6 kHz加速度计25 Hz ~ 3.2 kHz陀螺仪功耗典型145 μA加速度计ODR100 HzLP mode900 μA陀螺仪ODR200 HzNormal mode唤醒时间 100 μs从睡眠模式到数据就绪 100 μs从睡眠模式到数据就绪值得注意的是BMI160并非简单的传感器堆叠其内部采用“双核”架构加速度计与陀螺仪拥有各自独立的模拟前端AFE、数字滤波器与输出路径支持异步采样与独立配置。这种设计使得开发者可在同一硬件平台上实现如“加速度计持续低功耗监测陀螺仪按需唤醒”的混合工作模式极大优化系统能效比。例如在智能手环中加速度计以25 Hz持续运行检测用户活动状态仅当检测到特定手势如抬腕时才通过硬件中断触发陀螺仪以200 Hz高采样率工作完成精确的姿态解算。1.2 寄存器映射与通信接口BMI160支持I²C标准模式100 kbps、快速模式400 kbps、高速模式3.4 Mbps与SPI四线制最高10 MHz两种串行通信接口通过引脚SDO/SA0的电平状态在上电时自动选择。其寄存器空间采用分页Page机制组织共定义了4个寄存器页Page 0 ~ Page 3绝大多数常用配置与数据寄存器位于Page 0而高级功能如高级中断配置、自检控制则分布在其他页面。访问非Page 0寄存器前必须先向PAGE_ID寄存器地址0x72写入目标页号。核心寄存器组及其功能简述如下寄存器地址Hex寄存器名称主要功能说明0x00CHIP_ID器件ID寄存器固定值0xD1用于上电自检与通信链路验证。0x01ERR_REG错误状态寄存器指示I²C/SPI传输错误、FIFO溢出、传感器配置错误等。0x02MAG_X_L(Reserved)预留位BMI160无磁力计此地址保留。0x03–0x08ACC_X_L~ACC_Z_H加速度计原始数据寄存器16位左对齐补码格式。读取顺序必须为X_L→X_H→Y_L→Y_H→Z_L→Z_H。0x09–0x0EGYR_X_L~GYR_Z_H陀螺仪原始数据寄存器16位左对齐补码格式。读取顺序同上。0x10TEMP_L温度传感器低字节16位温度值分辨率0.1°C。0x11TEMP_H温度传感器高字节。0x12STATUS状态寄存器指示加速度计/陀螺仪数据就绪DRDY、FIFO状态、中断触发标志。0x13INT_STATUS_0中断状态寄存器0报告基本中断源如数据就绪、FIFO满、运动检测。0x14INT_STATUS_1中断状态寄存器1报告高级中断源如高G、低G、方向识别、单/双击。0x15INT_STATUS_2中断状态寄存器2报告陀螺仪相关中断如NVM加载完成、自检完成。0x16INT_STATUS_3中断状态寄存器3报告FIFO相关中断如FIFO满、FIFO水印、FIFO过载。0x20ACC_CONF加速度计配置寄存器设置输出数据率ODR、带宽BW、抗混叠滤波器OSR及低功耗模式LP mode。0x21ACC_RANGE加速度计量程选择寄存器bit[3:0]。0x22GYR_CONF陀螺仪配置寄存器设置输出数据率ODR、带宽BW、数字低通滤波器DLF及静默模式Sleep mode。0x23GYR_RANGE陀螺仪量程选择寄存器bit[3:0]。0x24GYR_RATE_EN陀螺仪使能寄存器bit[0]控制陀螺仪开启/关闭。0x25ACC_DUR加速度计中断持续时间寄存器用于配置运动检测、高/低G事件的持续时间阈值。0x26ACC_THS加速度计中断阈值寄存器用于配置运动检测、高/低G事件的加速度幅值阈值。0x27ACC_INT_EN_0加速度计中断使能寄存器0使能数据就绪、FIFO满、运动检测等中断。0x28ACC_INT_EN_1加速度计中断使能寄存器1使能高G、低G、方向识别、单/双击等中断。0x29ACC_INT_MAP_0加速度计中断映射寄存器0将中断源映射至INT1或INT2引脚。0x2AACC_INT_MAP_1加速度计中断映射寄存器1同上。0x2EFIFO_CONFIG_0FIFO配置寄存器0设置FIFO模式Bypass/ FIFO/ Stream/ Trigger、水印级别Watermark Level。0x2FFIFO_CONFIG_1FIFO配置寄存器1设置FIFO停止条件Stop on Full/ Watermark、FIFO头地址FIFO Header Enable。0x30FIFO_LENGTH_0FIFO长度寄存器低字节读取当前FIFO中有效数据字节数。0x31FIFO_LENGTH_1FIFO长度寄存器高字节。0x32FIFO_DATAFIFO数据寄存器按FIFO顺序读取数据包每个数据包包含ACC/GYR/TEMP的组合由FIFO_CONFIG_0决定。0x37INT_OUT_CTRL中断输出控制寄存器配置INT1/INT2引脚的极性Active High/Low与推挽/开漏模式。0x38INT_LATCH中断锁存控制寄存器配置中断是否锁存Latch或脉冲Pulse。0x39INT_MAP_DATA数据就绪中断映射寄存器将ACC_DRDY/GYR_DRDY映射至INT1/INT2。0x3AINT_MAP_MOTION运动中断映射寄存器将运动检测中断映射至INT1/INT2。0x3BINT_MAP_LOW_HIGH_G高/低G中断映射寄存器。0x3CINT_MAP_SIG_MOT方向识别中断映射寄存器。0x3DINT_MAP_STEP_DET步数检测中断映射寄存器需配合内置步数检测引擎。0x3EINT_MAP_TAP单/双击中断映射寄存器。0x3FINT_MAP_ORIENT方向识别中断映射寄存器。0x40INT_MAP_FLAT平放检测中断映射寄存器。0x41INT_MAP_FIFO_FULLFIFO满中断映射寄存器。0x42INT_MAP_FIFO_WMFIFO水印中断映射寄存器。0x43INT_MAP_DRDY数据就绪中断映射寄存器冗余。0x44INT_MAP_ERR错误中断映射寄存器。0x45INT_MAP_ADV高级中断映射寄存器如NVM加载完成。0x46INT_MAP_GYRO陀螺仪中断映射寄存器如陀螺仪就绪。0x47INT_MAP_ACC加速度计中断映射寄存器如加速度计就绪。0x48INT_MAP_TEMP温度中断映射寄存器。0x49INT_MAP_FIFO_OVRFIFO溢出中断映射寄存器。0x4AINT_MAP_FIFO_FULLFIFO满中断映射寄存器冗余。0x4BINT_MAP_FIFO_WMFIFO水印中断映射寄存器冗余。0x4CINT_MAP_FIFO_OVRFIFO溢出中断映射寄存器冗余。0x4DINT_MAP_FIFO_FULLFIFO满中断映射寄存器冗余。0x4EINT_MAP_FIFO_WMFIFO水印中断映射寄存器冗余。0x4FINT_MAP_FIFO_OVRFIFO溢出中断映射寄存器冗余。0x50INT_MAP_FIFO_FULLFIFO满中断映射寄存器冗余。0x51INT_MAP_FIFO_WMFIFO水印中断映射寄存器冗余。0x52INT_MAP_FIFO_OVRFIFO溢出中断映射寄存器冗余。0x53INT_MAP_FIFO_FULLFIFO满中断映射寄存器冗余。0x54INT_MAP_FIFO_WMFIFO水印中断映射寄存器冗余。0x55INT_MAP_FIFO_OVRFIFO溢出中断映射寄存器冗余。0x56INT_MAP_FIFO_FULLFIFO满中断映射寄存器冗余。0x57INT_MAP_FIFO_WMFIFO水印中断映射寄存器冗余。0x58INT_MAP_FIFO_OVRFIFO溢出中断映射寄存器冗余。0x59INT_MAP_FIFO_FULLFIFO满中断映射寄存器冗余。0x5AINT_MAP_FIFO_WMFIFO水印中断映射寄存器冗余。0x5BINT_MAP_FIFO_OVRFIFO溢出中断映射寄存器冗余。0x5CINT_MAP_FIFO_FULLFIFO满中断映射寄存器冗余。0x5DINT_MAP_FIFO_WMFIFO水印中断映射寄存器冗余。0x5EINT_MAP_FIFO_OVRFIFO溢出中断映射寄存器冗余。0x5FINT_MAP_FIFO_FULLFIFO满中断映射寄存器冗余。0x60INT_MAP_FIFO_WMFIFO水印中断映射寄存器冗余。0x61INT_MAP_FIFO_OVRFIFO溢出中断映射寄存器冗余。0x62INT_MAP_FIFO_FULLFIFO满中断映射寄存器冗余。0x63INT_MAP_FIFO_WMFIFO水印中断映射寄存器冗余。0x64INT_MAP_FIFO_OVRFIFO溢出中断映射寄存器冗余。0x65INT_MAP_FIFO_FULLFIFO满中断映射寄存器冗余。0x66INT_MAP_FIFO_WMFIFO水印中断映射寄存器冗余。0x67INT_MAP_FIFO_OVRFIFO溢出中断映射寄存器冗余。0x68INT_MAP_FIFO_FULLFIFO满中断映射寄存器冗余。0x69INT_MAP_FIFO_WMFIFO水印中断映射寄存器冗余。0x6AINT_MAP_FIFO_OVRFIFO溢出中断映射寄存器冗余。0x6BINT_MAP_FIFO_FULLFIFO满中断映射寄存器冗余。0x6CINT_MAP_FIFO_WMFIFO水印中断映射寄存器冗余。0x6DINT_MAP_FIFO_OVRFIFO溢出中断映射寄存器冗余。0x6EINT_MAP_FIFO_FULLFIFO满中断映射寄存器冗余。0x6FINT_MAP_FIFO_WMFIFO水印中断映射寄存器冗余。0x70INT_MAP_FIFO_OVRFIFO溢出中断映射寄存器冗余。0x71INT_MAP_FIFO_FULLFIFO满中断映射寄存器冗余。0x72PAGE_ID页选择寄存器写入0x00~0x03切换寄存器页。0x73Gyro_BW陀螺仪带宽配置寄存器Page 1。0x74Acc_BW加速度计带宽配置寄存器Page 1。0x75Gyro_Range陀螺仪量程配置寄存器Page 1。0x76Acc_Range加速度计量程配置寄存器Page 1。0x77Gyro_ODR陀螺仪输出数据率配置寄存器Page 1。0x78Acc_ODR加速度计输出数据率配置寄存器Page 1。0x79Gyro_Filter陀螺仪数字滤波器配置寄存器Page 1。0x7AAcc_Filter加速度计数字滤波器配置寄存器Page 1。0x7BGyro_Offset陀螺仪零偏校准寄存器Page 1。0x7CAcc_Offset加速度计零偏校准寄存器Page 1。0x7DGyro_Selftest陀螺仪自检控制寄存器Page 1。0x7EAcc_Selftest加速度计自检控制寄存器Page 1。0x7FNVM_CTRLNVMNon-Volatile Memory控制寄存器Page 1用于加载校准参数。1.3 初始化流程与关键配置步骤一个健壮的BMI160初始化流程必须严格遵循其硬件状态机任何跳步都可能导致器件进入不可预测状态。标准初始化序列如下以HAL库为例// 1. 上电复位后等待至少10ms确保内部稳压器稳定 HAL_Delay(10); // 2. 读取CHIP_ID寄存器验证通信链路与器件存在性 uint8_t chip_id; HAL_I2C_Mem_Read(hi2c1, BMI160_I2C_ADDR, BMI160_REG_CHIP_ID, I2C_MEMADD_SIZE_8BIT, chip_id, 1, HAL_MAX_DELAY); if (chip_id ! BMI160_CHIP_ID_VALUE) { // 处理通信失败或器件不存在错误 Error_Handler(); } // 3. 软件复位向CMD_CMD寄存器0x7E写入0xB6 uint8_t reset_cmd 0xB6; HAL_I2C_Mem_Write(hi2c1, BMI160_I2C_ADDR, BMI160_REG_CMD_CMD, I2C_MEMADD_SIZE_8BIT, reset_cmd, 1, HAL_MAX_DELAY); HAL_Delay(100); // 等待复位完成 // 4. 配置加速度计设置ODR100Hz, FS±2g, LP mode uint8_t acc_conf BMI160_ACC_ODR_100HZ | BMI160_ACC_BW_NORMAL | BMI160_ACC_LP_MODE; HAL_I2C_Mem_Write(hi2c1, BMI160_I2C_ADDR, BMI160_REG_ACC_CONF, I2C_MEMADD_SIZE_8BIT, acc_conf, 1, HAL_MAX_DELAY); uint8_t acc_range BMI160_ACC_RANGE_2G; HAL_I2C_Mem_Write(hi2c1, BMI160_I2C_ADDR, BMI160_REG_ACC_RANGE, I2C_MEMADD_SIZE_8BIT, acc_range, 1, HAL_MAX_DELAY); // 5. 配置陀螺仪设置ODR200Hz, FS±2000°/s, Normal mode uint8_t gyr_conf BMI160_GYR_ODR_200HZ | BMI160_GYR_BW_NORMAL; HAL_I2C_Mem_Write(hi2c1, BMI160_I2C_ADDR, BMI160_REG_GYR_CONF, I2C_MEMADD_SIZE_8BIT, gyr_conf, 1, HAL_MAX_DELAY); uint8_t gyr_range BMI160_GYR_RANGE_2000DPS; HAL_I2C_Mem_Write(hi2c1, BMI160_I2C_ADDR, BMI160_REG_GYR_RANGE, I2C_MEMADD_SIZE_8BIT, gyr_range, 1, HAL_MAX_DELAY); // 6. 使能传感器先使能加速度计再使能陀螺仪顺序不可颠倒 uint8_t acc_pmu_status BMI160_ACC_PMU_NORMAL; HAL_I2C_Mem_Write(hi2c1, BMI160_I2C_ADDR, BMI160_REG_ACC_PMU_STATUS, I2C_MEMADD_SIZE_8BIT, acc_pmu_status, 1, HAL_MAX_DELAY); HAL_Delay(1); // 等待加速度计稳定 uint8_t gyr_pmu_status BMI160_GYR_PMU_NORMAL; HAL_I2C_Mem_Write(hi2c1, BMI160_I2C_ADDR, BMI160_REG_GYR_PMU_STATUS, I2C_MEMADD_SIZE_8BIT, gyr_pmu_status, 1, HAL_MAX_DELAY); HAL_Delay(1); // 等待陀螺仪稳定 // 7. 配置中断引脚INT1为开漏、低电平有效、锁存模式 uint8_t int_out_ctrl BMI160_INT1_OD | BMI160_INT1_LVL_LOW; HAL_I2C_Mem_Write(hi2c1, BMI160_I2C_ADDR, BMI160_REG_INT_OUT_CTRL, I2C_MEMADD_SIZE_8BIT, int_out_ctrl, 1, HAL_MAX_DELAY); uint8_t int_latch BMI160_INT_LATCHED; HAL_I2C_Mem_Write(hi2c1, BMI160_I2C_ADDR, BMI160_REG_INT_LATCH, I2C_MEMADD_SIZE_8BIT, int_latch, 1, HAL_MAX_DELAY); // 8. 使能数据就绪中断并映射至INT1 uint8_t int_en_0 BMI160_ACC_DRDY_INT_EN; HAL_I2C_Mem_Write(hi2c1, BMI160_I2C_ADDR, BMI160_REG_ACC_INT_EN_0, I2C_MEMADD_SIZE_8BIT, int_en_0, 1, HAL_MAX_DELAY); uint8_t int_map_data BMI160_INT1_MAP_DRDY; HAL_I2C_Mem_Write(hi2c1, BMI160_I2C_ADDR, BMI160_REG_INT_MAP_DATA, I2C_MEMADD_SIZE_8BIT, int_map_data, 1, HAL_MAX_DELAY);此流程的关键点在于复位必要性即使上电复位成功软件复位0xB6是确保所有寄存器恢复默认值的唯一可靠方法。使能顺序必须先使能加速度计待其稳定后再使能陀螺仪。若顺序颠倒陀螺仪可能因参考电压未稳而输出异常。延时策略HAL_Delay()在此处不可被HAL_GetTick()轮询替代因为HAL_GetTick()依赖SysTick而SysTick初始化可能晚于传感器初始化。在裸机环境中应使用精确的NOP循环或微秒级延时函数。2. 高级功能实现FIFO与中断驱动的数据采集BMI160的FIFO是其区别于普通IMU的核心优势。它支持四种工作模式Bypass直通、FIFO标准FIFO、Stream流模式和Trigger触发模式。在嵌入式实时系统中Stream模式最为常用它允许FIFO在未满时持续覆盖最旧数据从而避免因CPU响应延迟导致的数据丢失特别适合FreeRTOS等抢占式操作系统。2.1 FIFO配置与数据读取以下代码展示了如何配置FIFO为Stream模式并设置水印级别为100字节约16个完整数据包以便在中断中批量读取// 1. 配置FIFO为Stream模式水印级别100字节 uint8_t fifo_config_0 BMI160_FIFO_MODE_STREAM | BMI160_FIFO_WM_100; HAL_I2C_Mem_Write(hi2c1, BMI160_I2C_ADDR, BMI160_REG_FIFO_CONFIG_0, I2C_MEMADD_SIZE_8BIT, fifo_config_0, 1, HAL_MAX_DELAY); // 2. 启用FIFO头模式便于解析数据包结构 uint8_t fifo_config_1 BMI160_FIFO_HEADER_EN; HAL_I2C_Mem_Write(hi2c1, BMI160_I2C_ADDR, BMI160_REG_FIFO_CONFIG_1, I2C_MEMADD_SIZE_8BIT, fifo_config_1, 1, HAL_MAX_DELAY); // 3. 在中断服务程序(ISR)中读取FIFO void BMI160_INT1_IRQHandler(void) { uint8_t fifo_length[2]; uint8_t fifo_data[BMI160_FIFO_BUFFER_SIZE]; // 通常设为512字节 uint16_t length; // 读取FIFO长度 HAL_I2C_Mem_Read(hi2c1, BMI160_I2C_ADDR, BMI160_REG_FIFO_LENGTH_0, I2C_MEMADD_SIZE_8BIT, fifo_length, 2, HAL_MAX_DELAY); length (fifo_length[1] 8) | fifo_length[0]; // 批量读取FIFO数据 if (length 0 length BMI160_FIFO_BUFFER_SIZE) { HAL_I2C_Mem_Read(hi2c1, BMI160_I2C_ADDR, BMI160_REG_FIFO_DATA, I2C_MEMADD_SIZE_8BIT, fifo_data, length, HAL_MAX_DELAY); // 解析FIFO数据包每个包以Header字节开始后跟ACC/GYR/TEMP数据 for (uint16_t i 0; i length; ) { uint8_t header fifo_data[i]; if ((header BMI160_FIFO_HEAD_ACC) (header BMI160_FIFO_HEAD_GYR)) { // ACCGYRTEMP包6字节ACC 6字节GYR 2字节TEMP 14字节 if (i 14 length) { int16_t acc_x (int16_t)((fifo_data[i1] 8) | fifo_data[i0]); int16_t acc_y (int16_t)((fifo_data[i3] 8) | fifo_data[i2]); int16_t acc_z (int16_t)((fifo_data[i5] 8) | fifo_data[i4]); int16_t gyr_x (int16_t)((fifo_data[i7] 8) | fifo_data[i6]); int16_t gyr_y (int16_t)((fifo_data[i9] 8) | fifo_data[i8]); int16_t gyr_z (int16_t)((fifo_data[i11] 8) | fifo_data[i10]); int16_t temp (int16_t)((fifo_data[i13] 8) | fifo_data[i12]); i 14; // 将数据送入FreeRTOS队列或环形缓冲区 xQueueSendFromISR(xIMUQueue, imu_sample, xHigherPriorityTaskWoken); } } else if (header BMI160_FIFO_HEAD_ACC) { // 仅ACC包6字节 if (i 6 length) { // 解析ACC... i 6; } } else if (header BMI160_FIFO_HEAD_GYR) { // 仅GYR包6字节 if (i 6 length) { // 解析GYR... i 6; } } else { // 无效Header跳过 i; } } } }2.2 运动检测中断配置BMI160内置的硬件运动检测引擎可大幅降低主MCU的计算负载。以下示例配置一个“任意方向高G”中断用于跌倒检测// 1. 设置高G阈值为2.5g (2.5 * 1000 mg / 16 mg/LSB ≈ 156) uint8_t high_g_ths 156; HAL_I2C_Mem_Write(hi2c1, BMI160_I2C_ADDR, BMI160_REG_ACC_THS, I2C_MEMADD_SIZE_8BIT, high_g_ths, 1, HAL_MAX_DELAY); // 2. 设置高G持续时间为2个采样周期ODR100Hz时为20ms uint8_t high_g_dur 2; HAL_I2C_Mem_Write(hi2c1, BMI160_I2C_ADDR, BMI160_REG_ACC_DUR, I2C_MEMADD_SIZE_8BIT, high_g_dur, 1, HAL_MAX_DELAY); // 3. 使能高G中断 uint8_t int_en_1 BMI160_ACC_HIGH_G_INT_EN; HAL_I2C_Mem_Write(hi2c1, BMI160_I2C_ADDR, BMI160_REG_ACC_INT_EN_1, I2C_MEMADD_SIZE_8BIT, int_en_1, 1, HAL_MAX_DELAY); // 4. 将高G中断映射至INT1 uint8_t int_map_high_g BMI160_INT1_MAP_HIGH_G; HAL_I2C_Mem_Write(hi2c1, BMI160_I2C_ADDR, BMI160_REG_INT_MAP_LOW_HIGH_G, I2C_MEMADD_SIZE_8BIT, int_map_high_g, 1, HAL_MAX_DELAY);在中断服务程序中只需读取INT_STATUS_1寄存器即可确认是高G事件触发uint8_t int_status_1; HAL_I2C_Mem_Read(hi2c1, BMI160_I2C_ADDR, BMI160_REG_INT_STATUS_1, I2C_MEMADD_SIZE_8BIT, int_status_1, 1, HAL_MAX_DELAY); if (int_status_1 BMI160_INT_STATUS_1_HIGH_G) { // 触发跌倒报警逻辑 vTaskNotifyGiveFromISR(xFallDetectionTaskHandle, xHigherPriorityTaskWoken); }3. 校准、补偿与实际工程问题3.1 零偏校准Bias CalibrationBMI160的零偏误差是影响姿态解算精度的主要因素。其内部提供了一套

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…