This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F2418单片机8K的内存空间为何只能使用4.6K?

我去年用2418设计一款医疗器械,发现2418内存为8K,但实际上只能使用4.6K,如果我的程序内存超过4.6K,系统就崩溃,后来我做了个最简单的测试,就一个主函数,外部加了个6K的全局变量,在主函数中将这个全局变量初始化为全0,然后进行一些延时循环程序,发现程序还是崩溃!后来我也问了TI的技术支持,也是石沉大海,希望这次能解决!

  • 这个问题应该是看门狗复位引起的。

    MSP430的看门狗RESET后默认是开的。如果内存变量过多,初始化时间过长,初始化还没有完毕的情况下,可能看门狗就让MCU复位了。

    解决原理:

    在内存初始化之前把看门狗关掉。

    解决方法:

    把附件加到工程中就可以了。

  • 谢谢楼上兄弟的分析,但我从2001年到现在一直使用430,看门狗这点事我当然是知道的,我程序开始初始化是都是把看门关掉的。根本就不是看门狗的问题!

  • 请确认是否是在__low_level_init(void) 函数中关掉WDT的。很重要!

  • 谢谢您的回复,您给我的这个函数我还真没用过,不过我应该和这个没关系!6K的数组我是在程序中初始化的,而不是定义时就初始化了(那样不累死我啊),我的程序是在主函数中第一条是WTDCTL=0X5A80,关狗,然后就是对6K的数组进行赋值初始化,最后是个WHILE(1)死循环,这里main()函数入口是可以进入的,也就是执行WTDCTL=0X5A80这句我是能执行到的,然后再对6K数组初始化就出问题了,我后来看内存情况,我发现在超过4.6K的地址空间里是有数据的,如果我对超过4.6K区域的地方写数据,就会把原来的数据抹掉,然后我的系统就崩溃了,我怀疑是IAR用上这4.6K以上的RAM区干什么用了,如果我用就和它冲突了!

  • 目前手上没硬件,不能对您的建议进行验证,实在抱歉,过段时间我让人帮我焊一套硬件试试!

  • 拜托请先试一下这个函数 __low_level_init();

    MCU 复位之后其实不是马上执行你的main(). 在执行你的main()函数之前,会给程序员定义的变量分配空间。这个过程是需要消耗时间的。如果你的变量过多,在这个过程MCU就会复位。根本等不到main的执行。

    __low_level_init()函数会在系统初始化之前就执行。所以能够及时关掉WDT。

    请务必先试下,否则没有办法继续讨论你的问题。

  • 谢谢,我这几天找人焊一块板子试试,目前是试不了的了,不过,我的程序是能执行到MAIN()函数内的,我用JTAG仿真是可以在我的MAIN函数中执行语句的!比如在WDTCTL=0X5A80的下一条设置断点是可以到达的!

  • 强烈建议不要再声明变量的时候初始化

    在变量声明前加__no_init把