问题遇到的现象和发生背景
使用STM32F103C8T6驱动DHT22温湿度传感器
使用PA4作为数据端时,结果符合
使用PA9作为数据端时,结果与预期不符
问题相关代码,请勿粘贴截图
dh22.h
#ifndef __DHT22_H
#define __DHT22_H
#include "sys.h"
//IO·½ÏòÉèÖÃ
#define DHT22_IO_IN() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=8<<4;}
#define DHT22_IO_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=3<<4;}
////IO²Ù×÷º¯Êý
#define DHT22_DQ_OUT PBout(9)
#define DHT22_DQ_IN PBin(9)
u8 DHT22_Init(void);
u8 DHT22_Read_Data(u16 *temp,u16 *humi);
u8 DHT22_Read_Byte(void);
u8 DHT22_Read_Bit(void);
u8 DHT22_Check(void);
void DHT22_Rst(void);
#endif
dht22.c
#include "dht22.h"
#include "delay.h"
#if SYSTEM_SUPPORT_OS
#include "includes.h"
#endif
//¸´Î»DHT22
//Ö÷»úÐźÅ
void DHT22_Rst(void)
{
DHT22_IO_OUT();//SET OUTPUT
DHT22_DQ_OUT=0;
delay_ms(1);
DHT22_DQ_OUT=1;
delay_us(30);
}
u8 DHT22_Check(void)
{
u8 retry=0;
DHT22_IO_IN();
while (DHT22_DQ_IN&&retry<200)
{
retry++;
delay_us(1);
}
if(retry>=200)return 1;
else retry=0;
while (!DHT22_DQ_IN&&retry<200)
{
retry++;
delay_us(1);
}
if(retry>=200)return 1;
else return 0;
}
u8 DHT22_Read_Bit(void)
{
u8 retry=0;
while(DHT22_DQ_IN&&retry<200)
{
retry++;
delay_us(1);
}
retry=0;
while(!DHT22_DQ_IN&&retry<200)
{
retry++;
delay_us(1);
}
delay_us(40);
if(DHT22_DQ_IN)return 1;
return 0;
}
u8 DHT22_Read_Byte(void)
{
u8 i,dat;
dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT22_Read_Bit();
}
return dat;
}
u8 DHT22_Read_Data(u16 *temp,u16 *humi)
{
u8 buf[5];
u8 i,sum;
DHT22_Rst();
if(DHT22_Check()==0)
{
for(i=0;i<5;i++)
{
buf[i]=DHT22_Read_Byte();
}
// *humi=buf[0]*256+buf[1];
// *temp=buf[2]*256+buf[3];
sum =((buf[0]+buf[1]+buf[2]+buf[3])&0xFF);
if(sum==buf[4])//УÑé
{
*humi=buf[0]*256+buf[1];
*temp=buf[2]*256+buf[3];
}
}else return 1;
return 0;
}
u8 DHT22_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_9);
DHT22_Rst();
return DHT22_Check();
}
运行结果及报错内容
正常是20多度,湿度是40多,但是这明显数据没有正确
我的解答思路和尝试过的方法
尝试过使用PA4端,符合预期效果,但想知道PB9为啥不能用
我想要达到的结果
使用STM32F103C8T6的PB9端驱动DHT22温湿度传感器