前段时间在使用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 ; //小数部分
}
我要赚赏金打赏帖 |
|
|---|---|
| 【FreeRtos】FreeRtos + MPU模块的配置使用被打赏¥32元 | |
| 【分享开发笔记,赚取电动螺丝刀】墨水屏文本显示器被打赏¥25元 | |
| 【STEVAL-STWINKT1B】:结合STMcubeMX读取磁力计iis2mdc被打赏¥19元 | |
| 【STEVAL-STWINKT1B】:结合STMcubeMX读取LPS22HH气压、温度被打赏¥19元 | |
| 【STEVAL-STWINKT1B】:结合STMcubeMX读取STTS751温度被打赏¥17元 | |
| 【STEVAL-STWINKT1B】:结合STMcubeMX软件读取HTS221温湿度被打赏¥22元 | |
| M5PAPERESP32EINKDEVKIT评测|使用MicroPython开发M5Paper被打赏¥15元 | |
| OK1126B-S开发板下以导航按键控制云台/机械臂姿态调整被打赏¥29元 | |
| 【树莓派5】便携热成像仪被打赏¥36元 | |
| 【树莓派5】环境监测仪被打赏¥35元 | |
我要赚赏金
