前段时间在使用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
采样