毕业设计3-BME280温湿度大气压传感器调试记录(STM32F103C8T6 + STM32CubeMX + BME280)
时间:2022-10-28 00:00:00
文章目录
- 一、准备驱动文件
- 二、STM32CubeMX配置
- 三、Keil代码介绍
- 总结:
我的毕业设计需要显示测量的温度、湿度和大气压数据,所以选择BME基于280传感器的传感器。I2C通信,我们通过移植官方驱动库。本文主要介绍整个移植过程,没有理论介绍。
我把整个工程文件放在下面的链接里,大家自己拿。
链接:https://pan.baidu.com/s/1aZyCO8cuZQ4eLKKC6_mGSQ
提取码:y1yo
一、准备驱动文件
1.我们在Github这三个驱动文件通常可以在中间找到。
其中“bme280_defs.h主要是定义bme280寄存器的一些地址,bme280.h定义了一些初始化函数和功能实现函数bme280.c这三个文件需要添加到工程中才能实现这些函数。
2.工程中提供的工程中还有一份自检文件。
本文件的目的是在初始化时确定BME280能否正常工作,如果通过自检,可以开始读取数据并处理。当然,在这个项目中,我没有使用这个函数。如果你想让传感器自检,你可以使用它。
二、STM32CubeMX配置
1.在“SYS我们将模块设置为SW”;
2. 在“RCC我们可以选择最后一个;
请参考三种差异:https://www.cnblogs.com/niu-li/p/11172052.html
3.因为BME依靠280传感器I2C要实现,我们需要一路开车I2C,其余默认;
4. 我们需要在串口调试助手中打印读取的数据;
5.让我们配置时钟树。我们必须检查我们的外部晶振是多少,需要与我们的硬件一致;
6. 我们可以将整个文件保存在相应的文件夹中;
7.我们需要选择我们想要生成的工程文件,然后点击右上角的工程文件。
三、Keil代码介绍
1.我们首先需要重定向和串口,main.c在文件中添加以下代码:
#include "stdio.h"
#ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE {
//具体哪个串口可以更改huart1为其它串口 HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1 , 0xffff); return ch; }
2.我们需要将那3个文件拷贝到工程中:
3.因想用硬件I2C来实现,所以需要修改一下“i2c.c”文件:
void user_delay_ms(uint32_t period)
{
HAL_Delay(period);
}
int8_t user_i2c_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
{
int8_t rslt = 0; /* Return 0 for Success, non-zero for failure */
HAL_StatusTypeDef status = HAL_OK;
status = HAL_I2C_Mem_Read(&hi2c2, dev_id<<1, reg_addr, I2C_MEMADD_SIZE_8BIT, reg_data, len, 0xffff);
if (status == HAL_OK)
{
rslt = 0;
}
else
{
rslt = -1;
}
return rslt;
}
int8_t user_i2c_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len)
{
int8_t rslt = 0; /* Return 0 for Success, non-zero for failure */
HAL_StatusTypeDef status = HAL_OK;
status = HAL_I2C_Mem_Write(&hi2c2, dev_id<<1, reg_addr, I2C_MEMADD_SIZE_8BIT, reg_data, len, 0xffff);
if (status == HAL_OK)
{
rslt = 0;
}
else
{
rslt = -1;
}
return rslt;
}
我们也需要在"i2c.h"文件中添加
void user_delay_ms(uint32_t period);
int8_t user_i2c_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len);
int8_t user_i2c_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len);
4.回到“main.c”文件中:
(1)定义两个结构体,一个为bme280,一个用来存储数据
struct bme280_dev dev;
struct bme280_data comp_data;
(2)初始化bme280:
int8_t rslt = BME280_OK;
dev.dev_id = BME280_I2C_ADDR_PRIM;
dev.intf = BME280_I2C_INTF;
dev.read = user_i2c_read; //利用硬件I2C模式来读取数据
dev.write = user_i2c_write;
dev.delay_ms = user_delay_ms;
rslt = bme280_init(&dev);
(3)读取函数:
int8_t stream_sensor_data_forced_mode(struct bme280_dev *dev)
{
uint8_t settings_sel;
/* Recommended mode of operation: Indoor navigation */
dev->settings.osr_h = BME280_OVERSAMPLING_1X;
dev->settings.osr_p = BME280_OVERSAMPLING_16X;
dev->settings.osr_t = BME280_OVERSAMPLING_2X;
dev->settings.filter = BME280_FILTER_COEFF_16;
settings_sel = BME280_OSR_PRESS_SEL | BME280_OSR_TEMP_SEL | BME280_OSR_HUM_SEL | BME280_FILTER_SEL;
bme280_set_sensor_settings(settings_sel, dev);
bme280_set_sensor_mode(BME280_FORCED_MODE, dev);
bme280_get_sensor_data(BME280_ALL, &comp_data, dev);
HAL_Delay(40);
printf("temperature:%0.2f*C pressure:%0.2fhPa humidity:%0.2f%%\r\n",comp_data.temperature, comp_data.pressure/100, comp_data.humidity);
}
(4)在while循环中进行实时读取:
总结:
通过本次实验自己学会了1个I2C传感器设备的调试,从移植官方的驱动到数据读取!!!