使用的是PG8,无法正常运行,程序一直显示
DS18B20_Init()初始化失败,uint8_t DS18B20_Check(void)的返回值打印出来显示为240,求高手指教
#include "delay.h"
static u8 fac_us=0;//us延时倍乘数
static u16 fac_ms=0;//ms延时倍乘数,在os下,代表每个节拍的ms数
//初始化延迟函数
//当使用OS的时候,此函数会初始化OS的时钟节拍
//SYSTICK的时钟固定为AHB时钟的1/8
//SYSCLK:系统时钟频率
void delay_init(u8 SYSCLK)
{
#if SYSTEM_SUPPORT_OS //如果需要支持OS.
u32 reload;
#endif
SysTick->CTRL&=~(1<<2);//SYSTICK使用外部时钟源
fac_us=SYSCLK/8;//不论是否使用OS,fac_us都需要使用
#if SYSTEM_SUPPORT_OS //如果需要支持OS.
reload=SYSCLK/8;//每秒钟的计数次数 单位为M
reload*=1000000/delay_ostickspersec;//根据delay_ostickspersec设定溢出时间
//reload为24位寄存器,最大值:16777216,在168M下,约合0.7989s左右
fac_ms=1000/delay_ostickspersec;//代表OS可以延时的最少单位
SysTick->CTRL|=1<<1; //开启SYSTICK中断
SysTick->LOAD=reload; //每1/delay_ostickspersec秒中断一次
SysTick->CTRL|=1<<0; //开启SYSTICK
#else
fac_ms=(u16)fac_us*1000;//非OS下,代表每个ms需要的systick时钟数
#endif
}
void delay_us(u32 nus)
{
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD;
ticks=nus*fac_us;
told=SysTick->VAL;
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{
if(tnow
else tcnt+=reload-tnow+told;
told=tnow;
if(tcnt>=ticks)break;
}
};
}
void delay_ms(u16 nms)
{
u32 i;
for(i=0;i
}
#ifndef __DELAY_H
#define __DELAY_H
#include "stm32f4xx_hal.h"
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
void delay_init(u8 SYSCLK);
void delay_ms(u16 nms);
void delay_us(u32 nus);
#endif
#include "ds18b20.h"
#include "delay.h"
//配置DQ信号线IO口的输入输出
void DS18B20_PortConfig(uint8_t dir)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOG_CLK_ENABLE();
if(dir == 1)
{
GPIO_InitStruct.Pin = DS18B20_BIT;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
HAL_GPIO_Init(DS18B20_PORT, &GPIO_InitStruct);
}
else
{
GPIO_InitStruct.Pin = DS18B20_BIT;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(DS18B20_PORT, &GPIO_InitStruct);
}
}
//复位DS18B20
void DS18B20_Rst(void)
{
DS18B20_PortConfig(1);
//SET_DS18B20(); //使PA2输出高电平,原子例程无此语句
CLR_DS18B20(); //拉低DQ
delay_us(750); //拉低750us
SET_DS18B20();; //DQ=1
delay_us(15); //15US
}
//等待DS18B20的回应
//返回1:未检测到ds18b20的存在
//返回0:存在
uint8_t DS18B20_Check(void)
{
uint8_t retry=0;
DS18B20_PortConfig(0);
while (DS18B20_DQ_IN&&retry<200)
{
retry++;
delay_us(1);
};
if(retry>=200){printf("retry=:%d",retry);return 1;}
else retry=0;
while (!DS18B20_DQ_IN&&retry<240)
{
retry++;
delay_us(1);
};
if(retry>=240){printf("retry=:%d",retry);return 1;}
return 0;
}
//从DS18B20读取一个位
//返回值:1/0
uint8_t DS18B20_Read_Bit(void) // read one bit
{
uint8_t data;
DS18B20_PortConfig(1);
CLR_DS18B20(); //拉低DQ
delay_us(2);
SET_DS18B20();; //DQ=1
DS18B20_PortConfig(0);
delay_us(12);
if(DS18B20_DQ_IN)data=1;
else data=0;
delay_us(50);
return data;
}
//从ds18b20读取一个字节
//返回值:读取到的数据
uint8_t DS18B20_Read_Byte(void) // read one byte
{
uint8_t i,j,dat;
dat=0;
//DS18B20_PortConfig(1);//原子例程无此语句
for (i=1;i<=8;i++)
{
j=DS18B20_Read_Bit();
dat=(j<<7)|(dat>>1);
}
return dat;
}
//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(uint8_t dat)
{
uint8_t j;
uint8_t testb;
DS18B20_PortConfig(1);//SET PA0 OUTPUT;
for (j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if (testb)//写1
{
CLR_DS18B20(); //DS18B20_DQ_OUT=0;// Write 1
delay_us(2);
SET_DS18B20(); //DS18B20_DQ_OUT=1;
delay_us(60);
}
else//写0
{
CLR_DS18B20(); //DS18B20_DQ_OUT=0;// Write 0
delay_us(60);
SET_DS18B20(); //DS18B20_DQ_OUT=1;
delay_us(2);
}
}
}
//开始温度转换
void DS18B20_Start(void)// ds1820 start convert
{
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom
DS18B20_Write_Byte(0x44);// convert
}
//初始化DS18B20的IO口DQ同时检查DS的存在
//返回1:不存在
//返回0:存在
uint8_t DS18B20_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOG_CLK_ENABLE();
GPIO_Initure.Pin=DS18B20_BIT;
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_Initure.Pull=GPIO_PULLUP;
GPIO_Initure.Speed=GPIO_SPEED_HIGH;
HAL_GPIO_Init(DS18B20_PORT,&GPIO_Initure);
DS18B20_Rst();
return DS18B20_Check();
}
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值(-550~1250)
short DS18B20_Get_Temp(void)
{
uint8_t temp;
uint8_t TL,TH;
short tem;
DS18B20_Start(); // ds1820 start convert
DS18B20_Rst();
DS18B20_Check();
DS18B20_Write_Byte(0xcc);// skip rom
DS18B20_Write_Byte(0xbe);// convert
TL=DS18B20_Read_Byte(); // LSB
TH=DS18B20_Read_Byte(); // MSB
if(TH>7)
{
TH=~TH;
TL=~TL;
temp=0; //温度为负值
}else temp=1; //温度为正
tem=TH; //获得高8位
tem<<=8;
tem+=TL; //获得低8位
tem=(float)tem*0.625; //转换
if(temp)return tem; //返回温度值
else return -tem;
}
#ifndef __DS18B20_H
#define __DS18B20_H
#include "stm32f4xx_hal.h"
#define DS18B20_BITGPIO_PIN_8
#define DS18B20_PORTGPIOG
#define CLR_DS18B20()HAL_GPIO_WritePin (DS18B20_PORT,DS18B20_BIT,GPIO_PIN_RESET )
#define SET_DS18B20()HAL_GPIO_WritePin (DS18B20_PORT,DS18B20_BIT,GPIO_PIN_SET )
#define DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_BIT)
uint8_t DS18B20_Init(void); //初始化DS18B20
short DS18B20_Get_Temp(void); //获取温度
void DS18B20_Start(void); //开始温度转换
void DS18B20_Write_Byte(uint8_t dat);//写入一个字节
uint8_t DS18B20_Read_Byte(void); //读出一个字节
uint8_t DS18B20_Read_Bit(void); //读出一个位
uint8_t DS18B20_Check(void); //检测是否存在DS18b20
void DS18B20_Rst(void); //复位DS18B20
#endif