[应用相关] STM32F103C8 输入模式一直读取不到DHT11时序,跪求大佬指点

[复制链接]
1016|3
 楼主| oolong 发表于 2020-1-22 11:43 | 显示全部楼层 |阅读模式
本帖最后由 oolong 于 2020-1-22 11:53 编辑

正常写的程序一直不能读取到DHT11的时序,所以弄了个单元测试,主机起始信号发送后每1us读取一次总线的电平(GPIO浮空输入),但是读取500次读到的全是1,用逻辑分析仪和示波器看到的都是有波形的,找了好久不知道问题在哪,求大佬们指点迷津。

测试代码逻辑:
dht11_code.jpg

逻辑分析仪波形:
dht11.jpg

示波器部分波形:
dht11_示波器.jpg

串口输出
usart.jpg



  1. void dht11_test14(void){
  2.         uint32_t cnt = 0;
  3.         uint8_t bit_num;
  4.         GPIO_InitTypeDef        GPIO_InitStruct  = {0};
  5.         // 配置串口
  6.         USART_Config();
  7.         printf("hello stm32\n");
  8.         //打开IO口时钟
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  10.         while(1){
  11.                 cnt = 1;
  12.                 //推挽输出
  13.                 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
  14.                 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  15.                 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  16.                 GPIO_Init(GPIOB, &GPIO_InitStruct);
  17.                
  18.                 //延时2s,等待DHT11就绪
  19.                 GPIO_SetBits(GPIOB, GPIO_Pin_14);
  20.                 SysTick_Delay_ms(1000);
  21.                 SysTick_Delay_ms(1000);
  22.                 //18ms起始信号
  23.                 GPIO_ResetBits(GPIOB, GPIO_Pin_14);
  24.                 SysTick_Delay_ms(18);

  25.                 //输入模式,拉高等待
  26.                 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
  27.                 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  28.                 GPIO_Init(GPIOB, &GPIO_InitStruct);
  29.                
  30.                 //每1us采样一次
  31.                 while(cnt){
  32.                         bit_num = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14);
  33.                         printf("read:%d\t%d\n",cnt,bit_num);
  34.                         SysTick_Delay_us(1);
  35.                         if(cnt > 500){
  36.                                 cnt = 1;
  37.                                 break;
  38.                         }
  39.                         cnt++;
  40.                 }
  41.                 SysTick_Delay_ms(1000);
  42.                 SysTick_Delay_ms(1000);
  43.         }
  44.         
  45. }


mohanwei 发表于 2020-1-22 20:03 | 显示全部楼层
DAT引脚设为开漏输出,外部加个上拉电阻
 楼主| oolong 发表于 2020-1-22 20:23 | 显示全部楼层
dht11_gpio.jpg

参考了别人的程序,区别在,网上找的用的寄存器修改IO模式,但是我如果用标准库就不行,这里面有啥区别?
 楼主| oolong 发表于 2020-1-24 12:37 | 显示全部楼层
找到问题了,延时函数的间隙有问题,除法运算的结果超过了int16的范围,用示波器单独测试下翻转GPIO电平才看出来了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

11

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部