xjmlfm1 发表于 2019-5-26 23:34:40

MSP430F5438A程序运行RAM乱的问题

用MSP430F5438A很多年了,也做过很多款产品,最近在一款产品上遇到了问题,前前后后折腾了半年也没解决,所以来向大家求救,看有没有遇到过同样问题的同行。

问题描述:
为了方便理解,这里把前因后果简化一下,简化的验证过程见下面的验证过程。
1、程序刚上电时首先会无条件初始化一个数组变量,此后运行时程序只会读这个数组,不会修改。
2、烧入程序后,大部分情况下都正常,但当多次掉电上电时,这个数组里的值会出错,并且一旦出错以后,再多次重上电,此数组的值仍然不对,并且错误值保持不变。

验证过程:
1、这个数组是一个变量,刚上电时,CPU会去外部EEPROM里读取这个变量的值。最开始怀疑是程序运行异常,导致把错误的数值写入了EEPROM,以致于后来每次上电都出错。
2、于是在一次试验时,把EEPROM的7脚接高电平,这时候在显示界面上设置这个参数,确实存不住,但当多次掉电上电时,此数组的值还是会出错。并且多次上电后,错误值一致。
3、程序里有机制,当从EEPROM中读不到写入标志时,则认为是装置第一次上电,这时候会用默认参数来写入这个变量,于是做实验,把板子上的EEPROM拆掉,每次上电时看此数组的值是否是默认参数。经过观察,多次上电后,还是会出错,出错后,多次上电后,错误值一致。


问题分析:
1、此数组是变量,就算是程序运行异常,或者有数组越界,导致此数组被错误的修改,那为什么会一旦出错后,以后每次上电都是错的,并且每次的值都一样呢?
2、加同样的外部输入量,多个产品同时实验时,有的会乱,有的不会乱。如果是数组越界,按理说应该都是一样的乱,为什么有的不会乱呢?
3、实际上,一开始我就怀疑是数组越界了,试验时,将所有的功能都屏蔽掉,只留下了必须留的程序,以方便查看参数有没有乱,这样还是会乱。而留下的那部分程序,除了初始化部分,剩下的就是显示部分,只要程序正常,几乎没有越界的可能性。
4、也怀疑过是干扰,在电源上加电快速瞬变3KV,信号线上加2KV,反复掉电上电,也不会乱,说明乱参数跟干扰没有必然联系。
5、怀疑过是电源质量不好,于是用线性电源供电,多次掉电上电时也还是会乱。

芯片配置:
1、芯片用的是MSP430F5438A,外部接32.768K时钟,内部550倍PLL,内核电压升高到1.9V。
2、3个定时器都用到了,4个串口都用到了,还有ADC,就用到这些外设。

dianyuan 发表于 2019-5-27 08:59:58

用MSP430F149曾出现过flash数据丢失问题,现场返回重新写程序后功能恢复正常

xjmlfm1 发表于 2019-5-27 09:09:11

dianyuan 发表于 2019-5-27 08:59
用MSP430F149曾出现过flash数据丢失问题,现场返回重新写程序后功能恢复正常

我现在这现象,flash丢失数据都解释不通,就算丢失了,应该是程序功能不正常了,怎么会导致变量出错呢?并且是一旦出错以后,每次都是错的,还错的一样。

yangsen 发表于 2019-5-27 09:43:55

你掉电是单片机完全没电了还是只是测试快速上下电?如果是后者你要检查一下你的复位电路在掉电后是否可靠复位。

xjmlfm1 发表于 2019-5-27 09:56:05

yangsen 发表于 2019-5-27 09:43
你掉电是单片机完全没电了还是只是测试快速上下电?如果是后者你要检查一下你的复位电路在掉电后是否可靠复 ...

掉电3分钟再上电3分钟,用时间继电器来试的。

KongQuan 发表于 2019-5-27 10:03:43

如果堆栈设置太小, 调用函数多层,并且局部函数较大,也会出现这种问题。

