毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移

毕业设计准备用 博世的 BME680 传感器来获取温湿度以及气压 空气质量信息。我选用的传感器是这样的

短期内可能不会上传代码,这是毕设的一部分  需要代码的小伙伴留言吧

传感器使用的是IIC协议进行通讯的 接线逻辑如下

VCC ----3.3V

GND---GND

SCL----PA15

SDA---PB3

选择的这么奇怪的引脚是因为我的  BME传感器设计问题,我先前买了 单个的传感器 焊接到我的毕设电路板上,但是电路始终有问题也没有找到具体的电路问题所在,最终无奈只能换成模块, 接线是借用的 编码器的接口  所有就有了这么两个不是很相关的 IO   读者可以根据自己的需求修改自己的 IO  我这里的程序使用的是软件模拟的IIC

我的 代码是移植的博世的官方的代码库 

https://github.com/BoschSensortec/BME680_driver  这是代码的地址 

扫描二维码关注公众号,回复: 9525225 查看本文章

我所用到的文件主要有这三个文件  读者可以自行去下载 官方的库文件  

第一个文件 bme680.c  声明了很多的函数   主要就是各种的 计算  对寄存器的数据解析的函数

注意这里面的很对函数都事static 类型的   也就是说官方希望这个函数不要在外面去调用   只是给这个文件内的其他函数去调用我的,官方代码给我们留下了几个通用的调用接口

大多数函数的入口参数都是结构体的指针, 有一点设备驱动的味道在里面(或许就是设备驱动,只是我还没学的到)

其他函数我就不多介绍了   这份代码的关键是在 结构体的定义和使用上

我准备着重跟大家分享一下我对这些结构体的理解

打开这个 头文件 前面的几百行大约就是一些宏定义 ,这个和我们的STM32 库文件是几乎一样的,我们可以不用自己去计算寄存器的具体值,直接赋值就可以了。

这一部分大约是这些东西

接下来就是两个至关重要的  函数指针的声明

这两个函数指针是 库文件和 单片机硬件连接的桥梁,所有的调用接口都在这里,针对于不同的硬件平台,我们只要修改这两个函数指针的实现我们就可以任意的迁移。

这两类函数 分别是  BME680 的读取(写入) 和延时函数    (注意 我们一共需要实现三个函数   读  、 写 、 延时,读和写是一样的类型)

注意 这里的读取没有限定是一定要用 IIC 还是 SPI  也就是说 这边留了足够的选择的余地,我当时被惊艳到了.....  我总觉得这边是设备树相关的(我没学过,会学的,,)

继续说  结构体

  这个枚举 是让你选择 通讯方式的  因为涉及到了一个 BME680 内部地址的寻址过程。  所有底层逻辑会有一定的不同

针对的就是这两个函数   在IIC模式下这两个函数用不到,但是在 SPI下用得到

接着这个结构体是用来存放计算好的数据的 

这个结构体的指针  是函数的入口参数;  也就是说计算的结果会保存在这里面。

这个结构体 我的理解是一个校正数组, 传感器内部有一些其他的数据 会被保存在这个结构体里面,后面调用数据计算的算法的时候回使用到这些数据,主要应该是对测量结果进行修正的  这个数组在进行  数据获取之前应该先填满(也就是在进行参数计算之前要填满)

这个结构体是  过采样率的保存数组  主要的事保存的过采样率  关于过采样率  请自行查找

这个结构体是  气体相关的结构体  我没深入了解

最后这个是设备的结构体,设备相关的数据都在这里, 有函数指针(先前提到过),有结构体的指针(各种数据的结构体),还有 通讯方式的选择(枚举) 设备ID  设备号等等

这部分待读者自行去理解吧

接下来我分享一下我的部分代码的思路

第一部分 我们肯定是要去实现那三个函数(读  写  延时)

这里 头文件给了我们提示  官方库提出了他的要求  ,要求的返回值是什么样子的,  函数的传入参数是什么样子的  都声明的很明白

我们只需要按照自己的单片机类型去实现指定的功能就好了

这是我的读函数,迁移改编自正点原子的 IIC例程

我的写函数

至于 像是IIC的起始,  发送数据

这些代码都是些基本操作,我在这里就不在多说,  大家去参考正点原子的iic 实验就好  实在不行等我上传代码吧(不一定会整理的很好)

我们只要是去实现那个 对应的函数接口就行了

关于延时函数我们没有办法直接使用Stm23F4的延时函数,会出错误的

出错误的原因是 传入参数的类型不相同 解决的方法很简单就是加了一层壳   强制类型转换一下

反正延时的时间也不可能用到65536ms   所以可以放心大胆的舍弃掉高位

以上我们就实现了三个基本函数;  接下来就是进行一些初始化的操作了, 大致我分两类  一类是单片机那边的 IO初始化, 这部分不提就是IO的配置,另外一部分就是用到的结构体需要去声明,需要去进行赋值  然后还需要调用一些关键的函数去对传感器侧的寄存器进行初始化

这是 IO初始化   不赘述   PA15   PB3

 接下来是  结构体和  函数调用

 

  以上就是我的初始化函数。  主要是给结构体填上相应的数字

  这是 下面函数中的延时时间实际测试

函数的输出结果

气压101650Pa   相对湿度51%  气温21度   

剩下的空气品质那一栏 暂时还没解决改日再战

发布了35 篇原创文章 · 获赞 30 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41534481/article/details/104302626