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

共12条 1/2 1 2 跳转至

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     采样    

高工
2012-02-21 10:36:16     打赏
2楼
STM32跑系统了?收藏一下,mark,留着

高工
2012-02-21 19:37:13     打赏
3楼

这贴不错~!学习了~!


菜鸟
2012-03-08 15:04:30     打赏
4楼

这贴不错~!学习了~!



助工
2012-03-31 14:50:25     打赏
5楼
学习!

高工
2012-06-19 19:38:20     打赏
6楼
受教了,多谢楼主

菜鸟
2012-06-20 14:35:01     打赏
7楼
我都是将延时用tim来查询。

菜鸟
2012-07-17 13:29:00     打赏
8楼
可以不用这个使用stick啊,自己写一个delay

工程师
2012-07-18 09:34:37     打赏
9楼
不错,学习中……

专家
2012-07-18 09:54:40     打赏
10楼
收藏学习了

共12条 1/2 1 2 跳转至

回复

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