yangsen 发表于 2019-5-27 10:20:24

xjmlfm1 发表于 2019-5-27 09:56
掉电3分钟再上电3分钟,用时间继电器来试的。

掉电3分钟你电路里是不是有大电容蓄能?出问题时候手动强制复位,给复位脚一个复位信号是不是就正常了?用示波器看看你复位脚的波形是不是下降的很慢?MSP430F5438A应该有BOR设置的多少?

1a2b3c 发表于 2019-5-27 10:28:00

ram里面数组乱了后再次开机还是没有变?那你怎么知道错了/乱了?有查错措施?那么肯定会再次去初始化数组?加一个指示呗,点个灯也好,串口打印下也好,表示你的确去做了初始化工作,

xjmlfm1 发表于 2019-5-27 10:50:33

KongQuan 发表于 2019-5-27 10:03
如果堆栈设置太小, 调用函数多层,并且局部函数较大,也会出现这种问题。 ...

堆栈设置了2K,也没效果。
并且试过用默认值,编译出来的结果是一模一样的,也是没效果。

xjmlfm1 发表于 2019-5-27 10:51:53

1a2b3c 发表于 2019-5-27 10:28
ram里面数组乱了后再次开机还是没有变?那你怎么知道错了/乱了?有查错措施?那么肯定会再次去初始化数组? ...

因为这个数组里的值跟显示界面有关,乱了以后,显示的相应区域也是乱的。
除非程序运行不正常了,否则这个数组一定会初始化的。

xjmlfm1 发表于 2019-5-27 10:53:43

yangsen 发表于 2019-5-27 10:20
掉电3分钟你电路里是不是有大电容蓄能?出问题时候手动强制复位,给复位脚一个复位信号是不是就正常了? ...

没有大电容,设计的掉电保持时间是500ms,实际大概800ms的样子,不可能撑3分钟的。
BOR用默认值试过,也是乱,印象中好像设置过1.4V,也还是乱,没效果。

Wisen 发表于 2019-5-27 11:00:43

请问
1.测试的时候环境温度有改变过吗,供电电压调高或者调低有试过吗?
2.是否有外部复位芯片?
3.如果不掉电,只是复位会出现这样的问题吗?
4.上电初始化顺序是怎么样的,初始化所述数组变量之前做了什么操作?

as9901 发表于 2019-5-27 11:03:20

你的程序里有写flash么?如果有把写flash程序删掉试试。

xjmlfm1 发表于 2019-5-27 11:39:54

Wisen 发表于 2019-5-27 11:00
请问
1.测试的时候环境温度有改变过吗,供电电压调高或者调低有试过吗?
2.是否有外部复位芯片?


回答:
1、环境温度没有刻意变过,就是在实验室测试的。装置内部有ACDC电源,我试过把5V调到4.85V或5.15V,没效果,也试过加2级LC滤波,同样没效果。
2、没有外部复位芯片,但有RC复位电路,且R上有并联二极管。
3、只复位没有测试过,因为需要多次长时间测试才发出现,人工去试效率太低了。
4、上电后首先是时钟初始化,然后就是从EEPROM读参数,然后根据参数去初始化相应的外设,如串口什么的。从EEPROM读出参数后,后面只用这些参数,修改的时候只有界面和通讯才会修改。

xjmlfm1 发表于 2019-5-27 11:40:46

as9901 发表于 2019-5-27 11:03
你的程序里有写flash么?如果有把写flash程序删掉试试。

程序里没有写FLASH的操作,因为有外部EEPROM存储器,所以程序没有在FLASH里存东西。

KongQuan 发表于 2019-5-27 12:07:40

xjmlfm1 发表于 2019-5-27 10:50
堆栈设置了2K,也没效果。
并且试过用默认值,编译出来的结果是一模一样的,也是没效果。 ...

那就加校验试试,如果发现错了,重新从ee读数据。

1a2b3c 发表于 2019-5-27 12:16:51

