STM32F103 UCOSIII 加入DS18B20温度传感器 解决不能正常读数问题

发布时间 2023-03-24 22:25:44作者: yangrourou

前言:

在UCOSIII中加入DS18B20后,会发现检测出的数字特别大,而且波动很大就是一些无规则随机数一样,裸机运行明明是没问题的(这个问题困扰了3天),网上查了一下,发现出现此问题的不止我一个人,有的朋友还出现了数值一直显示为0,而且都是在移植到实时操作系统中的时候才出现这个问题。解决方法是给温度传感器单独写延时函数,修改后发现,运行成功!

这里给出代码:

time.h

#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"


void Delay_Timer_Init(void);
void Delay_Timer_us(uint32_t us_cnt);
 
#endif

time.c

#include "time.h"

void Delay_Timer_Init(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
    TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Down;
    TIM_TimeBaseInitStruct.TIM_Period = 100-1;
    TIM_TimeBaseInitStruct.TIM_Prescaler = (72-1);
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);

    while((TIM3->SR & TIM_FLAG_Update)!=SET);
    TIM3->SR = (uint16_t)~TIM_FLAG_Update;
}


void Delay_Timer_us(uint32_t us_cnt)
{
    TIM3->CNT = us_cnt-1;
    TIM3->CR1 |= TIM_CR1_CEN;
    while((TIM3->SR & TIM_FLAG_Update)!=SET);
    TIM3->SR = (uint16_t)~TIM_FLAG_Update;
    TIM3->CR1 &= ~TIM_CR1_CEN;
}

将ds18b20.c中的延时函数全部改为新写的延时函数