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.

急找peter_zheng的联系方式

Other Parts Discussed in Thread: MSP430G2553

本人有一个问题想请教一下Peter_zheng,可苦于没联系方式,有知道者,请留下他的联系方式。

  • 您可以给他发站内信, 站内信应该可以到他的邮箱中.

  • 嗯好滴。

    这个图是我用IARforMSP430的反汇编对话框中的。我调试的程序开始就在进入了_data16_memzero这个函数了,在地址为00CEF6到00CEFE中死循环了。

    我知道什么原因,是我初始化了TIMB时钟的,但是没编写中断函数,当我把中断使能取消了就通过了。但是我一直不明白他为什么会进入这个死循环,不知道原理。

    还有就是程序开始是从汇编_Programm_start开始的吧,资料上说他开启的时候自己开启了看门狗,我怎么没看到汇编代码开启看门狗那?在Cstartup.s43里找了一段代码:

           // --------------------
            // Turn off the watchdog.
            //
            // Note: This is excluded by default. Please define
            // DISABLE_WATCHDOG to include it.
            //

    #ifdef DISABLE_WATCHDOG

            MOV     #WDTPW + WDTHOLD, &WDTCTL
    #endif

    这是关闭看门狗,而不是开启看门狗啊。所以一直很郁闷!!!

  • 我用的MSp430G2553,在IAR for 430上调试,反汇编窗口输出的信息如图所示。

    在调试中出的问题是,程序进入了反汇编对话框中的_data16_memzero这个函数,在地址为00CEF6到00CEFE中死循环,跳不出来。

    我知道原因在那里,是我在程序中使能了TIMB时钟的溢出中断,但是没有编写中断函数。网上资料说在Cstartup.s43这个文件里,说看门狗在430启动的时候自动开启,但是我看了里面的相关代码:

    _program_start:

            PUBLIC ?cstart_begin
    ?cstart_begin:

            // --------------------
            // Turn off the watchdog.                     关闭看门狗
            //
            // Note: This is excluded by default. Please define
            // DISABLE_WATCHDOG to include it.
            //

    #ifdef DISABLE_WATCHDOG

            MOV     #WDTPW + WDTHOLD, &WDTCTL
    #endif

            // --------------------
            // Initialize SP to point to the top of the stack.
            //
            MOV     #SFE(CSTACK), SP

            //
            // Ensure that main is called.
            //
            REQUIRE ?cstart_call_main


    // -----------------------------------------------
    // Call __low_level_init to perform initialization before initializing
    // segments and calling main. If the function returns 0 no segment
    // initialization should take place.
    //
    // Link with your own version of __low_level_init to override the
    // default action: to do nothing but return 1.
    //

            XRSEGCSTART

            PUBLIC  ?cstart_call_low_level_init
            EXTERN  __low_level_init

    ?cstart_call_low_level_init:
            XCALL   #__low_level_init
            CMP     #0, W0
            JEQ     ?cstart_call_main


    // -----------------------------------------------
    // Segment initialization:
    //
    // xxx_Z  -- uninitialized data that are filled with zeros.
    // xxx_I  -- initialized data that gets the values from the corresponding
    //           xxx_ID segment.
    //

    #ifndef IGNORE_SEG_INIT


            // --------------------
            // Initialize code for __ramfunc functions.
            //

            XRSEGCSTART
            PUBLIC  ?cstart_init_copy_ramfunc

    ?cstart_init_copy_ramfunc:

    #ifndef IGNORE_RAMFUNC_INIT

    #ifndef REGISTER_MODEL_REG20

            MOV     #SFB CODE_I,  CW0
            MOV     #SFB CODE_ID, CW1

            MOV     #sizeof CODE_I, CW2

            XCALL   #__data16_memcpy

    #else  // MSP430X with 20 bit pointers.

            EXTERN  __data20_memcpy

            MOVA    #SFB CODE_I,  CW0
            MOVA    #SFB CODE_ID, CW1
            MOV.W   #LWRD(sizeof CODE_I), L1L
            MOV.W   #HWRD(sizeof CODE_I), L1H

            XCALL   #__data20_memcpy


    #endif // REGISTER_MODEL_REG20

    #endif // IGNORE_RAMFUNC_INIT


            // --------------------
            // Initialize data16
            //

    #ifndef IGNORE_DATA16_DATA

            //
            // Clear DATA16_Z.
            //

            XRSEGCSTART
            PUBLIC  ?cstart_init_zero
            EXTERN  __data16_memzero                            找到了函数

    ?cstart_init_zero:
            MOV     #SFB DATA16_Z,    CW0
            MOV     #sizeof DATA16_Z, CW1

            XCALL   #__data16_memzero


            //
            // Copy DATA16_ID to DATA16_I
            //

            XRSEGCSTART
            PUBLIC  ?cstart_init_copy
            EXTERN  __data16_memcpy

    ?cstart_init_copy:
            MOV     #SFB DATA16_I,  CW0
            MOV     #SFB DATA16_ID, CW1

            MOV     #sizeof DATA16_I, CW2

            XCALL   #__data16_memcpy

    #endif // IGNORE_DATA16_DATA


            // --------------------
            // Data20
            //

    #if __CORE__==__430X_CORE__


    #ifndef IGNORE_DATA20_DATA

            //
            // Clear DATA20_Z.
            //

            XRSEGCSTART
            PUBLIC  ?cstart_init_zero20
            EXTERN  __data20_memzero

    ?cstart_init_zero20:
            MOVA    #SFB DATA20_Z,W0
            MOV.W   #LWRD(sizeof DATA20_Z), L1L
            MOV.W   #HWRD(sizeof DATA20_Z), L1H

            XCALL   #__data20_memzero


            //
            // Copy DATA20_ID to DATA20_I
            //

            XRSEGCSTART
            PUBLIC  ?cstart_init_copy20
            EXTERN  __data20_memcpy

    ?cstart_init_copy20:
            MOVA    #SFB DATA20_I,  CW0
            MOVA    #SFB DATA20_ID, CW1
            MOV.W   #LWRD(sizeof DATA20_I), L1L
            MOV.W   #HWRD(sizeof DATA20_I), L1H

            XCALL   #__data20_memcpy

    #endif // IGNORE_DATA16_DATA

    #endif // MSP430X

    #endif // IGNORE_SEG_INIT

     

    // -----------------------------------------------
    // Call constructors of static objects.
    //

            RSEG    DIFUNCT:CONST:NOROOT(1)
            XRSEGCSTART
            PUBLIC  ?cstart_call_ctors

            EXTERN  __call_ctors

    ?cstart_call_ctors:

    #ifdef REGISTER_MODEL_REG20

            MOVA    #SFB DIFUNCT, CW0
            MOVA    #SFE DIFUNCT, CW1

    #else /* REGISTER_MODEL_REG20 */

            MOV.W   #SFB DIFUNCT, CW0
            MOV.W   #SFE DIFUNCT, CW1

    #endif /* REGISTER_MODEL_REG20 */

            XCALL   #__call_ctors


    // -----------------------------------------------
    // Call main() with no arguments and then exit using the return value
    // of main as the parameter.
    //

            XRSEGCSTART
            PUBLIC  ?cstart_call_main

            EXTERN  main
            EXTERN  exit

    ?cstart_call_main:
            XCALL   #main
            XCALL   #exit

            PUBLIC  ?cstart_end
    ?cstart_end:

            // Note: "ENDMOD label" means code that this module is the
            // start of the application.
            ENDMOD  __program_start

    我在里面找到了关闭看门狗的函数,怎么没有初始化开启看门狗的程序那?

    还有我还找到了_data16_memzero 这个标志,但是声明的是全局标志,他的具体指向代码在IAR for 430的那个文件夹里,我一直没找到,所以一直没从原理上明白为什么进入了死循环,只是知道了原因。

    你有这方面的相关资料吗?

    还有就是关于IARfor 430\430\src\lib\430文件夹里的几个文件(cexit.s43, cstartup.s43, epilogue.s43, setjmp.s43 termio.s43)的具体解释资料有吗?

  • 一直在_data16_memzero里死循环可能是因为程序最开始初始化变量的时候有大数组需要初始化。导致看门狗不断复位。这个初始化的过程是在进入main之前,有2种方式你可以尝试:

    1.对你的数组用 __no init_定义,上电编译器不产生特殊的附加函数去初始化RAM
    2. B修改IAR中Cstartup.S43文件中__program_start子程序,增加一个关闭WDT的操作或者设置WDT时间长度超过32MS
    C在Project--Options--Linker--Config中选择 Override default programe,并将
    Entry lib 设置成 __program_start


    另外G2553没有timerB,我想你说的可能是TA1。由于缺少中断向量入口,导致复位。

    有啥问题,咱再交流

  • 我还有2个问题。

    1.你说的设置wdt看门狗时间长度是在main.c函数里那?还是在Cstartup.s43里? 如果在Cstartup.s43里,我怎么只在那里面看到了关闭看门狗啊,没看到开启关门狗的程序。

    // System initialization.
    //

            XRSEGCSTART
            PUBLIC  __program_start

            EXTERN  ?reset_vector
            REQUIRE ?reset_vector

    __program_start:

            PUBLIC ?cstart_begin
    ?cstart_begin:

            // --------------------
            // Turn off the watchdog.           //
            // Note: This is excluded by default. Please define
            // DISABLE_WATCHDOG to include it.
            //

    #ifdef DISABLE_WATCHDOG              关闭看门狗

            MOV     #WDTPW + WDTHOLD, &WDTCTL   
    #endif

    2.这个_data_memzero子程序 在那个文件夹里?你能提供一下这方面的资料吗?

  • 按照您的,Cstartup.s43文件中 加了 #define DISABLE_WATCHDOG   //关闭狗 ,还是不行?

    后面我对 数组用 __no init_定义了,才行;

    单独 关看门狗 不行啊?

    求解,万分感谢

  • hi REED RICHARD,

    加上这一段:

    #ifdef DISABLE_WATCHDOG              关闭看门狗

            MOV     #WDTPW + WDTHOLD, &WDTCTL    
    #endif

  • Cstartup.S43文件中,后面本来就有这一段的,还要加?

    而且 我在37行,加了也没用哦,求解啊

    #include "macros.m43"
    #include "cfi.m43"

    #define DISABLE_WATCHDOG   //关闭狗

    #ifdef DISABLE_WATCHDOG              关闭看门狗

            MOV     #WDTPW + WDTHOLD, &WDTCTL    
    #endif

    #ifdef DISABLE_WATCHDOG
    #include "msp430.h"
    #endif