STM32F103C8 输入模式一直读取不到DHT11时序
STM32F103C8 输入模式一直读取不到DHT11时序楼主详细说说怎么回事啊,这么说太笼统了 正常写的程序一直不能读取到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);
}
} DAT引脚设为开漏输出,外部加个上拉电阻
参考了别人的程序,区别在,网上找的用的寄存器修改IO模式,但是我如果用标准库就不行,这里面有啥区别?
找到问题了,延时函数的间隙有问题,除法运算的结果超过了int16的范围,用示波器单独测试下翻转GPIO电平才看出来了
页:
[1]