kingkingdf_wdf 发表于 2012-4-19 09:57:35

[求教]IAR下载时使用Download and debug和Debug without debug有何不同?

本帖最后由 kingkingdf_wdf 于 2012-4-19 10:15 编辑

我是最近因为公司的项目需要才开始用IAR的,所以有些东西不是很清楚。

项目用的是 MSP430F47197 芯片,IAR版本是从官网上下的5.4版本,工具使用的是MSP-FET430U100A(就是目标板+USB编程器)。

昨天使用官网上下的ADC例程,略作修改,再使用干电池和电位器调压做ADC稳定性试验的时候,突然发现一个很奇怪的问题:使用不同的IAR按钮,测得的数据不同,而且差距很大。

问题现象:
输入电压:0.47888 V
电路:
//               MSP430x471xx
//             -----------------
//         /|\|            XIN|-
//          | |                  | 32kHz
//          --|RST      XOUT|-
//            |                  |
//Vin+ -->|A2.0+         |
// Vin- -->|A2.0-            |
//            |                  |
//            |         VREF |--+
//            |                   |   |
//            |                   |-+- 100nF
//            |                   |-+-
//            |                   |   |
//            |         AVss |---+
//            |                   |

代码:
我放到后面,先跟大家说说现象吧。

问题现象:
代码编译、链接OK,使用download and debug按键进行下载和调试,得到的数据(如图1),ADC转换结果(直接从SD16MEM2中读出的),结果基本上在59020左右(这个结果比理论值大,但还算接近)。
但如果停止debug,转而使用Debug without download按键来调试,得到的数据(如图2),结果在59750~60080之间跳动,波动较大。这次的值要比使用download and debug调试整整大了700~1000单位。这个明显是不可容忍的。
图1   图2

需要注意的是:
1、不管使用的是哪个按键来调试,之后点击reset按键再次执行,获得的结果也稳定在59020左右,即与download and debug按键调试结果相同。
2、在开始debug后,download and debug按键会转变为Make_Restart Debugger,debug without download按键会转变为Restart Debugger,这两个新按键的效果也和转变前一样,即用Make_Restart Debugger,结果OK,用Restart Debugger则会有问题。
3、在进行多次试验之后,发现如果设输入电压为Y,ADC结果为X,二者关系为:(Y+0.6) = K * X,则使用Debug without download(下面简称“白键”)的K比使用download and debug(下面简称“绿键”)的K小,即当Y大于0时,使用白键的值要比使用绿键的值大;当Y小于0时,白键测得的值要比绿键小;Y=0时,二者相同。

这个问题小弟想了好久都不知道怎么回事{:dizzy:} ,所以想向各位前辈请教一下到底是怎么回事。{:smile:} {:smile:}

