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

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

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

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第1张图片

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

VCC ----3.3V

GND---GND

SCL----PA15

SDA---PB3

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

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

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

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第2张图片

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

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

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第3张图片

注意这里面的很对函数都事static 类型的   也就是说官方希望这个函数不要在外面去调用   只是给这个文件内的其他函数去调用我的,官方代码给我们留下了几个通用的调用接口毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第4张图片

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

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

我准备着重跟大家分享一下我对这些结构体的理解毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第5张图片

打开这个 头文件 前面的几百行大约就是一些宏定义 ,这个和我们的STM32 库文件是几乎一样的,我们可以不用自己去计算寄存器的具体值,直接赋值就可以了。毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第6张图片

这一部分大约是这些东西

接下来就是两个至关重要的  函数指针的声明毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第7张图片

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

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

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

继续说  结构体

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第8张图片  这个枚举 是让你选择 通讯方式的  因为涉及到了一个 BME680 内部地址的寻址过程。  所有底层逻辑会有一定的不同毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第9张图片

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

 

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

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第10张图片毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第11张图片

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

 

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第12张图片

这个结构体 我的理解是一个校正数组, 传感器内部有一些其他的数据 会被保存在这个结构体里面,后面调用数据计算的算法的时候回使用到这些数据,主要应该是对测量结果进行修正的  这个数组在进行  数据获取之前应该先填满(也就是在进行参数计算之前要填满)毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第13张图片

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

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第14张图片这个结构体是  气体相关的结构体  我没深入了解

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第15张图片

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

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

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

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

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第16张图片

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

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

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第17张图片

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

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第18张图片

我的写函数

至于 像是IIC的起始,  发送数据毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第19张图片

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

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

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

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第20张图片

出错误的原因是 传入参数的类型不相同 解决的方法很简单就是加了一层壳   强制类型转换一下毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第21张图片

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

 

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

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第22张图片

这是 IO初始化   不赘述   PA15   PB3

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

 毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第23张图片

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第24张图片

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第25张图片

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第26张图片  以上就是我的初始化函数。  主要是给结构体填上相应的数字

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第27张图片  这是 下面函数中的延时时间实际测试

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第28张图片

毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第29张图片

函数的输出结果毕业设计--2020.02.13-----基于Stm32F407的 BME680传感器库函数的迁移_第30张图片

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

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

 

 

 

 

你可能感兴趣的:(毕设)