STM32--DHT11(标准库)驱动开发
一、前言
在我们进行嵌入式开发时,驱动开发也是十分重要的一步,在很多时候,我们的都需要自己来编写硬件的底层驱动,实现硬件与芯片的通信,常见的协议有SPI,IIC,以及单总线的一些通信方式,今天我们就来开发DHT11驱动。
二、DHT11
在开发一款驱动前,我们需要知道他是干什么的,DHT11数字温湿度传感器,是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数 字模块采集技术和温湿度传感技术,确保产品具有枀高的可靠性与卓越的长期稳定性。传感器包括一 个电容式感湿元件和一个NTC 测温元件。
常用于,暖通空调、除湿器、农业、冷链仓储、测试及检测设备、消费品、汽车、自动控制、数据记录器、气 象站、家电、湿度调节器、医疗、其他相关湿度检测控制。
因其成本低、长期稳定、相对湿度和温度测量、品质卓越、超快响应、抗干扰能力强、超长的信号传输距 离、数字信号输出、精确校准,而广泛适用。
他有四个引脚,1脚为电源引脚,2脚为串行数据引脚(单总线),3脚为悬空NC,4脚为GND接地。以下是他的原理图。
在实际运用中,常将2脚与主控芯片相连接,我们这里以stm32F103C8T6为例,以下是它的电路连接图。
我们选择的是PA3脚,来作为我们的通信引脚,因此我们在编写程序时,也要选择我们的PA3脚,接下来我们就要进行驱动开发。
三、DHT11底层驱动开发
在开发任何一款驱动时,他们的数据手册,就是我们的开发依据,所有的时序以及通信方式,校验方式,我们都要依据他们的数据手册,开发DHT11也不例外,我们先在网上搜索DHT11数据手册,下载下来。
如果找不到,也可以用我下面这个:
百度网盘: https://pan.baidu.com/s/1MGWL-QDO7CBo2ZFKPBY-vQ?pwd=styz
提取码: styz
接着我们就可以开始我们的驱动编写了,我们打开CUBEMX,来创建一个工程文件。
接着我们创建两个文件夹,一个为DHT11.c一个为DHT11.h
我们引入头文件后我们开始解读我们的数据手册。
我们可以看到他有两个状态,当主机输出,以及主机输入状态,显然我们需要初始化我们的PA3引脚为两个状态。因此我们要创建两个函数,来封装这两个状态。
这样我们在改变模式的时候就可以直接调用函数就可以了。我们接着看数据手册。
我们可以看到,在开始接受数据之前我们需要输出低信号18ms,以代表起始信号,所以我们也需要在程序里编写。
我们在看上面的时序图,我们需要拉低电平,也就是输出低电平,为了方便后续的编写,我们可以直接定义一个函数。
这样我们就可以直接调用函数,然后按照起始信号的时序来编写就行。
这样我们就可以开始接受从机给我们发送命令了 ,我们继续看数据手册。
我们可以看到,这里的延时,变为了微秒级的延时,因此我们还需要自己写一个函数来实现微秒延迟。
这样一个简单的us延时就完成了。我们继续看数据手册,我们可以发现,当我们的DHT11开始输出低电平时则代表它响应了我们主机的信号。我们就可以用函数先判断引脚是否为低电平。
这样我们直接判断信号为高还是低,如果为低我们就直接改为输入模式,因为这时的DHT11为输出。因此我们还需要写输入逻辑。也就是发送数据的时序。
接下来我们就可以开始存数据了。我们为了便于使用,我们可以创建一个结构体变量。
根据数据手册,我们按照顺序创建结构体。
接着我们就可以使用他了,我们继续编写我们的读时序。
这样就完成了我们的读时序编写,最后我们只需要再写一个函数初始化我们的硬件。
这样我们的驱动就编写完成了,我们最后只需要在我们的DHT11.h中声明我们的函数就可以在外部调用我们的函数了。
这样我们可以读取数据了。