前段时间在使用STM32做实验时,发现如果跑上了uC/OS-II后,再使用原来的DS1820B就读不出来温度了。因为systick又被用来给uC/OS-ii使用,又用来延时计数用了。
        在这里提供一种解决方案,将uC/OS-II的时钟节拍更改成了TIM中断产生,这样,从表面上解决了其冲突问题。此方案不是唯一,且最佳解决方案,但两者均能顺利运行。
 
附相关代码:
/*
**********************************************************************
** 配置TIM4为100Hz 中断一次
**********************************************************************
*/
void Tim_Configuration(void)
{
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  TIM_SetAutoreload(TIM4, 10);
  TIM_PrescalerConfig(TIM4, 7199, TIM_PSCReloadMode_Immediate);
  TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
  TIM_ITConfig(TIM4, TIM_IT_Trigger, ENABLE);
  TIM_Cmd(TIM4, ENABLE);
  
}
/*
**********************************************************************
** TIM4中断服务 提供uC/OS-II 时钟节拍服务
**********************************************************************
*/
void  BSP_IntHandlerTIM4(void)
{
  OS_CPU_SR cpu_sr;
  if(TIM4->SR & 0x0001)
  {
    OS_ENTER_CRITICAL();
      OSIntNesting++;
    OS_EXIT_CRITICAL();
    
    OSTimeTick();
    TIM4->SR &= ~(1 << 0);
    
    OSIntExit();
  }
}
/*
**********************************************************************
** DS18B20温度传感器采集信息显示
**********************************************************************
*/
static void TaskDS18(void *p_arg)
{
    while(DEF_TRUE)
    {
      OSTimeDlyHMSM(0, 0, 2, 0);
      Read_Temperature(&sign, &zheng, &xiao);
      //显示到LCD
      OSTimeDlyHMSM(0, 0, 1, 0);
    }
}
//下面这个函数不是我写的,是从别人的源代码里借鉴过来的
//Demo还是比较多的,参考一下就可以,这里不再赘述
/******************************************
函数名称:Read_Temperature
功    能:读取温度信息
参    数:*sign - 保存符号(零上或零下)
          *integer - 保存整数部分
          *decimal - 保存小数部分
返回值  :无
*******************************************/
void Read_Temperature(unsigned char *sign ,
                      unsigned char *interger ,
                      unsigned int *decimal)
{
    unsigned char a=0;
    unsigned char b=0;
    //volatile unsigned char c=0;
    //volatile unsigned char d=0;
    //volatile unsigned char e=0;
    
    unsigned int tmp ;
    
    DS18B20_Init();
    Write_OneByte_ToDS18b20(ROM_Read_Cmd);
  
    DS18B20_Init();
    Write_OneByte_ToDS18b20(ROM_Skip_Cmd);//跳过读序列号操作
    Write_OneByte_ToDS18b20(Convert_T); //启动温度转换
    Delay_ms(100);//等待DS18b20转换完成
    
    DS18B20_Init();
    Write_OneByte_ToDS18b20(ROM_Skip_Cmd);
    Write_OneByte_ToDS18b20(Read_Scratchpad); //读取寄存器内容(可以从寄存器0读到寄存器8)
    
    a= Read_OneByte_FromDS18b20();     //温度低8位
    b= Read_OneByte_FromDS18b20();     //温度高8位
    //c= Read_OneByte_FromDS18B20();   //TH
    //d= Read_OneByte_FromDS18B20();   //TL
    //e= Read_OneByte_FromDS18B20();   //Configuration Register
    
    Tx_ResetPulse();  //中断数据读取
    tmp = (b<<8) | a ;
    if(b & 0xF0)
    {
    *sign = 1 ;              //符号部分
    tmp = ~tmp+1 ;
    }
    else 
    {
    sign = 0 ;
    }
    *interger = (tmp>>4) & 0x00FF;  //整数部分
    *decimal = (tmp & 0x000F) * 625 ; //小数部分 
}										
					
					
							
					
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |

 
					
				
 
			
			
			
						
			 
					
				 
					
				 
					
				 
					
				 
					
				 
					
				 
					
				 
					
				 
					
				 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

