新手上路
- 积分
- 43
- 金钱
- 43
- 注册时间
- 2017-11-15
- 在线时间
- 11 小时
|
20金钱
本帖最后由 JWdouble 于 2018-1-22 17:45 编辑
INT32S SHT2X_Read(INT16S *pTmp, INT16S *pRH)
{
INT32S flag;
INT16U val;
flag = SHT2X_MeasureHM(TEMP, &val);
if (flag == ERR_TRUE)
{
val &= ~0x0003; //
*pTmp = (INT16S)((-46.85+(float)val*175.72/65536)*10);
}
else
{
return ERR_FALSE;
}
flag = SHT2X_MeasureHM(HUMIDITY, &val);
if (flag == ERR_TRUE)
{
val &= ~0x0003; //
*pRH = (INT16S)((-6.0+(float)val*125/65536)*10);
}
else
{
return ERR_FALSE;
}
return ERR_TRUE;
}
这是函数主体
SHT2X_Read(&tmp,&rh);
TMP=tmp;
RH=rh; printf("temp:%5.1fC\n temp:%5.1fC\n humi:%5.1f%%\n",TMP,RH)
这是我的调用。
编译是没有问题的,但是仿真的时候,会一直卡在这里。
如果隐掉调用程序正常运行
检查了一下,是没有死循环的
新手求帮忙
补充:
INT32S SHT2X_MeasureHM(SHT2X_MEASURE_TYPE MeaType, INT16U *pVal)
{
INT32S flag;
INT8U pBuf[3];
INT16_TypeDef i16;
//INT8U
if (MeaType == TEMP)
{
flag = I2C_Read(I2C1_ID, I2C_ADR_W, TRIG_T_MEASURE_HM, pBuf, 3);
}
else
{
flag = I2C_Read(I2C1_ID, I2C_ADR_W, TRIG_RH_MEASURE_HM, pBuf, 3);
}
if (flag == ERR_TRUE)
{
flag = SHT2X_CheckCrc(pBuf, 2, pBuf[2]);
if (flag == ERR_TRUE)
{
i16.chars.c0 = pBuf[1];
i16.chars.c1 = pBuf[0];
*pVal = i16.d;
}
}
return flag;
}
总结:感谢大佬给我解决问题的思路
INT32S SHT2X_Read(INT16S *pTmp, INT16S *pRH)
{
INT16U val;
SHT2X_MeasureHM(TEMP, &val);
return 0;
}这个函数就无法正常退出,逐步排查发现了问题出在SHT2X_MeasureHM使用的是库函数i2c读写,导致卡死bug。
while(!I2C_CheckEvent(pI2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); 卡死点
|
最佳答案
查看完整内容[请看2#楼]
如果程序是这样,可能导致卡死的原因有两个:
①死循环
②滥用指针引起的跑飞
请再次确认SHT2X_MeasureHM函数是否能够正常运行。
并确认*pTmp、*pRH是否指向了正确的地址。
建议调试策略
[mw_shl_code=c,true]INT32S SHT2X_Read(INT16S *pTmp, INT16S *pRH)
{
*pTmp=12345;//随便一个数字
*pRH=54321;//随便一个数字
return 0;
}[/mw_shl_code]
是否能正常退出。
[mw_shl_code=c,true]INT32S SHT2X_Read(IN ...
|