huangchui 发表于 2022-1-2 19:18

STM32F103C8 输入模式一直读取不到DHT11时序

STM32F103C8 输入模式一直读取不到DHT11时序

zhenykun 发表于 2022-1-2 19:20


楼主详细说说怎么回事啊,这么说太笼统了

huangchui 发表于 2022-1-2 19:22

正常写的程序一直不能读取到DHT11的时序,所以弄了个单元测试,主机起始信号发送后每1us读取一次总线的电平(GPIO浮空输入),但是读取500次读到的全是1,用逻辑分析仪和示波器看到的都是有波形的

chenho 发表于 2022-1-2 19:25


楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

huangchui 发表于 2022-1-2 19:28

测试代码逻辑

huangchui 发表于 2022-1-2 19:31

逻辑分析仪波形:

huangchui 发表于 2022-1-2 19:34

示波器部分波形:

huangchui 发表于 2022-1-2 19:38

串口输出

huangchui 发表于 2022-1-2 19:41

void dht11_test14(void){

      uint32_t cnt = 0;

      uint8_t bit_num;

      GPIO_InitTypeDef      GPIO_InitStruct= {0};

      // 配置串口

      USART_Config();

      printf("hello stm32\n");

      //打开IO口时钟

      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);



      while(1){

                cnt = 1;

                //推挽输出

                GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;

                GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;

                GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

                GPIO_Init(GPIOB, &GPIO_InitStruct);

               

                //延时2s,等待DHT11就绪

                GPIO_SetBits(GPIOB, GPIO_Pin_14);

                SysTick_Delay_ms(1000);

                SysTick_Delay_ms(1000);

                //18ms起始信号

                GPIO_ResetBits(GPIOB, GPIO_Pin_14);

                SysTick_Delay_ms(18);



                //输入模式,拉高等待

                GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;

                GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;

                GPIO_Init(GPIOB, &GPIO_InitStruct);

               

                //每1us采样一次

                while(cnt){

                        bit_num = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14);

                        printf("read:%d\t%d\n",cnt,bit_num);

                        SysTick_Delay_us(1);

                        if(cnt > 500){

                              cnt = 1;

                              break;

                        }

                        cnt++;

                }

                SysTick_Delay_ms(1000);

                SysTick_Delay_ms(1000);

      }

      

}

pengf 发表于 2022-1-2 19:43

DAT引脚设为开漏输出,外部加个上拉电阻

huangchui 发表于 2022-1-2 19:46


参考了别人的程序,区别在,网上找的用的寄存器修改IO模式,但是我如果用标准库就不行,这里面有啥区别?

huangchui 发表于 2022-1-2 19:48

找到问题了,延时函数的间隙有问题,除法运算的结果超过了int16的范围,用示波器单独测试下翻转GPIO电平才看出来了
页: [1]
查看完整版本: STM32F103C8 输入模式一直读取不到DHT11时序