以下是用WE430 4.11B调试MSP430F5438的时碰到怪问题;平时习惯性是较少留意这些。但今天细心留意却感觉得有点怪怪的。
我使用了一个非常简单的定时器例子来做测试。功能就是利用定时器A0 CCR0模块工作在增计数模式使其中断来唤醒来点一个LED,很简单吧~。
请看例子先: msp430FG5438 --------------- /|\| |---| | | | 32KHZ --|RST |---| | | | P10.0|-->LED
[CODE]
#include <msp430x54x.h>
void main(void)
{ WDTCTL = WDTPW + WDTHOLD; // 禁狗! P10DIR |= 0x80; // P10.7驱动LED TA0CCTL0 = CCIE; // TA0模块的CCR0寄存器中断使能 TA0CCR0 = 6553; // 32768/6553=5 约5秒闪烁LED TA0CTL = TASSEL_1 + MC_1; // AMCLK,增计数模式--以CCR0为周期
_EINT(); // 总中断使能 LPM0; // 进入低功耗模式,此时CPU处于睡觉状态 while(1) { P10OUT ^= 0x80; // 守株待兔地待TA0的CCR0计数中断,等待唤醒 LPM0; }
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{ LPM0_EXIT; // CCR0中断程序
}
[/CODE]
用WE430下载程序到芯片后,进行单步调试时。绿色指示条会指示着当前运行的位置。
进入while(1)后,在执行调步(setep over)时,批示条一定会在 P10OUT ^= 0x80; 或LPM0;的。因定时器A0中断会唤醒低功耗模块来执行这两语句;这是正常的。
但是,下载程序到芯片后直接执行(go)后,此时程序直接运行。板上的LED也能看到闪烁的。当想停止打断全速运行时按行Break(小红手)后,CPU停止运行。指示条停留在某个语句上。
此时若果想再用单步调试模式进行单步调试时,却发现调试窗口的绿色指示条从C代码窗口跳至到一个Disassembly窗口处,并处于一个DebugBreak处。此时再想使CPU进行全速进行运作或再单步调式却发行已不能再如上面的两句中执行了( P10OUT ^= 0x80; 或LPM0;)。此时指示条一在Disassembly窗口处执行未明的句子了...再想回到C代码执行已没办法了。
正常的理解方式是,就算一开始进行了全速运行,只要控制打断后会停留在某个执行的语句中,随行可以继续执行单步调试或其他多步调试模式。而不应该使调试模式失去非理想状态。更嘛烦的,当停止了再进行全速时却无法再全速运行了。
手上有5系列朋友如果有兴趣,可以复制上的例子出来到你的板子上跑跑看看...我试过用08年/09年的5438试了都有这样的情况。我希望是我自己的低级错误吧,但如果真的是有问题的话。这可能是个Bug。
期待参与试试....
[HR]
第二天
我在怀疑别的系列型号会不会出现有这样的情况,接下来我又拿了149(小黑)同样的程序进行测试。同样是WE430 4.11b、仿真器结果发现并没有出现这样的情况。我的测试方式及例子如下:
[CODE]
// MSP430F149
// ---------------
// /|\| XIN|--
// | | | 32K
// --|RST XOUT|--
// | |
// | P1.0|-->LED
//
#include <msp430x14x.h>
void main(void)
{ WDTCTL = WDTPW + WDTHOLD; // Stop WDT P1DIR |= 0x01; // P1.0 output CCTL0 = CCIE; // CCR0 interrupt enabled CCR0 = 6553; TACTL = TASSEL_1 + MC_1; // AMCLK, up. mode
_EINT(); LPM0; while(1) { P1OUT ^= 0x01; LPM0; }
}
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{ LPM0_EXIT;
}
[/CODE]
第一次为 下载后进行单步--->全速--->单步 在这个过程中WE430调试能与单片机同步的,没丢失或失控情况。
第二次为 下载后进行全速--->单步--->全速--->单步 同样也没有出现丢失或失控情况。
下午,我将WE430换成一个4.21版的,测试5438同样程序,还是会在调试单步时会使调试失控。
用149调试结果与5438调试结果相比,149并未出现这样的情况...。看来真的有bug?
希望有兴趣朋友一起来试这个测试...。 |