文章目录
- 一、准备驱动文件
- 二、STM32CubeMX配置
- 三、Keil代码介绍
- 总结:
我把整个工程文件放在下面的链接里,大家自己拿。
一、准备驱动文件
其中“bme280_defs.h主要是定义bme280寄存器的一些地址,bme280.h定义了一些初始化函数和功能实现函数bme280.c这三个文件需要添加到工程中才能实现这些函数。 本文件的目的是在初始化时确定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传感器设备的调试,从移植官方的驱动到数据读取!!!