OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4425|回复: 4

感觉死机了

[复制链接]

79

主题

127

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
465
金钱
465
注册时间
2013-2-19
在线时间
1 小时
发表于 2013-7-25 21:41:45 | 显示全部楼层 |阅读模式

请问: 使用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;
 } 
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-25 23:33:46 | 显示全部楼层
回复【楼主位】victor3l:
---------------------------------
你能不能仿真跟踪下?看看具体在哪一句死机?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

79

主题

127

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
465
金钱
465
注册时间
2013-2-19
在线时间
1 小时
 楼主| 发表于 2013-7-26 07:15:41 | 显示全部楼层
回复【2楼】正点原子:
回复【楼主位】victor3l: --------------------------------- 你能不能仿真跟踪下?看看具体在哪一句死机?
---------------------------------谢谢原子大侠的热心。
我用JLink仿真都可以走通的。
另外再问一个问题:
我想要每秒钟采集一次数据,每一秒中将处理的结果通过串口发到上位机。请问我只用一个定时器定时1秒,来同时做这两件事,还是用两个定时器各自定时1秒分别作了?
回复 支持 反对

使用道具 举报

头像被屏蔽

6168

主题

7036

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
19705
金钱
19705
注册时间
2012-12-27
在线时间
25 小时
发表于 2013-7-26 09:15:25 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-26 10:11:58 | 显示全部楼层
回复【3楼】victor3l:
---------------------------------
说明没死机了,那.
看看是不是和外部输入有关了.
定时器用一个就够了.处理完后发送就是了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-17 12:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表