当前位置:首页 > 单片机 > 单片机
[导读]环境:IAR 7.4stm32cubemx 4.13.1stm32f1 1.3.1freertos 8.1读ds18b20主要是时序,就是一个微秒级的delay。先看电路:这里使用上拉电阻,DQ设为OD模式,在读取和输出时,也做了PIN的方向改变,不做改变,则只能读取到

环境:

IAR 7.4

stm32cubemx 4.13.1

stm32f1 1.3.1

freertos 8.1


读ds18b20主要是时序,就是一个微秒级的delay。

先看电路:


这里使用上拉电阻,DQ设为OD模式,在读取和输出时,也做了PIN的方向改变,不做改变,则只能读取到0值。

不想使用上拉电阻,则可以把DQ设为PP模式,Mbed开发板使用这个可以成功读出。

没有电路的代码,是不完整的,不容易让人理解。


delay的实现,是使用timer,也可以使用nop指令。这里使用Timer3 定时器提供滴答。

GPIO和TIMER的配置使用stm32cubemx,这里不列出,有问题可以在forum里提出。


/*

*微秒延迟

*/

voidtherm_delay(uint16_tnCount)

{

__IOuint16_tTIMCounter=nCount;

uint16_tstart=TIM_MST->CNT;

uint16_tend=start+TIMCounter;

__IOuint16_tread;

while(1){

read=TIM_MST->CNT;

if(read

read=0xffff-start+read;

if(read>=end)

break;

}

}




频繁调用的改变方向和读取,改到寄存器操作,减少函数调用的开销。

根据需要对端口和Pin进行修改。


//PB8:IO方向设置

#defineTHERM_INPUT_MODE(){GPIOB->CRH&=0xFFFFFFF0;GPIOB->CRH|=0x4;}

#defineTHERM_OUTPUT_MODE(){GPIOB->CRH&=0xFFFFFFF0;GPIOB->CRH|=0x5;}

#defineDQ_READ()((GPIOB->IDR&GPIO_PIN_8)>>8)




把对ds18b20的读取放在一个对实时要求不高的task里,它会延误task几个毫秒的执行。

代码里有crc验证,如果中断或其他任务干扰读取时序,则取用值时将其扔掉。因此可以放心的把它集成到自己的项目中去。

调用:


//读取结果

typedefstruct{

int8_tvalue;

int8_terror;

}ThermValue;

.

.

.

__IOThermValuev_ds18b20;

/*ds18b20*/

if(start_conversion){

v_ds18b20=therm_read_temperature();

start_conversion=false;

}

else{

therm_start_conversion();

start_conversion=true;

}

if(v_ds18b20.error==0)

cv=v_ds18b20.value;


操作ds18b20的代码和例子非常多,实际上也很简单,但是有的代码别人正常,而自己就是不正常。


原因就是硬件和软件的不一致,而且发生问题无处可问。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