记录一次CUBEIDE的DHT11代码调试
文末有贴代码,亲测可用
STM32CUBEIDE
首先本文是基于STM32官方出品的CUBEIDE进行代码编写和调试的
环境搭建
官网下载之后安转完成(软件安装后可能需要登录才可以下载相关库文件)
新建工程网上已经有很多博主写了,直接略过。关于DHT11除了一些基本配置(如外部晶振、调试接口等)需要使用的一些配置如下图:
注意生成代码记得勾选Generate peripheral initialization as a pair of'.c/.h' files per peripheral
Tim配置
本文选择Tim3
,配置如图:
USART配置
本文选择Uart3
,配置如图:
GPIO配置
本文选择GPIOB12
,配置如图:
配置完成保存生成代码
手动添加代码如下
导入h文件,添加变量
打开串口中断初始化DHT11
获取DHT11数据以及数据类型转换和串口发送
下图可以看出获取到的温度数据
程序集合
需要修改项
- 在文件
dht11.h
搜索#define DHT11_DATA_OUT_Pin GPIO_PIN_12
、#define DHT11_DATA_OUT_GPIO_Port GPIOA
换成自己定义的GPIO。 - 在文件
dht11.c
搜索htim3
,换成自己想要的定时器。 main.c
函数中需要先定义初始化dht11
,之后进行读温度湿度、注意DHT11
是5V
供电- 如需添加串口中断函数可以直接添加在
main.c
中的/* USER CODE BEGIN 4 */
位置
DHT11.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
| #include "DHT11.h" #include "tim.h"
#define DHT11_DQ_IN HAL_GPIO_WritePin(DHT11_GPIO_Port, DHT11_Pin, GPIO_PIN_SET)
void DelayUs(uint32_t nus) { uint16_t differ = 0xffff - nus - 5; __HAL_TIM_SetCounter(&htim3, differ); HAL_TIM_Base_Start(&htim3);
while( differ < 0xffff - 5) { differ = __HAL_TIM_GetCounter(&htim3); };
HAL_TIM_Base_Stop(&htim3); }
void DelayXms(unsigned char t) { HAL_Delay(t); }
uint8_t DHT11_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOA, DHT11_DATA_OUT_Pin, GPIO_PIN_SET);
GPIO_InitStruct.Pin = DHT11_DATA_OUT_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(DHT11_DATA_OUT_GPIO_Port, &GPIO_InitStruct);
DHT11_Rst(); return DHT11_Check(); }
void DHT11_Rst(void) { DHT11_IO_OUT(); HAL_GPIO_WritePin(GPIOA, DHT11_DATA_OUT_Pin, GPIO_PIN_RESET); DelayXms(20); HAL_GPIO_WritePin(GPIOA, DHT11_DATA_OUT_Pin, GPIO_PIN_SET); DelayUs(30); }
uint8_t DHT11_Check(void) { uint8_t retry = 0; DHT11_IO_IN();
while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) && retry < 100) { retry++; DelayUs(12); };
if(retry >= 100)return 1; else retry = 0;
while (!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) && retry < 100) { retry++; DelayUs(1); };
if(retry >= 100)return 1;
return 0; }
uint8_t DHT11_Read_Bit(void) { uint8_t retry = 0;
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) && retry < 100) { retry++; DelayUs(1); }
retry = 0;
while(!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) && retry < 100) { retry++; DelayUs(1); }
DelayUs(40);
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12))return 1; else return 0; }
uint8_t DHT11_Read_Byte(void) { uint8_t i, dat; dat = 0;
for (i = 0; i < 8; i++) { dat <<= 1; dat |= DHT11_Read_Bit(); }
return dat; }
uint8_t DHT11_Read_Data(uint8_t *temp, uint8_t *humi, uint8_t *tem, uint8_t *hum) { uint8_t buf[5]; uint8_t i; DHT11_Rst();
if(DHT11_Check() == 0) { for(i = 0; i < 5; i++) { buf[i] = DHT11_Read_Byte(); }
if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4]) { *humi = buf[0]; *hum = buf[1]; *temp = buf[2]; *tem = buf[3]; } } else return 1;
return 0; }
void DHT11_IO_OUT() { GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOA, DHT11_DATA_OUT_Pin, GPIO_PIN_SET);
GPIO_InitStruct.Pin = DHT11_DATA_OUT_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(DHT11_DATA_OUT_GPIO_Port, &GPIO_InitStruct); }
void DHT11_IO_IN(void) { GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); }
|
DHT11.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #ifndef _DHT11_H_ #define _DHT11_H_ #include "main.h" #include "stdlib.h" #define DHT11_DATA_OUT_Pin GPIO_PIN_12 #define DHT11_DATA_OUT_GPIO_Port GPIOA
void DHT11_Rst(void); uint8_t DHT11_Check(void); uint8_t DHT11_Read_Bit(void); uint8_t DHT11_Read_Byte(void); uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi,uint8_t *tem,uint8_t *hum); uint8_t DHT11_Init(void); void DHT11_IO_IN(void); void DHT11_IO_OUT(void);
#endif
|
串口中断函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if(huart == (&huart3)) { HAL_UART_Transmit(&huart3, &kRxBuffer, 10, 100); HAL_UART_Transmit_IT(&huart3, &kRxBuffer, 100); } }
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {
if(huart == (&huart3)) { HAL_UART_Receive(&huart3, &kRxBuffer, 10, 100); HAL_UART_Receive_IT(&huart3, &kRxBuffer, 100);
}
}
|