另外,小弟有想过ADC启动后不稳的问题,所以在正式采样之前,加了一段类似采样的代码(即下面代码中,带有//try注释的代码段,下面已经把该代码段注释掉了),希望能通过延迟来稳定改正这个问题,但是问题没解决,反而出现另一个问题:使用白键调试,正式采样的(如图3,大概在600100左右200范围内跳)比新加的代码的获得值(如图4,大概和没新代码前的采样值一样)大,但是使用绿键和reset就没有这个问题。
图3      图4

下面贴上小弟的代码:
#include<msp430x471x7.h>

//
#include "clk_fr.h"

#define Y_IN 478880   //adc in
#define TEST_NUM 100
#define TEST_try 1000

unsigned int result;
unsigned int result_ar = {0};
//unsigned int result_ary = {0};      //try

float y_ar = {0};

float K = {0};

void main(void)
{
volatile unsigned int i;                  // Use volatile to prevent removal
                                          // by compiler optimization
unsigned int j = 0;

WDTCTL = WDTPW + WDTHOLD;               // Stop WDT
FLL_CTL2 |= XCAP10PF;                     // Configure load caps
for (i = 0; i < 10000; i++);            // Delay for 32 kHz crystal to
                                          // stabilize

SD16CTL = SD16REFON+SD16SSEL0;            // 1.2V ref, SMCLK
SD16CCTL2 |= SD16SNGL+SD16IE ;            // Single conv, enable interrupt
SD16INCTL2 |= SD16INCH_0;
for (i = 0; i < 0x3600; i++);             // Delay for 1.2V ref startup

/*                  //try
j=0;
for (i = 0; i < TEST_try; i++)
{
   SD16CCTL2 |= SD16SC;                  // Set bit to start conversion                                    
    __bis_SR_register(LPM0_bits + GIE);   // Enter LPM0 w/ interrupts
    _NOP();
    result_ary=result;
    j++;
}
j=0;
*/


while (j < TEST_NUM)
{
    _NOP();                                 // SET BREAKPOINT HERE   
    SD16CCTL2 |= SD16SC;                  // Set bit to start conversion                                    
    __bis_SR_register(LPM0_bits + GIE);   // Enter LPM0 w/ interrupts
   
    _NOP();                                 //Delay for waiting interrupt
    //for (i = 0; i < 100; i++);

    result_ar = result;
    K = Y_IN / (result - 32768);         //计算线性
    y_ar = (float)(result + 0) * 12 / 65536;
    j++;
   
    _NOP();                                 // SET BREAKPOINT HERE

}

_NOP();                                 // SET BREAKPOINT HERE

}

#pragma vector=SD16A_VECTOR
__interrupt void SD16AISR(void)
{
switch (SD16IV)
{
case 2:                                 // SD16MEM Overflow
    break;
case 4:                                 // SD16MEM0 IFG
    break;
case 6:                                 // SD16MEM1 IFG   
    break;
case 8:                                 // SD16MEM2 IFG
    result = SD16MEM2;                      // Save CH2 results (clears IFG)
    break;
}

__bic_SR_register_on_exit(LPM0_bits);      // Exit LPM0
}


lcptw 发表于 2012-4-19 10:14:42

[求教]IAR下载时使用Download and debug和Debug without Download有何不同?

经验看是下载到mcu再调试 和 pc连接mcu仿真调试

两者完全不同嘎,前者是mcu自己跑,后者是pc说跑mcu再跑,说停就停了。

MDK也有的功能呀。

LZ熟悉熟悉编译器吧。{:loveliness:}

linghu2 发表于 2012-4-19 10:16:49

Download and debug 将程序烧录,然后仿真

Debug without debug 直接仿真!没有更新程序,会出现MCU程序和编译器的程序不同的问题{:lol:}

kingkingdf_wdf 发表于 2012-4-19 11:19:41

lcptw 发表于 2012-4-19 10:14 static/image/common/back.gif
[求教]IAR下载时使用Download and debug和Debug without Download有何不同?

经验看是下载到mcu再调试 和 p ...

这样啊,我可不可以将出现的问题理解为下面这样?

绿键(download and debug)在调试的时候是需要与目标板实时联动通讯的,获得的值是ADC实测的结果。硬件稳定所需时间短。

白键(debug without download)在调试时没有与目标板实时联动通讯,而是用软件模拟MCU运行,再把结果反馈给目标板外围电路,获得的结果是通过软件根据ADC特性曲线计算得出的。由于软件模拟出的稳定所需的时间较长,所以短时间内测定的数据波动很大(同时也造成后来新加代码是前后两侧取样数值不同)。同时,由于实际芯片ADC的线性部分斜率与软件录入的ADC线性部分斜率不同而造成采样结果的巨大差异。


可以这么理解吗?

那么我提到的 : 不管使用的是哪个按键来调试,之后点击reset按键再次执行,获得的结果也稳定在59020左右,即与download and debug按键调试结果相同。

是不是reset键也是跟绿键一样,是对MCU操作的啊?其他的几个调试按键,比如单步、步入、步出、跳过等也是对MCU操作吗?


PS:新手一小时一帖的发帖限制怎么把回复也算上了{:sad:}

jeffwei 发表于 2012-4-19 12:40:43

Download and debug 烧写新程序并调试
Debug without Download 直接调试,不烧写程序

Onsunsl 发表于 2012-5-28 17:23:03

有没有单纯的载下啊?

usk5yenj4id04dm 发表于 2012-5-29 22:39:55

如果程序改变了一般要重新DOWNLOAD然后DEBUG.
如果程序没有改变,可以不要重新DOWNLOAD,但这时可能有两种情况:1是调试工具不打断当前MCU的运行,直接在MCU当前运行点上中断和通讯,2是打断MCU运行,复位从头开始运行.(第一种要MCU和工具都支持才行)

dianzichina 发表于 2012-5-30 07:15:58

单纯的下载?你可以下载了后直接把调试关闭不就是了吗?

ppdd 发表于 2012-12-30 15:06:55

想知道 在simulator 模式下, Download and Debug 和 Debug without Downloading 有什么区别??? 我的一个程序 down 就正常不down 就不能软仿真!!

djnxqc 发表于 2013-5-20 17:28:33

ppdd 发表于 2012-12-30 15:06 static/image/common/back.gif
想知道 在simulator 模式下, Download and Debug 和 Debug without Downloading 有什么区别??? 我的一 ...

我也遇到了这样的问题,不知道你解决了没有,求分享{:biggrin:}
页: [1]
查看完整版本: [求教]IAR下载时使用Download and debug和Debug without debug有何不同?