xjmlfm1 发表于 2019-5-27 10:51
因为这个数组里的值跟显示界面有关,乱了以后,显示的相应区域也是乱的。
除非程序运行不正常了,否则这 ...

个人认为你的架构设计还是不安全/健全,怎么的你也该弄个校验值啊,这样照问题也方便些,不过你现在可以加上进行测试,到底流程是不是对的,逻辑/流程对了再来找硬件/芯片本身的问题

yangsen 发表于 2019-5-27 12:26:16

xjmlfm1 发表于 2019-5-27 10:53
没有大电容,设计的掉电保持时间是500ms,实际大概800ms的样子,不可能撑3分钟的。
BOR用默认值试过,也 ...

掉电保持?什么概念?有主备电切换?是不是备电没有完全切掉,从描述现象上看大概率是掉电后电源缓慢下降造成复位不良。

Wisen 发表于 2019-5-27 12:52:34

xjmlfm1 发表于 2019-5-27 11:39
回答:
1、环境温度没有刻意变过,就是在实验室测试的。装置内部有ACDC电源,我试过把5V调到4.85V或5.15V ...

第一点指的不是上一级的电压,指的是芯片的电压,如2.8V、3.3V这些
使用RC复位电路和专用复位芯片在主程序里边刚上电的时候还是有点区别的好些,专用芯片上电后大都是百ms级的延时,电压什么的肯定稳定了,这时候再运行程序就很可靠,
但用RC的时候建议在操作与数据相关初始化之前先做几十ms延时

xjmlfm1 发表于 2019-5-27 13:17:56

Wisen 发表于 2019-5-27 12:52
第一点指的不是上一级的电压,指的是芯片的电压,如2.8V、3.3V这些
使用RC复位电路和专用复位芯片在主程 ...

这个也试过的
在上电后先延时200ms再去初始化时钟,时钟稳定后再延时200ms,但是没效果,还是会乱。

xjmlfm1 发表于 2019-5-27 13:19:51

KongQuan 发表于 2019-5-27 12:07
那就加校验试试,如果发现错了,重新从ee读数据。

有校验的,在写入时和读出时都有CRC校验,写入后会重新读出来看CRC是否正确。上电时也会对比CRC,如果50次都读不对,就会使用默认参数。
现在乱的时候很离谱,不是默认参数,完全是非法参数。

xjmlfm1 发表于 2019-5-27 13:21:56

1a2b3c 发表于 2019-5-27 12:16
个人认为你的架构设计还是不安全/健全,怎么的你也该弄个校验值啊,这样照问题也方便些,不过你现在可以 ...

参数写入和读出时,有加CRC校验的

而且后来为了确定到底是程序正常运行时改动了,还是完全不受控的改动,我在所有能写入参数的地方把另一个从来没乱过的参数改成了一个特殊值,但在多次上电参数乱了以后,这个特殊的参数没有变化,还是原始值。

xjmlfm1 发表于 2019-5-27 13:23:22

本帖最后由 xjmlfm1 于 2019-5-27 13:24 编辑

yangsen 发表于 2019-5-27 12:26
掉电保持?什么概念?有主备电切换?是不是备电没有完全切掉,从描述现象上看大概率是掉电后电源缓慢下降 ...

其实就是ACDC里的高压电容用大一点的
我设计的ACDC的功率为4W,400V电容用22uF的,这样220掉电后,装置还能继续工作500ms的样子。

并且复位不良解释不了一旦乱了以后,每次都是乱的,并且乱的一样。

擦鞋匠 发表于 2019-5-27 15:59:50

没道理,我跟楼主的机制几乎完全相同,我也用msp430f5438a,也是外部低速晶振,也是使用外部eeprom用来存储掉电数据,只不过我仅仅倍频到8M主频,因此内核电压只需1.4v即可。

xjmlfm1 发表于 2019-5-27 16:18:12

