stm32无法唤醒DTH11温湿度传感器解决

关于DTH11的介绍和使用方法可以随便搜索一下别的文章,直接搜索DTH11即可。
这里使用艾克姆科技的例程,却无法成功运行,上了示波器才发现拉低时间无法达到18ms,因此无法唤醒DTH11。
总线由stm32拉低12ms左右之后就一直处于高电平。
原因在于艾克姆的延时函数是硬件延时(这段代码被写入到一个头文件,在主函数中引用),代码如下

#ifndef _DELAY_H
#define _DELAY_H

#include "stm32f10x.h"

//微秒软件延时函数
__STATIC_INLINE void sw_delay_us(uint32_t number_of_us);
//毫秒软件延时函数
__STATIC_INLINE void sw_delay_ms(uint32_t number_of_ms);


__STATIC_INLINE void sw_delay_us(uint32_t number_of_us)
{
  //输入的延时时间为0的话,程序直接返回  
	if(!number_of_us)
        return;
__asm
    {
loop:
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
	NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    SUBS number_of_us, #1  //number_of_us减一
    BNE loop  //不等于0跳转到LOOP执行
    }
}
__STATIC_INLINE void sw_delay_ms(uint32_t number_of_ms)
{
    sw_delay_us(1000*number_of_ms);
}

#endif

尝试在调用sw_delay_ms()或者sw_delay_us() 时修改括号里面的值,但是都只能延时12ms左右(有大神知道原因请不吝指教一下)
于是便使用了stm32内部的SysTick计时器,这里是按照非中断的方式使用
代码可以按以下配置。
头文件

#include "stm32f10x.h"
void delay_init(void);
void delay_ms(vu32 nTime);
void delay_us(vu32 nTime);

源文件

#include "stm32f10x.h"
void delay_init(void)
{
	SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk;		//时钟源为系统时钟168MHz
	SysTick->LOAD = 167;					//重载值为168-1,每1us溢出一次
}

void delay_ms(vu32 nTime)
{
	nTime *= 1000;
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;		//使能SysTick,开始计数
	while(nTime--){
		while((SysTick->CTRL&0X010000) == 0);		//等待COUNTFLAG标志位置1
	}
	SysTick->CTRL &= (~SysTick_CTRL_ENABLE_Msk);		//失能SysTick,停止计数
}

void delay_us(vu32 nTime)
{
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
	while(nTime--){
		while((SysTick->CTRL&0X010000) == 0);
	}
	SysTick->CTRL &= (~SysTick_CTRL_ENABLE_Msk);
}

这样延时函数就可以自己定比较准确时间了,DTH11被唤醒成功,具体的时钟配置应该还要根据各自的芯片手册调整,后面再更新文章。

上一篇:A-串


下一篇:ICPC训练联盟2021寒假冬令营 Dollar Dayz