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.

关于MSP430F5438A跑飞的问题

Other Parts Discussed in Thread: MSP430F5438A

在用msp430F5438A 做项目的时候,我发现MCU莫名其妙的跑偏,开始的时候我觉得肯定是我的程序的问题,但是后来,我跟公司的几个工程师讨论的时候发现这个现象很奇怪。

   问题1:在使用单步调试的时候,程序没有问题,但是在全速的时候会出现跑偏(关门狗是关闭的),我关闭的原因在于MCU是不会卡死的,我很奇怪的是的,单步运行和全速运行,结果是不一样,可能是关键处理的地方没有加上延时,所以我加上的1000ns的延时,使用本征函数延时,后来发现,还是不行,有几个参数跑偏,莫名其妙的跑偏,比如,我定义个一个参数

volatile int switch_flag=0;这个数只在 0,2 ,4,6,8,几个范围变化,但是在全速运行的时候,switch_flag会跳到33 ,38,我分析问题之后,无法知道为什么会变成这样,我开始以为是在中断处理中跑偏,但是后来我把程序放在主程序中,还是出现这种现象。

我想问下:出现跑偏的情况,可能有几种,在使用

switch (sw_flag)

{

case :0

break;

case:2

break;

case:4

break;

case6

default:

break;

}

我发现程序在处理的时候,会出现跳入defalut中,然后我一个重要的参数全部都乱跳。现在完全不知道可能的原因在哪,希望得到您的回答,谢谢。

  • 我也出现过这样情况,是时钟配置最高CLK=25M,需要打开核电压,升高MCU。

    解决方案:

    1.确认你的CLK,如果CLK太高,需要打开 static void SetVcoreUp (unsigned int level);这个函数官方有代码。

    希望能帮助你。

  • 我想问下这个函数,哪里有,官方有代码 ,没有找到啊,能否给个链接,谢谢了~~~

  • 我想问下这个函数,哪里有,官方有代码 ,没有找到啊,能否给个链接,谢谢了~~~

  • void SetVcoreUp (unsigned int level)

    {

     // Open PMM registers for write

     PMMCTL0_H = PMMPW_H;              

     // Set SVS/SVM high side new level

     SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;

     // Set SVM low side to new level

     SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;

     // Wait till SVM is settled

     while ((PMMIFG & SVSMLDLYIFG) == 0);

     // Clear already set flags

     PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);

     // Set VCore to new level

     PMMCTL0_L = PMMCOREV0 * level;

     // Wait till new level reached

     if ((PMMIFG & SVMLIFG))

       while ((PMMIFG & SVMLVLRIFG) == 0);

     // Set SVS/SVM low side to new level

     SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;

     // Lock PMM registers for write access

     PMMCTL0_H = 0x00;

    }

    在MSP430ware中

  • 你好,谢谢的回复,我想应该不是这个问题,我在程序中加了static void SetVcoreUp,SetVcoreUp(1),SetVcoreUp(2),SetVcoreUp(3),但是我的sw_flag还是跑偏,还是不知道它怎么跑的,因为的MCLK 8M ,SMCLK 4M ,ACLK 32768,MCLK是由16M的晶振分频过来的,程序开始的时候我测设过几次,没有问题,后来就出现跑偏,我通过两根线模拟人进出。CODE 就是做的这个,我是通过拔线来模拟的。

  • roy, 你好!为了达到性能和功耗的最佳匹配,MSP430F5xxx系列的PMM非常灵活,有4个level的核电压,分别可以支持逐步升高的CPU主频,需要的供电电压也逐步提高。示意图如下图,如果想要使得CPU达到最高的25MHz,则需要先将Vcore升至level3,当然此时的供电电压Vcc必须在2.4V~3.6V之间。即主频增高,则需要供电Vcc足够高,Vcore level够,当然,此时功耗也在提高。

    具体数据请查看对应datasheet。同时,TI也提供了‘MSP430F5xx and MSP430F6xx Core Libraries’来帮助用户简化控制,请从http://www.ti.com/lit/zip/slaa448下载源代码,并从网上下载对应文档。

  • 你好,谢谢你的回答,我跟我几个工程师讨论过这个问题,我们发现,在16M分频的情况下,分成8M,所需要的电压要求不是很高,

    而且,我在外部给的3.3v的电压,而且有个问题,我不太明白,我在程序中使用SetVcoreUp (0x04)的时候,我的蜂鸣器直接叫而且不停,程序根本无法运行,就算break后,也不知道跑哪去了,后来我就把SetVcoreUp (0x04);去掉了,改成SetVcoreUp (0x03);就没有问题。

    程序设计思路:

    我的思路是处理完数据,进入LPM0模式,然后在LPM0模式中,打开定时器的捕获中断,这个捕获的时间在30ms左右,捕获完成退出LPM0模式,在30MS里面我的TX段向接收端发送6组电平编码,简单的说就是高电平的时间大约在1.38ms 定时器选用4M的SMCLK时钟,捕获的时间在5551左右(TA0CCR1显示的数值),这个数字是正确的,我在捕获完6个电平后开始处理这个数据,处理完成又进入LPM0模式,然后处理ch2过来的数据,这样往返处理。

    结果是,全速运行 ,当我先使ch1收不到数据 ,然后ch2收不到数据,这样一直做,我的sw_flag会出现跑偏,导致所有的我的一些参数全部都跑偏,我现在根本无法确认?如果是Vcore电压不够,但是8M的速度不是很快,应该能满足。还是说我在进入LPM0的时候,会导致MCU跑偏,LPM0的模式下,MCU的MCLK关闭,导致CPU不稳定,但是我的SMCLK是开着的,可能是这样的情况么?我以前从来没有遇到过这样的情况?期待您的回复,谢谢~~~

  • 你好,谢谢你的回答,我跟我几个工程师讨论过这个问题,我们发现,在16M分频的情况下,分成8M,所需要的电压要求不是很高,

    而且,我在外部给的3.3v的电压,而且有个问题,我不太明白,我在程序中使用SetVcoreUp (0x04)的时候,我的蜂鸣器直接叫而且不停,程序根本无法运行,就算break后,也不知道跑哪去了,后来我就把SetVcoreUp (0x04);去掉了,改成SetVcoreUp (0x03);就没有问题。

    程序设计思路:

    我的思路是处理完数据,进入LPM0模式,然后在LPM0模式中,打开定时器的捕获中断,这个捕获的时间在30ms左右,捕获完成退出LPM0模式,在30MS里面我的TX段向接收端发送6组电平编码,简单的说就是高电平的时间大约在1.38ms 定时器选用4M的SMCLK时钟,捕获的时间在5551左右(TA0CCR1显示的数值),这个数字是正确的,我在捕获完6个电平后开始处理这个数据,处理完成又进入LPM0模式,然后处理ch2过来的数据,这样往返处理。

    结果是,全速运行 ,当我先使ch1收不到数据 ,然后ch2收不到数据,这样一直做,我的sw_flag会出现跑偏,导致所有的我的一些参数全部都跑偏,我现在根本无法确认?如果是Vcore电压不够,但是8M的速度不是很快,应该能满足。还是说我在进入LPM0的时候,会导致MCU跑偏,LPM0的模式下,MCU的MCLK关闭,导致CPU不稳定,但是我的SMCLK是开着的,可能是这样的情况么?我以前从来没有遇到过这样的情况?期待您的回复,谢谢~~~

  • 不太懂

    也没用过这个型号系列

    这样的办法可不可以?首先确定一两个肯定能判断出程序出错的方法。然后精简程序,从最简单的开始,逐步增加,看看增加了哪一部分开始出现错误

  • 楼主有看对应的反汇编代码吗?看PC指针飞到何处了?是否有代码被优化的问题?

  • 你好!

    能否把代码贴上来,以便分析。

  • 检查一下在volatile int switch_flag=0这个变量的函数中是不是定义了大数组或者很多局部变量,当程序运行到该函数的时候造成堆栈溢出,使得switch_flag这个变量的数值发生不可以预料的数值。