打印
[STM32F1]

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

[复制链接]
322|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者

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

使用特权

评论回复
5
huangchui|  楼主 | 2022-1-2 19:28 | 只看该作者
测试代码逻辑

使用特权

评论回复
6
huangchui|  楼主 | 2022-1-2 19:31 | 只看该作者
逻辑分析仪波形:

使用特权

评论回复
7
huangchui|  楼主 | 2022-1-2 19:34 | 只看该作者
示波器部分波形:

使用特权

评论回复
8
huangchui|  楼主 | 2022-1-2 19:38 | 只看该作者
串口输出

使用特权

评论回复
9
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);

        }

        

}

使用特权

评论回复
10
pengf| | 2022-1-2 19:43 | 只看该作者
DAT引脚设为开漏输出,外部加个上拉电阻

使用特权

评论回复
11
huangchui|  楼主 | 2022-1-2 19:46 | 只看该作者

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

使用特权

评论回复
12
huangchui|  楼主 | 2022-1-2 19:48 | 只看该作者
找到问题了,延时函数的间隙有问题,除法运算的结果超过了int16的范围,用示波器单独测试下翻转GPIO电平才看出来了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

918

主题

12323

帖子

4

粉丝