|
void DelayInit(void)
{
CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk;
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
DWT->CYCCNT = 0;
}
void Delay_us(uint32_t nUs)
{
uint32_t tickStart = DWT->CYCCNT;
/* 转换为nUs对应的时钟跳动次数*/
nUs *= (HAL_RCC_GetHCLKFreq() / 1000000);
/* 延时等待 */
while ((DWT->CYCCNT - tickStart) < nUs);
}
void DS18B20_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = DS18B20_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(DS18B20_GPIO_Port, &GPIO_InitStruct);
}
void DS18B20_Output(void) //Output mode
{
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Pin = DS18B20_Pin;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(DS18B20_GPIO_Port, &GPIO_InitStructure);
}
void DS18B20_Input(void) //input mode
{
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Mode = MODE_INPUT;
GPIO_InitStructure.Pin = DS18B20_Pin;
HAL_GPIO_Init(DS18B20_GPIO_Port, &GPIO_InitStructure);
}
uint8_t DS18B20_Reset(void)
{
uint8_t flag;
DS18B20_Output();
DS18B20_DQ_OUT_HIGH;
Delay_us(5);
DS18B20_DQ_OUT_LOW;
Delay_us(480);
DS18B20_DQ_OUT_HIGH;
Delay_us(60);
DS18B20_Input();
flag = DS18B20_DQ_OUT_READ;
Delay_us(480);
DS18B20_Output();
DS18B20_DQ_OUT_HIGH;
return flag;
}
void DS18B20_WriteData(uint8_t data)
{
for (uint8_t i = 0; i < 8; i++)
{
DS18B20_Output(); //Output state
DS18B20_DQ_OUT_LOW;
Delay_us(15);
if (data & 0x01)
{
DS18B20_DQ_OUT_HIGH;
}
else
{
DS18B20_DQ_OUT_LOW;
}
Delay_us(60);
DS18B20_DQ_OUT_HIGH;
data = data >> 1;
}
}
uint8_t DS18B20_ReadData(void)
{
uint8_t data = 0;
for (uint8_t i = 0; i < 8; i++)
{
data = data >> 1;
DS18B20_Output();
DS18B20_DQ_OUT_LOW;
Delay_us(1);
DS18B20_DQ_OUT_HIGH;
Delay_us(10);
DS18B20_Input();
uint8_t bitValue = HAL_GPIO_ReadPin(DQ_GPIO_Port, DQ_Pin);
if (bitValue)
data |= 0x80;
Delay_us(60);
}
return data;
}
// 读取DS18B20温度
float DS18B20_ReadTemp(void)
{
uint8_t DL, DH;
uint16_t data;
float Temperature = 0;
uint8_t flag = 0;
DS18B20_Reset();
DS18B20_WriteData(0XCC);
DS18B20_WriteData(0X44);
// 增加等待时间
Delay_us(750);
DS18B20_Reset();
DS18B20_WriteData(0XCC);
DS18B20_WriteData(0XBE);
DL = DS18B20_ReadData();
DH = DS18B20_ReadData();
data = DH;
data = data << 8;
data |= DL;
if ((data & 0XF800) == 0XF800)
{
data = ~data + 0X01;
flag = 1;
}
Temperature = data * 0.0625;
if (flag == 1)
{
Temperature = -Temperature;
}
return Temperature;
}
void StartDefaultTask(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for (;;) {
taskENTER_CRITICAL();
#ifdef DS18B20_WATER_TEMP_SENSOR
if(DS18B20_Reset() == GPIO_PIN_RESET){
sys_state.water_temp = DS18B20_ReadTemp();
}else{
printf("no sensor!\n");
}
#endif
//get_time_date(RTCtime, RTCdate);
taskEXIT_CRITICAL();
}
/* USER CODE END StartDefaultTask */
}
|
|