stm32cubemx下stm32f103讀ds18b20
環(huán)境:
IAR 7.4
stm32cubemx 4.13.1
stm32f1 1.3.1
freertos 8.1
讀ds18b20主要是時序,就是一個微秒級的delay。
先看電路:
這里使用上拉電阻,DQ設為OD模式,在讀取和輸出時,也做了PIN的方向改變,不做改變,則只能讀取到0值。
不想使用上拉電阻,則可以把DQ設為PP模式,Mbed開發(fā)板使用這個可以成功讀出。
沒有電路的代碼,是不完整的,不容易讓人理解。
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幾個毫秒的執(zhí)行。 代碼里有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; 原因就是硬件和軟件的不一致,而且發(fā)生問題無處可問。
操作ds18b20的代碼和例子非常多,實際上也很簡單,但是有的代碼別人正常,而自己就是不正常。