很开心参加Let's Do|2026年第3期活动,这次我选择的开发板为:NUCLEO-H533RE。除了开发板之外,还有两个小模块和一个步进电机。LIS3DH:三轴数字加速度计 (LIS3DHTR) 是一款低成本的三轴加速度计,属于 Grove 产品系列。基于 LIS3DHTR 芯片,提供多种量程和接口选择。体积小巧,测量范围:±2g、±4g、±8g、±16g,多种量程选择,支持 I2C、SPI 和 ADC GPIO 接口。

首先使用NUCLEO-H533RE来读取三轴数字加速度计 (LIS3DHTR)。
第一步:使用STM32CubeMX来生成一个项目。
LIS3DHTR传感器使用I2C总线读取。所以要开启I2C支持。然后生成项目。


查看电路图,NUCLEO开发板这点挺好的,排针、排母都有安排,所以杜邦线很容易连接。I2C对应管脚PB6、PB7,LIS3DHTR模块使用5V供电。


参考着论坛中老师的帖子,用vscode做编辑器,打开项目。让AI帮忙写一下LIS3DHTR的驱动。

/**
******************************************************************************
* @file lis3dh.c
* @brief Minimal LIS3DH (3-axis accelerometer) driver over I2C1
******************************************************************************
*/
#include "lis3dh.h"
#include "i2c.h"
#define I2C_TIMEOUT_MS 200U
static const uint8_t lis3dh_addr = LIS3DH_I2C_ADDR_SA0_1;
uint8_t LIS3DH_ReadReg(uint8_t reg)
{
uint8_t data = 0;
HAL_I2C_Mem_Read(&hi2c1, (uint16_t)(lis3dh_addr << 1),
(uint16_t)reg, I2C_MEMADD_SIZE_8BIT, &data, 1, I2C_TIMEOUT_MS);
return data;
}
void LIS3DH_WriteReg(uint8_t reg, uint8_t val)
{
HAL_I2C_Mem_Write(&hi2c1, (uint16_t)(lis3dh_addr << 1),
(uint16_t)reg, I2C_MEMADD_SIZE_8BIT, &val, 1, I2C_TIMEOUT_MS);
}
uint8_t LIS3DH_ReadID(void)
{
return LIS3DH_ReadReg(LIS3DH_WHO_AM_I);
}
uint8_t LIS3DH_Init(void)
{
uint8_t retry;
HAL_Delay(20);
for (retry = 0; retry < 5; retry++)
{
if (LIS3DH_ReadID() == 0x33U)
{
LIS3DH_WriteReg(LIS3DH_CTRL_REG1,
LIS3DH_CTRL_REG1_ODR_100HZ | LIS3DH_CTRL_REG1_XYZ_EN);
LIS3DH_WriteReg(LIS3DH_CTRL_REG4,
LIS3DH_CTRL_REG4_BDU | LIS3DH_CTRL_REG4_HR | LIS3DH_CTRL_REG4_FS_2G);
return 1;
}
HAL_Delay(5);
}
return 0;
}
HAL_StatusTypeDef LIS3DH_ReadAccel(LIS3DH_Accel_t *acc)
{
uint8_t buf[6];
HAL_StatusTypeDef st;
st = HAL_I2C_Mem_Read(&hi2c1, (uint16_t)(lis3dh_addr << 1),
(uint16_t)(LIS3DH_OUT_X_L | 0x80U),
I2C_MEMADD_SIZE_8BIT, buf, 6, I2C_TIMEOUT_MS);
if (st == HAL_OK)
{
acc->x = (int16_t)(((uint16_t)buf[1] << 8) | buf[0]) >> 4;
acc->y = (int16_t)(((uint16_t)buf[3] << 8) | buf[2]) >> 4;
acc->z = (int16_t)(((uint16_t)buf[5] << 8) | buf[4]) >> 4;
}
return st;
}让AI帮忙添加驱动,修改主函数中的调用。然后就可以成功读取三轴的加速度信息了。


用手移动传感器,可以看见数据变化情况。
LIS3DH X= 23 Y= -14 Z= 1030 mg LIS3DH X= 23 Y= -8 Z= 1032 mg LIS3DH X= 22 Y= -11 Z= 1030 mg LIS3DH X= 22 Y= -10 Z= 1030 mg LIS3DH X= 26 Y= -10 Z= 1036 mg LIS3DH X= 25 Y= -12 Z= 1034 mg LIS3DH X= 20 Y= -6 Z= 1032 mg LIS3DH X= 21 Y= -7 Z= 1035 mg LIS3DH X= 28 Y= -12 Z= 1030 mg LIS3DH X= 129 Y= -105 Z= 1064 mg LIS3DH X= -25 Y= -203 Z= 1033 mg LIS3DH X= 60 Y= -311 Z= 946 mg LIS3DH X= 209 Y= -727 Z= 955 mg LIS3DH X= -371 Y= -775 Z= 197 mg LIS3DH X= 6 Y= -951 Z= -45 mg LIS3DH X= -362 Y= -424 Z= -537 mg LIS3DH X= -498 Y= -201 Z= -756 mg LIS3DH X= -536 Y= 53 Z= -547 mg LIS3DH X= 590 Y= -375 Z= -770 mg LIS3DH X= 651 Y= -23 Z= -832 mg LIS3DH X= 530 Y= 298 Z= -808 mg LIS3DH X= 1651 Y= 450 Z= -263 mg LIS3DH X= -384 Y= -344 Z= -678 mg LIS3DH X= -772 Y= 187 Z= -798 mg LIS3DH X= 140 Y= 467 Z= -398 mg LIS3DH X= 878 Y= 249 Z= 538 mg LIS3DH X= 655 Y= -954 Z= 550 mg LIS3DH X= 86 Y= -932 Z= 33 mg LIS3DH X= -616 Y= -32 Z= -814 mg LIS3DH X= -524 Y= 165 Z= -689 mg LIS3DH X= 729 Y= 1028 Z= 361 mg LIS3DH X= 1313 Y= -167 Z= 376 mg LIS3DH X= -36 Y= -95 Z= -303 mg LIS3DH X= -899 Y= 35 Z= -913 mg LIS3DH X= 411 Y= 198 Z= -764 mg
我要赚赏金
