STM32CubeMX-H7-12-IIC读写MPU6050模块(中)-MPU6050模块详解以及软件IIC驱动
前言
上一篇我们已经完成对IIC代码基本框架的编写,以及获取MPU6050的ID,接下来我们逐一分析这个模块的功能,并用IIC驱动
建议看完上一篇再来看这篇
MPU6050寄存器介绍
1.电源管理寄存器(PWR_MGMT_1,地址:0x6B)

我们要对0x6b这个地址给0以唤醒
IIC_Write_REG(MPU6050_ADDR_AD0_LOW, PWR_MGMT_1, 0x00); // 唤醒 MPU6050
2.陀螺仪配置寄存器(GYRO_CONFIG,地址:0x1B)

IIC_Write_REG(MPU6050_ADDR_AD0_LOW, GYRO_CONFIG, 0x18); // 设置陀螺仪自检及测量范围
选择满量程为±2000°/s
3.加速度计配置寄存器(ACCEL_CONFIG,地址:0x1C)

IIC_Write_REG(MPU6050_ADDR_AD0_LOW, ACCEL_CONFIG, 0x18); // 设置加速度计自检、测量范围及高通滤波频率
加速度计配置寄存器,选择满量程为±16g
4.加速度计数据寄存器

等会获取加速度的时候会用,主要获取加速度
5.陀螺仪数据寄存器

等会获取角度的时候会用,主要获取角度
6.中断使能寄存器(INT_ENABLE,地址:0x38)

看情况使用
7.采样率分频寄存器(SMPLRT_DIV,地址:0x19)