擦鞋匠 发表于 2019-5-27 15:59
没道理,我跟楼主的机制几乎完全相同,我也用msp430f5438a,也是外部低速晶振,也是使用外部eeprom用来存储 ...

我也降频试过,降频到16M,一样有问题,难道我也要降到8M才行?

xjmlfm1 发表于 2019-5-27 16:19:50

擦鞋匠 发表于 2019-5-27 15:59
没道理,我跟楼主的机制几乎完全相同,我也用msp430f5438a,也是外部低速晶振,也是使用外部eeprom用来存储 ...

其实程序跑飞了,死机了,复位了,指针乱了,这些都能理解,都算是比较常规的问题。
但CPU在什么情况下出错了,会导致每次上电都无条件初始化的变量出错了?并且从此以后每次都错成一样的,这点是我百思不得其解的。

擦鞋匠 发表于 2019-5-27 19:32:09

xjmlfm1 发表于 2019-5-27 16:19
其实程序跑飞了,死机了,复位了,指针乱了,这些都能理解,都算是比较常规的问题。
但CPU在什么情况下出 ...

因为我也使用msp430f5438a,因此我对您的这个问题很是好奇。
我猜测:
1、有没有可能,当你掉电(如果写入长度超过一个扇区,可能掉电后写入eeprom电压低于eeprom写电压)导致写入eeprom的数据出错?
2、芯片会不会版本不同,可能需要查找勘误手册(我使用的REV:F)。

xjmlfm1 发表于 2019-5-27 19:35:04

