请问: 使用stm32时发现下载程序后,正常运行一段时间,就停下了,不知道什么原因,该怎么解决?当再次按下复位键又能运行一段时间。 停下的时候,连定时器的中断也进不去。
麻烦大家帮我看看,当我屏蔽下面两个函数后就没有死机的现象了,这两个函数有什么错误:
/***
计算零点
1,读出各个通道系数,这里先当成整数读,在最后计算出总重后,把总重缩小1000倍。因为这里的系数都是三位小数
2,计算各个通道的内码值
3,各个通道内码值乘以各个通道的系数,求和
4,总重缩小1000倍
清零键按下后,就执行该函数。
***/
void CalcZero(void)
{
u16 oneCoef = 0;//通道1的系数
u16 twoCoef = 0;//通道2的系数
u16 thdCoef = 0;
float oneZero = 0.0;//通道 1的零点值
float twoZero = 0.0;
float thdZero = 0.0;
//读系数(把系数先扩大1000,这样就减少浮点乘法的计算次数,只在最后一次进行一次浮点乘法)
oneCoef = factOne[0] * 1000 + factOne[1] * 100 + factOne[2] * 10 + factOne[3];
twoCoef = factTwo[0] * 1000 + factTwo[1] * 100 + factTwo[2] * 10 + factTwo[3];
thdCoef = factThr[0] * 1000 + factThr[1] * 100 + factThr[2] * 10 + factThr[3];
//得到初始内码值
oneZero = oneCoef * FilterChOne();
if(1 == codeFlgOne) //内码值是负的
{
oneZero = -oneZero;//这样做的目的正是在计算总重是需要负数的,但是滤波后的数据都是显示绝对值的,根据标志来把负数的绝对值还原成负数。
}
else if(0 == codeFlgOne)
{
oneZero = oneZero;
}
twoZero = twoCoef * FilterChTwo();
if(1 == codeFlgTwo) //内码值是负的
{
twoZero = -twoZero;//
}
else if(0 == codeFlgTwo)
{
twoZero = twoZero;
}
thdZero = thdCoef * FilterChThd();
if(1 == codeFlgThd) //内码值是负的
{
thdZero = -thdZero;//
}
else if(0 == codeFlgThd)
{
thdZero = thdZero;
}
//这里的零点会是负的
zero = (oneZero + twoZero + thdZero ) * 0.001 ; //这里乘以0.001是因为前面的系数扩大了1000
}
//说明:当执行下面的函数后很快死机。2013年7月25日21:37:53
void CalcWeight(void)
{
u16 bufSaveZero[9] = {0};//用来保存读回来的零点
float readZero = 0.0;
u16 CoefCHOne = 0;
u16 CoefCHTwo = 0;
u16 CoefCHThd = 0;
float oneADVal = 0.0;//通道 1的AD值
float twoADVal = 0.0;
float thdADVal = 0.0;
FlashRead(0x800e400,bufSaveZero,9); //读出零点
readZero = bufSaveZero[0] * 10000 + bufSaveZero[1] *1000 + bufSaveZero[2] *100 + bufSaveZero[3] * 10 + bufSaveZero[4]
+ bufSaveZero[5]*0.1 + bufSaveZero[6] * 0.01 + bufSaveZero[7] * 0.001;
if(bufSaveZero[8] == 1)
{
readZero = -readZero;//说明零点是负的
}
else if(0 == bufSaveZero[8])
{
readZero = readZero;//零点是正的
}
//计算当前AD值
//读系数(把系数先扩大1000,这样就减少浮点乘法的计算次数,只在最后一次进行一次浮点乘法)
CoefCHOne = factOne[0] * 1000 + factOne[1] * 100 + factOne[2] * 10 + factOne[3];
CoefCHTwo = factTwo[0] * 1000 + factTwo[1] * 100 + factTwo[2] * 10 + factTwo[3];
CoefCHThd = factThr[0] * 1000 + factThr[1] * 100 + factThr[2] * 10 + factThr[3];
//得到初始内码值
oneADVal = CoefCHOne * FilterChOne();
if(1 == codeFlgOne) //内码值是负的
{
oneADVal = -oneADVal;//这样做的目的正是在计算总重是需要负数的,但是滤波后的数据都是显示绝对值的,根据标志来把负数的绝对值还原成负数。
}
else if(0 == codeFlgOne)
{
oneADVal = oneADVal;
}
twoADVal = CoefCHTwo * FilterChTwo();
if(1 == codeFlgTwo) //内码值是负的
{
twoADVal = -twoADVal;//
}
else if(0 == codeFlgTwo)
{
twoADVal = twoADVal;
}
thdADVal = CoefCHThd * FilterChThd();
if(1 == codeFlgThd) //内码值是负的
{
thdADVal = -thdADVal;//
}
else if(0 == codeFlgThd)
{
thdADVal = thdADVal;
}
total = (oneADVal + twoADVal + thdADVal)*0.001 - readZero; //三个通道当前值之和减去总的零点值 就是实际总重AD值 ,乘以0.001的原因是前面的系数扩大100倍
if(total > 0)
{
totalFlg = 0;
}
else
{
totalFlg = 1;
}
}
|