- 嵌入式
- 固件
- 驱动开发
- 硬件开发
【免费下载链接】Arduino_Core_STM32
STM32 core support for Arduino
本篇技术指南以 docs/libraries/dedicated/LSM6DSL.md 为核心,系统讲解 STMicroelectronics 的 LSM6DSL 三轴加速度计 + 三轴陀螺仪在 Arduino_Core_STM32 生态中的专用驱动库:从构造对象、启停传感器、读取原始/换算数据、配置输出数据率(ODR)与量程(FS),到跌落、计步、倾斜、唤醒、单击/双击、6D 方向等硬件事件检测的完整 API。阅读完本文后,你将能够在 STM32(尤其是 B-L475E-IOT01A、B-L4S5I-IOT01A 等 Discovery IoT 板)上独立完成基于 LSM6DSL 的运动感知应用开发。
一、LSM6DSL 库在 STM32 生态中的定位
LSM6DSL 是 ST 推出的一款低功耗、高精度的 iNEMO 惯性模块,内部集成 3D 加速度计与 3D 陀螺仪,常用于姿态估计、计步、跌落检测、屏幕方向切换等移动与可穿戴场景。在 docs/libraries/index.md 的"STM32 dedicated libraries"列表中,LSM6DSL 被归类为专用(Dedicated)驱动库:LSM6DSL: to support the LSM6DSL 3D accelerometer and 3D gyroscope,与 HTS221(温湿度)、LIS3MDL(磁力计)、LPS22HB(气压计)、VL53L0X(ToF 测距)等同属一个专为 STM32 开发板优化的传感器驱动集合。
与标准 Arduino 库不同,这类专用库默认直接依赖 STM32 核心自带的 Wire(I2C)实现,文档中的 [!NOTE] 明确说明:This library uses the Wire library presents in the STM32 core by default。在 libraries/Wire/src 中可以找到该核心级 I2C 库的实现,这意味着你无需额外安装任何 I2C 依赖,只要在 Arduino IDE 或 PlatformIO 中安装 Arduino_Core_STM32 核心,即可通过Wire对象与 LSM6DSL 通信。
典型硬件平台
该库的示例均面向 ST Discovery IoT 系列开发板命名(DISCO_IOT_*),对应的开发板在核心的 boards.txt 中有明确定义:
B_L475E_IOT01A:基于 STM32L475VG(boards.txt),build.variant=STM32L4xx/L475V(C-E-G)T_L476V(C-E-G)T_L486VGT;B_L4S5I_IOT01A:基于 STM32L4S5VI(boards.txt),build.variant=STM32L4xx/L4R5V(G-I)T_L4R7VIT_L4S5VIT_L4S7VIT。
这两款板卡也出现在 docs/supported-boards/index.md 的支持列表中。在板级变体文件 variants/STM32L4xx/L475V(C-E-G)T_L476V(C-E-G)T_L486VGT/PeripheralPins_B_L475E_IOT01A.cT_L476V(C-E-G)T_L486VGT/PeripheralPins_B_L475E_IOT01A.c#L86-L104) 中可以看到,板载传感器挂载在内部 I2C2 总线上(INTERNAL-I2C2_SDA= PB_11、INTERNAL-I2C2_SCL= PB_10),而 Arduino 排针的 D14/D15(I2C1:PB_9/PB_8)被保留给外部 I2C 设备。因此在该板上驱动 LSM6DSL 时,构造函数通常传入内部 I2C 总线实例。
二、类构造与基础控制 API
构造函数
LSM6DSLSensor(TwoWire*, uint8_t)| 参数 | 说明 |
|---|---|
TwoWire* | 指向 I2C 实例的指针(来自 STM32 核心的 Wire 库),必选 |
uint8_t | (可选)器件实例的 I2C 地址,省略时使用库默认地址 |
典型用法:
#include <LSM6DSLSensor.h> #include <Wire.h> LSM6DSLSensor LSM6DSL(&Wire); // 使用默认地址 // 或 LSM6DSLSensor LSM6DSL(&Wire, LSM6DSL_I2C_ADDR); // 显式指定地址LSM6DSL 的标准 I2C 地址取决于 SA0 引脚电平,库内部为支持该器件提供了默认地址常量,并可通过第二个参数覆盖。
传感器使能与关闭
| API | 作用 |
|---|---|
Enable_X() | 使能加速度计 |
Enable_G() | 使能陀螺仪 |
Disable_X() | 关闭加速度计 |
Disable_G() | 关闭陀螺仪 |
这组方法通过操作器件控制寄存器中的对应使能位来开启或关闭两条测量通道。所有方法返回LSM6DSL_STATUS_OK表示成功,否则返回错误码。
器件识别
ReadID(uint8_t*)将器件 ID(WHO_AM_I 寄存器内容)读入用户提供的指针。LSM6DSL 的 WHO_AM_I 固定值为0x6A,在初始化阶段调用ReadID并比对期望值,是确认 I2C 总线连接正确、器件应答正常的最常用手段。
三、数据读取 API
轴数据(物理量)
| API | 说明 |
|---|---|
Get_X_Axes(int32_t*) | 读取加速度计三轴数据(带符号整型) |
Get_G_Axes(int32_t*) | 读取陀螺仪三轴数据(带符号整型) |
参数为长度至少 3 的int32_t数组指针,调用后data[0]、data[1]、data[2]分别存放 X、Y、Z 轴数据。
原始寄存器数据
| API | 说明 |
|---|---|
Get_X_AxesRaw(float*) | 读取加速度计三轴原始数据(float 数组) |
Get_G_AxesRaw(float*) | 读取陀螺仪三轴原始数据(float 数组) |
灵敏度
| API | 说明 |
|---|---|
Get_X_Sensitivity(float*) | 读取加速度计当前灵敏度 |
Get_G_Sensitivity(float*) | 读取陀螺仪当前灵敏度 |
灵敏度数值与当前配置的量程(Full Scale)直接相关,用于将原始 LSB 计数值换算为带物理单位的加速度(g)或角速度(mdps/°/s)。
一个典型的读取并换算流程可以概括为:
int32_t x_axes[3]; LSM6DSL.Get_X_Axes(x_axes); // 读取加速度计轴数据 LSM6DSL.Get_G_Axes(g_axes); // 读取陀螺仪轴数据四、输出数据率(ODR)与量程(FS)配置
ODR:输出数据率
| API | 说明 |
|---|---|
Get_X_ODR(float*) | 读取加速度计输出数据率 |
Get_G_ODR(float*) | 读取陀螺仪输出数据率 |
Set_X_ODR(float) | 设置加速度计输出数据率 |
Set_G_ODR(float) | 设置陀螺仪输出数据率 |
ODR 决定传感器向主机输出数据的刷新频率。LSM6DSL 支持多档 ODR(如 1.6Hz ~ 6.66kHz 区间内的多档可选值),实际可用的档位以器件数据手册为准;传入不支持的数值时,库内部会将其映射/校验到合法档位。ODR 越高,数据更新越频繁、功耗越大。
FS:量程(Full Scale)
| API | 说明 |
|---|---|
Get_X_FS(float*) | 读取加速度计量程 |
Get_G_FS(float*) | 读取陀螺仪量程 |
Set_X_FS(float) | 设置加速度计量程 |
Set_G_FS(float) | 设置陀螺仪量程 |
- 加速度计量程可选 ±2g / ±4g / ±8g / ±16g;
- 陀螺仪量程可选 ±125 / ±245 / ±500 / ±1000 / ±2000 dps。
量程设置直接影响传感器内部增益与前述灵敏度系数:量程越大,可测量的物理范围越大,但同等物理量对应的 LSB 计数分辨率越低。
五、硬件事件检测 API
LSM6DSL 内置多个硬件级检测引擎,可在芯片内部完成特征识别并产生中断/状态位,无需主控持续轮询原始数据。库为每种事件提供一对Enable_*_Detection/Disable_*_Detection方法,其中 Enable 方法可接收可选的LSM6DSL_Interrupt_Pin_t参数指定触发使用的中断引脚(引脚 INT1/INT2)。
需要特别注意的是,启用不同事件时库会自动强制设置加速度计的 ODR 与 FS,这属于库的既定行为:
| 事件 | 自动设置的加速度计配置 |
|---|---|
| 自由落体检测(Free Fall) | ODR = 416Hz,FS = 2g |
| 计步器(Pedometer) | ODR = 26Hz,FS = 2g |
| 倾斜检测(Tilt) | ODR = 26Hz,FS = 2g |
| 唤醒检测(Wake Up) | ODR = 416Hz,FS = 2g |
| 单击检测(Single Tap) | ODR = 416Hz,FS = 2g |
| 双击检测(Double Tap) | ODR = 416Hz,FS = 2g |
| 6D 方向检测(6D Orientation) | ODR = 416Hz,FS = 2g |
自由落体检测
| API | 说明 |
|---|---|
Enable_Free_Fall_Detection(LSM6DSL_Interrupt_Pin_t) | 使能自由落体检测(加速度计自动设为 416Hz / 2g) |
Disable_Free_Fall_Detection() | 关闭自由落体检测 |
Set_Free_Fall_Threshold(uint8_t) | 设置自由落体检测阈值 |
自由落体检测用于判断设备处于失重下落状态,常见于移动设备的跌落保护。Set_Free_Fall_Threshold的参数为写入器件 FF_THS 寄存器的阈值。
计步器(Pedometer)
| API | 说明 |
|---|---|
Enable_Pedometer() | 使能计步器(加速度计自动设为 26Hz / 2g) |
Disable_Pedometer() | 关闭计步器 |
Get_Step_Counter(uint16_t*) | 读取当前步数 |
Reset_Step_Counter() | 清零步数计数器 |
Set_Pedometer_Threshold(uint8_t) | 设置计步阈值 |
计步器由芯片内部的步数检测引擎实现,主控只需在空闲时通过Get_Step_Counter读取累计步数,或通过Reset_Step_Counter清零后重新累计。注意该功能仅依赖加速度计,因此启用后 ODR 被强制为较低的 26Hz 以平衡功耗与检测效果。
倾斜检测(Tilt)
| API | 说明 |
|---|---|
Enable_Tilt_Detection(LSM6DSL_Interrupt_Pin_t) | 使能倾斜检测(加速度计自动设为 26Hz / 2g) |
Disable_Tilt_Detection() | 关闭倾斜检测 |
倾斜检测用于侦测设备摆放角度的显著变化(如从水平变为竖直),常用于屏幕自动旋转场景。
唤醒检测(Wake Up)
| API | 说明 |
|---|---|
Enable_Wake_Up_Detection(LSM6DSL_Interrupt_Pin_t) | 使能唤醒检测(加速度计自动设为 416Hz / 2g) |
Disable_Wake_Up_Detection() | 关闭唤醒检测 |
Set_Wake_Up_Threshold(uint8_t) | 设置唤醒阈值 |
唤醒检测通过监测加速度超过设定阈值来识别设备从静止被拿起/移动,配合低功耗模式可用于按需唤醒主控。
单击 / 双击检测(Tap)
| API | 说明 |
|---|---|
Enable_Single_Tap_Detection(LSM6DSL_Interrupt_Pin_t) | 使能单击检测(加速度计自动设为 416Hz / 2g) |
Disable_Single_Tap_Detection() | 关闭单击检测 |
Enable_Double_Tap_Detection(LSM6DSL_Interrupt_Pin_t) | 使能双击检测(加速度计自动设为 416Hz / 2g) |
Disable_Double_Tap_Detection() | 关闭双击检测 |
Set_Tap_Threshold(uint8_t) | 设置敲击触发阈值 |
Set_Tap_Shock_Time(uint8_t) | 设置敲击冲击时间窗 |
Set_Tap_Quiet_Time(uint8_t) | 设置敲击静默时间窗 |
Set_Tap_Duration_Time(uint8_t) | 设置敲击持续时间窗 |
Tap 检测用于识别用户对设备的轻敲操作。双击检测的"两次敲击"判定依赖多个时间窗参数:Shock_Time(单次敲击的冲击持续时间上限)、Quiet_Time(两次敲击之间的静默间隔下限,用于防止抖动误判)、Duration_Time(用于区分单击与双击的最大时间窗)。合理设置这三个参数可以显著提高识别的准确性,避免误触发。
6D 方向检测(6D Orientation)
| API | 说明 |
|---|---|
Enable_6D_Orientation(LSM6DSL_Interrupt_Pin_t) | 使能 6D 方向检测(加速度计自动设为 416Hz / 2g) |
Disable_6D_Orientation() | 关闭 6D 方向检测 |
Get_6D_Orientation_XL(uint8_t*) | 读取 XL 轴向数据 |
Get_6D_Orientation_XH(uint8_t*) | 读取 XH 轴向数据 |
Get_6D_Orientation_YL(uint8_t*) | 读取 YL 轴向数据 |
Get_6D_Orientation_YH(uint8_t*) | 读取 YH 轴向数据 |
Get_6D_Orientation_ZL(uint8_t*) | 读取 ZL 轴向数据 |
Get_6D_Orientation_ZH(uint8_t*) | 读取 ZH 轴向数据 |
6D 方向检测将空间划分为 6 个正交方向(每个轴的正/负方向,共 X/Y/Z × L/H = 6 种姿态),芯片通过重力矢量判断设备当前朝向。六个 Get 方法分别读取各轴向的状态位,用于确定设备处于哪个面朝上,典型应用是屏幕方向自动切换与设备姿态显示。
事件状态汇总
Get_Event_Status(LSM6DSL_Event_Status_t*)Get_Event_Status一次性读取所有硬件事件(自由落体、倾斜、唤醒、单击、双击、6D 方向等)的当前状态标志,填充到LSM6DSL_Event_Status_t结构体中。适合在中断回调或主循环中统一轮询,是编写"多事件同时检测"程序的核心接口(对应示例DISCO_IOT_MultiEvent)。
六、寄存器级读写 API
| API | 说明 |
|---|---|
ReadReg(uint8_t, uint8_t*) | 从指定寄存器地址读取数据 |
WriteReg(uint8_t, uint8_t) | 向指定寄存器地址写入数据 |
这两个方法提供对 LSM6DSL 寄存器的底层直接访问,绕过库封装,便于开发者实现库未覆盖的高级配置(例如直接配置 FIFO、内部传感器、特定中断路由等)。使用时需参照 LSM6DSL 数据手册的寄存器地址与位域定义,注意避免与库内部已管理的寄存器冲突。
七、返回值约定
库中所有 API 统一返回状态码,成功时为LSM6DSL_STATUS_OK,失败时返回对应错误码。推荐的健壮写法是在每个调用后检查返回值:
if (LSM6DSL.Enable_X() != LSM6DSL_STATUS_OK) { // 处理使能失败(例如 I2C 无应答、器件未就绪) }该约定与 ST 系列驱动(HTS221、LIS3MDL 等)保持一致,便于在同一个工程中统一处理多颗传感器的错误。
八、示例程序解读
文档列出了 9 个随库分发的示例,全部面向 Discovery IoT 板(DISCO_IOT)命名,可按功能分为两类:
数据采集类
| 示例 | 功能 |
|---|---|
DISCO_IOT_LS6DSL_DataLog_Terminal | 读取加速度计与陀螺仪数值并打印到终端,适合作为入门验证程序 |
事件检测类
| 示例 | 功能 |
|---|---|
DISCO_IOT_6DOrientation | 检测并打印 6D 方向事件 |
DISCO_IOT_DoubleTap | 检测并打印双击事件 |
DISCO_IOT_FreeFall | 检测并打印自由落体事件 |
DISCO_IOT_MultiEvent | 同时检测并打印自由落体、单击、双击、倾斜、唤醒、6D 方向与计步事件(综合示例) |
DISCO_IOT_Pedometer | 检测并打印计步事件 |
DISCO_IOT_Tap | 检测并打印单击事件 |
DISCO_IOT_Tilt | 检测并打印倾斜事件 |
DISCO_IOT_WakeUp | 检测并打印唤醒事件 |
事件类示例的通用结构是:在setup()中构造传感器对象并调用对应的Enable_*_Detection,然后在loop()中通过Get_Event_Status或专用状态读取方法判断事件是否发生并输出结果。DISCO_IOT_MultiEvent可作为参考模板,一次完成多个事件的联合检测。
九、源码与数据手册
- 库源码:该库由 stm32duino 组织独立维护,源码仓库与 Arduino Library Manager / Board Manager 集成发布,可通过 Arduino IDE 的库管理器直接搜索 "LSM6DSL" 安装;
- 数据手册:LSM6DSL 的完整电气特性、寄存器映射、ODR/FS 各档位精确取值、中断引脚路由等细节均以 ST 官方数据手册为准,寄存器级开发(如使用
ReadReg/WriteReg)时必须对照查阅; - 核心依赖:I2C 通信依赖 STM32 核心自带的 Wire 实现(libraries/Wire/src),无需额外安装;板级 I2C 引脚映射可参考对应 variant 的 PeripheralPins_B_L475E_IOT01A.cT_L476V(C-E-G)T_L486VGT/PeripheralPins_B_L475E_IOT01A.c);
- 相关文档:其他专用传感器驱动(HTS221、LIS3MDL、LPS22HB 等)的说明见 docs/libraries/dedicated,完整的专用库清单见 docs/libraries/index.md。
十、快速上手路径建议
- 在 Arduino IDE 中通过 Board Manager 安装 Arduino_Core_STM32,并选择
B-L475E-IOT01A(或B-L4S5I-IOT01A); - 通过 Library Manager 安装 LSM6DSL 库;
- 先运行
DISCO_IOT_LS6DSL_DataLog_Terminal验证 I2C 通信与数据读取(内部总线为 I2C2,构造对象传入对应 Wire 实例); - 再按需求逐个启用事件检测,并利用
Get_Event_Status统一读取事件标志; - 需要更高控制力时,通过
Set_X_ODR/Set_X_FS调整数据率与量程,通过ReadReg/WriteReg直接访问寄存器。
- 嵌入式
- 固件
- 驱动开发
- 硬件开发
【免费下载链接】Arduino_Core_STM32
STM32 core support for Arduino
相关推荐
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考