擦鞋匠 发表于 2019-5-27 19:32
因为我也使用msp430f5438a,因此我对您的这个问题很是好奇。
我猜测:
1、有没有可能,当你掉电(如果写 ...

1、首先在没人操作时,不会有写入的动作,其次就算有写入,应该是EEPROM里的数据本身就是错误的,但实际上不是这样的。再次,我把EEPROM的7脚接高电平时仍然会乱,说明不是写入造成的。
2、芯片版本没有查,但这个也太不可思议了,用芯片BUG都没法解释。

zhiyuan1106 发表于 2019-5-27 19:51:45

用5438很多年了,没遇到相关困扰啊!我认为仔细查一下代码把   一行一行的检查,特别注意memset,memcpy,以及一些循环。以前熬夜查bug,查出是memset带参数的问题。

xjmlfm1 发表于 2019-5-27 20:15:57

zhiyuan1106 发表于 2019-5-27 19:51
用5438很多年了,没遇到相关困扰啊!我认为仔细查一下代码把   一行一行的检查,特别注意memset,memcpy, ...

你用5438是做的电力产品吗?如果是的话,能PM一下详细聊下吗?

zhiyuan1106 发表于 2019-5-27 20:23:36

xjmlfm1 发表于 2019-5-27 20:15
你用5438是做的电力产品吗?如果是的话,能PM一下详细聊下吗?

是的   做故障指示器,配网相关的。以前做用电

擦鞋匠 发表于 2019-5-30 17:23:21

1a2b3c 发表于 2019-5-27 12:16
个人认为你的架构设计还是不安全/健全,怎么的你也该弄个校验值啊,这样照问题也方便些,不过你现在可以 ...

您好,诚恳的向您请教一个问题:

当设备重新上电,(如果增加校验)是指从EEPROM上读出数据后首先进行某种方式的校验,只有校验通过,才将读出的数据拷贝/写入到实际的RAM中。是这个意思吧?

我的疑问是:
如果设备重新上电后,它本身RAM中的数据(这里是指静态RAM)肯定是初始化为0,肯定是不能直接使用的,假设EEPROM中读出的数据校验出错,我们也没有其它更好的途径啊,还是只能使用EEPROM中的数据。所以意义不大啊。

想来想去,如果说唯一的优点,也就可以增加一个EEPROM出错的log用来通知/提醒用户,仅此而已。

1a2b3c 发表于 2019-5-30 19:22:38

擦鞋匠 发表于 2019-5-30 17:23
您好,诚恳的向您请教一个问题:

当设备重新上电,(如果增加校验)是指从EEPROM上读出数据后首先进行某 ...

请教不敢当,不过不是很明白你的意思,
但是作为思路上来讲,外部存储的参数,肯定是需要验证存的信息或者读回来的信息是不是正确的,反正是各种校验吧,
其次可以是可以多份信息拷贝存储,一个坏了看看另外的是不是也坏了,
如果确实坏彻底了,没救了,那么就调用默认参数,然后提醒用户可能需要重新设置,

至于前面讨论的那些,ram里面的信息不实自己想要的,但是校验确实正确的,这个恐怕只有考虑是源头就是错误(参数不是系统范围内的,但是校验通过)的信息,这样才能通过校验,至于怎么会出现自己不需要的信息,无非就是写代码水平有待提高,要么就是自己系统的具体设计,比如参数没有限定范围什么的
乱说的,供参考

擦鞋匠 发表于 2019-5-31 09:02:31

1a2b3c 发表于 2019-5-30 19:22
请教不敢当,不过不是很明白你的意思,
但是作为思路上来讲,外部存储的参数,肯定是需要验证存的信息或 ...

感谢指教!谢谢

liuzq1981 发表于 2019-5-31 09:20:57

外部电压监测复位芯片要加,在主程序开始加500ms延时。

xjmlfm1 发表于 2019-5-31 09:29:38

liuzq1981 发表于 2019-5-31 09:20
外部电压监测复位芯片要加,在主程序开始加500ms延时。

这个真没加,目前我也是怀疑这里,正在加上复位芯片后做实验。

xjmlfm1 发表于 2019-6-7 20:05:05

本帖最后由 xjmlfm1 于 2019-6-7 20:10 编辑

继续更新此问题
1、按前一步的想法,加上了2.93V的复位芯片,用示波器实测有效,然后把EEPROM的7脚跟8脚连一块,也就是把存储器的WP接高电平,此时参数一切正常,多次(少于10次)上电断电也正常,然后一样的方案改了3台,每3分钟上电一次,跑了一晚上,3台参数全部乱了,让他把EEPROM拆下来读出来,发现EEPROM内的参数是对的,没有被改写。由于是远程指导对方做的这个实验,所以没法让他把程序读成出来对比程序有没有变化。但让他不做任何操作,把程序换一下,参数就正常了。
2、今天继续实验,EEPROM正常焊接,正常的程序正常运行,刚开始正常,运行几个小时后,参数乱了,中间确定没有断过电,也确定一开始上电时是正常的,乱了以后,把EEPROM的内容读出来,发现EEPROM的参数被改写了。
编辑补充:第2个实验后,让他把程序读出来了,对比了一下烧入的程序,发现TXT文件完全一致,也就是程序没有被改写。
就今天这2个现象,发现没法分析问题点了,从第1个现象分析,应该是干扰之类的原因,导致单片机的FLASH乱了,只是没法读出程序来验证,但EEPROM内部没有乱,程序一开始也能正常读取参数,多次上电后就不行了,换程序后又正常了,推测应该就是FLASH乱了,没有其它更合理的解释。从第2个现象分析,又似乎是程序本身有BUG导致的RAM溢出之类的,然后去改写了EEPROM,但如果是这个原因,显然没法达到第1个实验的那种效果。所以,貌似又走向死胡同了。

gnail092 发表于 2021-1-31 10:04:27

xjmlfm1 发表于 2019-6-7 20:05
继续更新此问题
1、按前一步的想法,加上了2.93V的复位芯片,用示波器实测有效,然后把EEPROM的7脚跟8脚连 ...

楼主,最后解决了吗,找到原因没

powmod 发表于 2021-5-13 11:01:07

楼主吉祥,您之前的马达驱动线路可以分享一下吗?有偿
页: [1]
查看完整版本: MSP430F5438A程序运行RAM乱的问题