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 做项目的时候,我发现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是开着的,可能是这样的情况么?我以前从来没有遇到过这样的情况?期待您的回复,谢谢~~~
不太懂
也没用过这个型号系列
这样的办法可不可以?首先确定一两个肯定能判断出程序出错的方法。然后精简程序,从最简单的开始,逐步增加,看看增加了哪一部分开始出现错误
检查一下在volatile int switch_flag=0这个变量的函数中是不是定义了大数组或者很多局部变量,当程序运行到该函数的时候造成堆栈溢出,使得switch_flag这个变量的数值发生不可以预料的数值。