IIC_Write_REG(MPU6050_ADDR_AD0_LOW, SMPLRT_DIV, 0x09); // 设置采样率分频
8.CONFIG 寄存器主要用于配置 MPU6050 的外部帧同步(FSYNC)引脚输入以及数字低通滤波器(DLPF),以此来改善传感器数据的噪声性能和采样延迟。
| 位 | 名称 | 描述 | 配置效果 |
|---|---|---|---|
| 7 - 3 | 保留 | 这些位为保留位,用户不应进行设置,一般默认置为 0。 | - |
| 2 | EXT_SYNC_SET[2:0] | 用于配置外部帧同步(FSYNC)引脚输入。 - 000:无 FSYNC 输入 - 001:FSYNC 引脚输入同步加速度计采样 - 010:FSYNC 引脚输入同步陀螺仪 X 轴采样 - 011:FSYNC 引脚输入同步陀螺仪 Y 轴采样 - 100:FSYNC 引脚输入同步陀螺仪 Z 轴采样 - 101:FSYNC 引脚输入同步温度传感器采样 - 110:保留 - 111:保留 | 可利用外部信号对特定传感器的采样进行同步,从而保证多个传感器采样时间的一致性。 |
| 1 - 0 | DLPF_CFG[1:0] | 用于配置数字低通滤波器(DLPF)的设置。 - 000:带宽 260Hz,延迟 0.98ms,陀螺仪输出率 8kHz - 001:带宽 184Hz,延迟 2.9ms,陀螺仪输出率 1kHz - 010:带宽 94Hz,延迟 3.9ms,陀螺仪输出率 1kHz - 011:带宽 44Hz,延迟 5.9ms,陀螺仪输出率 1kHz - 100:带宽 21Hz,延迟 9.9ms,陀螺仪输出率 1kHz - 101:带宽 10Hz,延迟 17.85ms,陀螺仪输出率 1kHz - 110:带宽 5Hz,延迟 33.48ms,陀螺仪输出率 1kHz - 111:保留 | 通过选择不同的滤波器配置,可以在噪声抑制和数据延迟之间进行权衡。较高的带宽会减少延迟,但可能会引入更多噪声;较低的带宽则能有效抑制噪声,但会增加数据延迟。 |
MPU6050模块功能指令使用-函数封装
1.指令寄存器的宏定义
#define M_PI 3.14
#define SMPLRT_DIV 0x19 // 采样率分频,典型值:0x07(125Hz) */
#define CONFIG 0x1A // 低通滤波频率,典型值:0x06(5Hz) */
#define GYRO_CONFIG 0x1B // 陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s) */
#define ACCEL_CONFIG 0x1C // 加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz) */#define ACCEL_XOUT_H 0x3B // 存储最近的X轴、Y轴、Z轴加速度感应器的测量值 */
#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 // 存储最近的X轴、Y轴、Z轴陀螺仪感应器的测量值 */
#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 PWR_MGMT_2 0x6C // 电源管理,典型值:0x00(正常启用) */
#define WHO_AM_I 0x75 // IIC地址寄存器(默认数值0x68,只读) */// HAL库的读写只需要使用7位地址
#define MPU6050_ADDR_AD0_LOW 0x68 // AD0低电平时7位地址为0X68 iic写时许发送0XD0
#define MPU6050_ADDR_AD0_HIGH 0x69
2.初始化的基本配置
根据上面的自己配置下寄存器就好
// MPU6050 初始化函数
uint8_t MPU6050_Init(void) {IIC_Init(); // 初始化 I2C 总线// 唤醒 MPU6050IIC_Write_REG(MPU6050_ADDR_AD0_LOW, PWR_MGMT_1, 0x00); HAL_Delay(100); // 等待唤醒// 设置采样率分频IIC_Write_REG(MPU6050_ADDR_AD0_LOW, SMPLRT_DIV, 0x07); // 设置低通滤波器IIC_Write_REG(MPU6050_ADDR_AD0_LOW, CONFIG, 0x06); // 设置陀螺仪量程 ±250°/sIIC_Write_REG(MPU6050_ADDR_AD0_LOW, GYRO_CONFIG, 0x00); // 设置加速度计量程 ±2gIIC_Write_REG(MPU6050_ADDR_AD0_LOW, ACCEL_CONFIG, 0x00); HAL_Delay(100); // 等待传感器稳定return 0;
}
3.获取模块ID
![]()
// 读取 MPU6050 的设备 ID
uint8_t MPU6050_GetDeviceID(void) {uint8_t data;data=IIC_Read_REG(MPU6050_ADDR_AD0_LOW, WHO_AM_I); // 读取设备 ID 寄存器return data; // 返回设备 ID
}
上篇文章提到过,返回设备ID
4.获取温度
float MPU6050_GET_Tempure(void)
{uint16_t temp; // 用于存储温度传感器数据uint8_t H,L; // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, TEMP_OUT_H); // 读取温度传感器高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, TEMP_OUT_L); // 读取温度传感器低字节temp = (H << 8) | L; // 将高字节和低字节合并为一个 16 位数据return (float)temp / 340.0 + 36.53-200; // 计算温度值并返回
}
手册上是没有-200的,但是我的温度都显示两百多,减去200后看起来正常,大家根据具体情况把这个-200修改,补偿值修改到正常
5.获取X轴加速度
float MPU6050_GetAccelX(void) {int16_t accel; // 用于存储加速度传感器数据uint8_t H,L; // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_XOUT_H); // 读取加速度传感器 X 轴高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_XOUT_L); // 读取加速度传感器 X 轴低字节accel = (H << 8) | L; // 将高字节和低字节合并为一个 16 位数据return (float)accel / 16384.0; // 计算加速度值并返回
}
6.获取Y轴加速度
float MPU6050_GetAccelY(void) {int16_t accel; // 用于存储加速度传感器数据uint8_t H,L; // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_YOUT_H); // 读取加速度传感器 Y 轴高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_YOUT_L); // 读取加速度传感器 Y 轴低字节accel = (H << 8) | L; // 将高字节和低字节合并为一个 16 位数据return (float)accel / 16384.0; // 计算加速度值并返回
}
7.获取z轴加速度
float MPU6050_GetAccelZ(void) {int16_t accel; // 用于存储加速度传感器数据uint8_t H,L; // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_ZOUT_H); // 读取加速度传感器 Z 轴高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_ZOUT_L); // 读取加速度传感器 Z 轴低字节accel = (H << 8) | L; // 将高字节和低字节合并为一个 16 位数据return (float)accel / 16384.0; // 计算加速度值并返回
}
8.获取x的角度
float MPU6050_GetAngleX(void) {int16_t gyro; // 用于存储陀螺仪数据uint8_t H,L; // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_XOUT_H); // 读取陀螺仪 X 轴高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_XOUT_L); // 读取陀螺仪 X 轴低字节gyro = (H << 8) | L; // 将高字节和低字节合并为一个 16 位数据return (float)gyro / 131.0; // 计算角速度值并返回
}
9.获取y的角度
float MPU6050_GetAngleY(void) {int16_t gyro; // 用于存储陀螺仪数据uint8_t H,L; // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_YOUT_H); // 读取陀螺仪 Y 轴高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_YOUT_L); // 读取陀螺仪 Y 轴低字节gyro = (H << 8) | L; // 将高字节和低字节合并为一个 16 位数据return (float)gyro / 131.0; // 计算角速度值并返回
}
10.获取z轴角度
float MPU6050_GetAngleZ(void) {int16_t gyro; // 用于存储陀螺仪数据uint8_t H,L; // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_ZOUT_H); // 读取陀螺仪 Z 轴高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_ZOUT_L); // 读取陀螺仪 Z 轴低字节gyro = (H << 8) | L; // 将高字节和低字节合并为一个 16 位数据return (float)gyro / 131.0; // 计算角速度值并返回
}
完整代码
.c
#include "MPU6050.h"
#include "math.h"
#include "SOFT_IIC.h"
#include <stdio.h>
// MPU6050 初始化函数
uint8_t MPU6050_Init(void) {IIC_Init(); // 初始化 I2C 总线// 唤醒 MPU6050IIC_Write_REG(MPU6050_ADDR_AD0_LOW, PWR_MGMT_1, 0x00); HAL_Delay(100); // 等待唤醒// 设置采样率分频IIC_Write_REG(MPU6050_ADDR_AD0_LOW, SMPLRT_DIV, 0x07); // 设置低通滤波器IIC_Write_REG(MPU6050_ADDR_AD0_LOW, CONFIG, 0x06); // 设置陀螺仪量程 ±250°/sIIC_Write_REG(MPU6050_ADDR_AD0_LOW, GYRO_CONFIG, 0x00); // 设置加速度计量程 ±2gIIC_Write_REG(MPU6050_ADDR_AD0_LOW, ACCEL_CONFIG, 0x00); HAL_Delay(100); // 等待传感器稳定return 0;
}// 读取 MPU6050 的设备 ID
uint8_t MPU6050_GetDeviceID(void) {uint8_t data;data=IIC_Read_REG(MPU6050_ADDR_AD0_LOW, WHO_AM_I); // 读取设备 ID 寄存器return data; // 返回设备 ID
}float MPU6050_GET_Tempure(void)
{int16_t temp; // 用于存储温度传感器数据uint8_t H,L; // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, TEMP_OUT_H); // 读取温度传感器高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, TEMP_OUT_L); // 读取温度传感器低字节temp = (H << 8) | L; // 将高字节和低字节合并为一个 16 位数据return (float)temp / 340.0 + 36.53-200; // 计算温度值并返回
}float MPU6050_GetAccelX(void) {int16_t accel; // 用于存储加速度传感器数据uint8_t H,L; // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_XOUT_H); // 读取加速度传感器 X 轴高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_XOUT_L); // 读取加速度传感器 X 轴低字节accel = (H << 8) | L; // 将高字节和低字节合并为一个 16 位数据return (float)accel / 16384.0; // 计算加速度值并返回
}float MPU6050_GetAccelY(void) {int16_t accel; // 用于存储加速度传感器数据uint8_t H,L; // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_YOUT_H); // 读取加速度传感器 Y 轴高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_YOUT_L); // 读取加速度传感器 Y 轴低字节accel = (H << 8) | L; // 将高字节和低字节合并为一个 16 位数据return (float)accel / 16384.0; // 计算加速度值并返回
}float MPU6050_GetAccelZ(void) {int16_t accel; // 用于存储加速度传感器数据uint8_t H,L; // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_ZOUT_H); // 读取加速度传感器 Z 轴高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, ACCEL_ZOUT_L); // 读取加速度传感器 Z 轴低字节accel = (H << 8) | L; // 将高字节和低字节合并为一个 16 位数据return (float)accel / 16384.0; // 计算加速度值并返回
}float MPU6050_GetAngleX(void) {int16_t gyro; // 用于存储陀螺仪数据uint8_t H,L; // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_XOUT_H); // 读取陀螺仪 X 轴高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_XOUT_L); // 读取陀螺仪 X 轴低字节gyro = (H << 8) | L; // 将高字节和低字节合并为一个 16 位数据return (float)gyro / 131.0; // 计算角速度值并返回
}float MPU6050_GetAngleY(void) {int16_t gyro; // 用于存储陀螺仪数据uint8_t H,L; // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_YOUT_H); // 读取陀螺仪 Y 轴高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_YOUT_L); // 读取陀螺仪 Y 轴低字节gyro = (H << 8) | L; // 将高字节和低字节合并为一个 16 位数据return (float)gyro / 131.0; // 计算角速度值并返回
}float MPU6050_GetAngleZ(void) {int16_t gyro; // 用于存储陀螺仪数据uint8_t H,L; // 用于存储高字节和低字节的数据H = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_ZOUT_H); // 读取陀螺仪 Z 轴高字节L = IIC_Read_REG(MPU6050_ADDR_AD0_LOW, GYRO_ZOUT_L); // 读取陀螺仪 Z 轴低字节gyro = (H << 8) | L; // 将高字节和低字节合并为一个 16 位数据return (float)gyro / 131.0; // 计算角速度值并返回
}
.h
#ifndef __MPU6050_H
#define __MPU6050_H#include "main.h"
#define M_PI 3.14
#define SMPLRT_DIV 0x19 // 采样率分频,典型值:0x07(125Hz) */
#define CONFIG 0x1A // 低通滤波频率,典型值:0x06(5Hz) */
#define GYRO_CONFIG 0x1B // 陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s) */
#define ACCEL_CONFIG 0x1C // 加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz) */#define ACCEL_XOUT_H 0x3B // 存储最近的X轴、Y轴、Z轴加速度感应器的测量值 */
#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 // 存储最近的X轴、Y轴、Z轴陀螺仪感应器的测量值 */
#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 PWR_MGMT_2 0x6C // 电源管理,典型值:0x00(正常启用) */
#define WHO_AM_I 0x75 // IIC地址寄存器(默认数值0x68,只读) */// HAL库的读写只需要使用7位地址
#define MPU6050_ADDR_AD0_LOW 0x68 // AD0低电平时7位地址为0X68 iic写时时发送0XD0
#define MPU6050_ADDR_AD0_HIGH 0x69 // 函数声明
uint8_t MPU6050_Init(void);
uint8_t MPU6050_GetDeviceID(void);
float MPU6050_GET_Tempure(void);
float MPU6050_GetAccelX(void);
float MPU6050_GetAccelY(void);
float MPU6050_GetAccelZ(void);
float MPU6050_GetAngleX(void);
float MPU6050_GetAngleY(void);
float MPU6050_GetAngleZ(void);#endif
相关文章:
STM32CubeMX-H7-12-IIC读写MPU6050模块(中)-MPU6050模块详解以及软件IIC驱动
前言 上一篇我们已经完成对IIC代码基本框架的编写,以及获取MPU6050的ID,接下来我们逐一分析这个模块的功能,并用IIC驱动 建议看完上一篇再来看这篇 MPU6050寄存器介绍 1.电源管理寄存器(PWR_MGMT_1,地址:0…...
基于Go语言实现一个网络聊天室(连接Redis版)
基于Go语言和Redis的实时聊天室项目详解 项目概述 在这个项目中,我们实现了一个基于Go语言和Redis的实时聊天室系统。该系统允许用户通过客户端连接到服务器,进行实时聊天,并且支持以下功能: 用户网名注册和验证消息广播和接收…...
深入解析 RocketMQ 中的 BrokerOuterAPI 组件
在 RocketMQ 这一高性能分布式消息队列系统中,BrokerOuterAPI 组件犹如一座桥梁,连接着 Broker 与外部世界,在系统的运行、管理以及与其他组件交互过程中发挥着极为关键的作用。本文将深入探讨 BrokerOuterAPI 组件的内部机制、核心功能以及其…...
make_01_Program_06_:: 是什么功能
在 Makefile 中,:: 是一种特殊的分隔符,用于创建多重规则(multiple rules)。当您使用 :: 定义目标时,您可以为同一个目标指定多个命令或多个依赖关系。每个命令将在构建目标时按顺序执行,不会影响其他命令的…...
springboot2.7.x整合nacos+seata
1、nacos及seata下载地址 Nacos Server 下载 | Nacos 官网 Seata Java Download | Apache Seata 这里的seata版本用2.1.0版本。 2、启动nacos D:\本地-seata-nacos\nacos-server\bin>startup.cmd -m standalone 3、修改seata的conf下的application的内容 这里的数据库…...
为 IDEA 设置管理员权限
IDEA 安装目录 兼容性选择管理员身份运行程序 之后 IDEA 中的操作(包括终端中的操作)都是管理员权限的了...
Apache Doris 2.1.9 版本正式发布
亲爱的社区小伙伴们,Apache Doris 2.1.9 版本已正式发布。2.1.9 版本对湖仓一体、倒排索引、半结构化数据类型、查询优化器、执行引擎、存储管理进行了若干改进优化。欢迎大家下载使用。 官网下载:https://doris.apache.org/download GitHub 下载&…...
单片机学习笔记8.定时器
IAP15W4K58S4定时/计数器结构工作原理 定时器工作方式控制寄存器TMOD 不能进行位寻址,只能对整个寄存器进行赋值 寄存器地址D7D6D5D4D3D2D1D0复位值TMOD89HGATEC/(T低电平有效)M1M0GATEC/(T低电平有效)M1M000000000B D0-D3为T0控制,D4-D7为T1控制 GAT…...
vue3实现markdown预览和编辑
Markdown作为一种轻量级标记语言,已经成为开发者编写文档的首选工具之一。在Vue3项目中集成Markdown编辑和预览功能可以极大地提升内容管理体验。本文将介绍如何使用Vditor这一强大的开源Markdown编辑器在Vue3项目中实现这一功能。 一、Vditor简介 Vditor是一款浏…...
高并发秒杀系统接入层如何设计
博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…...
C++异常处理 throw try catch
C 异常处理概述 C 异常处理机制提供了一种在程序运行时捕获错误或异常情况的方式。异常处理的目的是使得程序在遇到错误时能够优雅地终止或恢复,并防止程序出现崩溃。C 使用 try, throw, 和 catch 关键字来实现异常处理。 异常处理的基本结构: throw: …...
纯css实现环形进度条
需要在中实现一个定制化的环形进度条,最终效果如图: 使用代码 <divclass"circular-progress":style"{--progress: nextProgress,--color: endSliderColor,--size: isFull ? 60rpx : 90rpx,}"><div class"inner-conte…...
0基础 | 硬件 | 电源系统 一
降压电路LDO 几乎所有LDO都是基于此拓扑结构 图 拓扑结构 LDO属于线性电源,通过控制开关管的导通程度实现稳压,输出纹波小,无开关噪声 线性电源,IoutIin,发热功率P电压差△U*电流I,转换效率Vo/Vi LDO不适…...
详解 MySQL 索引的最左前缀匹配原则
MySQL 的最左前缀匹配原则主要是针对复合索引(也称为联合索引)而言的。其核心思想是:只有查询条件中包含索引最左侧(第一列)开始的连续一段列,才能让 MySQL 有效地利用该索引。 一、 复合索引的结构 复合…...
蓝桥杯算法题1
前言 双指针 唯一的雪花 Unique Snowflakes #include<iostream> #include<unordered_map> using namespace std; //这道题的意思就是在一个数组找一个最大的1区间的长度,这个区间里面没有重复数据 //如果暴力解法,每次求出以a[i]开头的满…...
【愚公系列】《高效使用DeepSeek》053-工艺参数调优
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...
Cortex-M系列MCU的位带操作
Cortex-M系列位带操作详解 位带(Bit-Banding)是Cortex-M3/M4等处理器提供的一种硬件特性,允许通过别名地址对内存或外设寄存器中的单个位进行原子读-改-写操作,无需禁用中断或使用互斥锁。以下是位带操作的完整指南: …...
大坑!GaussDB数据库批量插入数据变只读
大坑!GaussDB数据库批量插入数据变只读 GaussDB插入数据时变只读df和du为什么不一致GaussDB磁盘空间使用阈值GaussDB变只读怎么办正确删除表的姿势GaussDB插入数据时变只读 涉及的数据库版本为:GaussDB Kernel 505.1.0 build da28c417。 GuassDB TPCC灌数报错DML失败,数据…...
35信号和槽_信号槽小结
Qt 信号槽 1.信号槽是啥~~ 尤其是和 Linux 中的信号进行了对比(三要素) 1) 信号源 2) 信号的类型 3)信号的处理方式 2.信号槽 使用 connect 3.如何查阅文档. 一个控件,内置了哪些信号,信号都是何时触发 一…...
获取KUKA机器人诊断文件KRCdiag的方法
有时候在进行售后问题时需要获取KUKA机器人的诊断文件KRCdiag,通过以下方法可以获取KUKA机器人的诊断文件KRCdiag: 1、将U盘插到控制柜内的任意一个USB接口; 2、依次点【主菜单】—【文件】—【存档】—【USB(控制柜)…...
一周学会Pandas2 Python数据处理与分析-NumPy数据类型
锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili NumPy 提供了丰富的数据类型(dtypes),主要用于高效数值计算。以下是 NumPy 的主要…...
Redis核心机制-缓存、分布式锁
目录 缓存 缓存更新策略 定期生成 实时生成 缓存问题 缓存预热(Cache preheating) 缓存穿透(Cache penetration) 缓存雪崩(Cache avalanche) 缓存击穿(Cache breakdown) 分…...
Three.js 系列专题 1:入门与基础
什么是 Three.js? Three.js 是一个基于 WebGL 的 JavaScript 库,它简化了 3D 图形编程,让开发者无需深入了解底层 WebGL API 就能创建复杂的 3D 场景。它广泛应用于网页游戏、可视化、虚拟现实等领域。 学习目标 理解 Three.js 的核心组件:场景(Scene)、相机(Camera)…...
[C++面试] 如何在特定内存位置上分配内存、构造对象
new面试-高阶题(可以主动讲给面试官),适用于内存池、高性能场景或需要精确控制内存布局的编程需求。 一、核心方法:placement new placement new 是C中一种特殊形式的new运算符,允许在预先分配好的内存地址上构造对象…...
针对Ansible执行脚本时报错“可执行文件格式错误”,以下是详细的解决步骤和示例
针对Ansible执行脚本时报错“可执行文件格式错误”,以下是详细的解决步骤和示例: 目录 一、错误原因分析二、解决方案1. 检查并添加可执行权限2. 修复Shebang行3. 转换文件格式(Windows → Unix)4. 检查脚本内容兼容性5. 显式指定…...
如何在Ubuntu上安装Dify
如何在Ubuntu上安装Dify 如何在Ubuntu上安装docker 使用apt安装 # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg…...
Python FastApi(13):APIRouter
如果你正在开发一个应用程序或 Web API,很少会将所有的内容都放在一个文件中。FastAPI 提供了一个方便的工具,可以在保持所有灵活性的同时构建你的应用程序。假设你的文件结构如下: . ├── app # 「app」是一个 Python 包…...
Harmony OS“一多” 详解:基于窗口变化的断点自适应实现
一、一多开发核心概念(18N模式) 目标:一次开发多端部署 解决的问题: 1、界面级一多:适配不同屏幕尺寸 2、功能级一多:设备功能兼容性处理(CanIUser) 3、工…...
【算法竞赛】状态压缩型背包问题经典应用(蓝桥杯2019A4分糖果)
在蓝桥杯中遇到的这道题,看上去比较普通,但其实蕴含了很巧妙的“状态压缩 背包”的思想,本文将从零到一,详细解析这个问题。 目录 一、题目 二、思路分析:状态压缩 最小覆盖 1. 本质:最小集合覆盖问题…...
kali——masscan
目录 前言 使用方法 前言 Masscan 是一款快速的端口扫描工具,在 Kali Linux 系统中常被用于网络安全评估和渗透测试。 使用方法 对单个IP进行端口扫描: masscan -p11-65535 192.168.238.131 扫描指定端口: masscan -p80,22 192.168.238.131…...
