硬汉嵌入式论坛

 找回密码
 立即注册
查看: 825|回复: 2
收起左侧

[FreeRTOS] freertos+ds18b20读取温度不成功,为什么

[复制链接]

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2025-1-7 12:00:09 | 显示全部楼层 |阅读模式
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 */
}






回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-1-8 08:11:23 | 显示全部楼层
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
 楼主| 发表于 2025-1-8 12:02:07 | 显示全部楼层
谢谢老哥!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-26 00:23 , Processed in 0.461959 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表