本帖最后由 oolong 于 2020-1-22 11:53 编辑
正常写的程序一直不能读取到DHT11的时序,所以弄了个单元测试,主机起始信号发送后每1us读取一次总线的电平(GPIO浮空输入),但是读取500次读到的全是1,用逻辑分析仪和示波器看到的都是有波形的,找了好久不知道问题在哪,求大佬们指点迷津。
测试代码逻辑:
逻辑分析仪波形:
示波器部分波形:
串口输出
- 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);
- }
-
- }
|