这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » STM32运行uC/OS-II与DS1820B采样冲突解决方案之一

共1条 1/1 1 跳转至

STM32运行uC/OS-II与DS1820B采样冲突解决方案之一

院士
2012-02-21 10:04:47     打赏
       前段时间在使用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 ; //小数部分
}



关键词: STM32     运行     OS-II     DS1820B     采样    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]