×
单片机 > 单片机程序设计 > 详情

MSP430定义超大数组的问题

发布时间:2020-06-03 发布时间:
|
IAR编译的方法,导致看门狗溢出了。 单片机上电的时候看门狗已经启动, 但是在进入main函数之前,软件会首先去初始化你用到的一些数据,比如数组之类的, 如果你的数组定义的比较大, 那么初始化的时间就会很长,当然在这过程中,看门狗的时间就到了,单片机复位,然后在启动,在初始化……,这样循环。  

解决方法是,使用低级初始化函数, IAR编译的时候,会自动把低级初始化的函数放在程序的最开始处,这样你可以在低级初始化函数里面先把看门狗关掉, 等低级初始化函数执行完了,才会进行数据初始化的处理,在然后才执行main函数,   
详细解决方法参考IAR的这篇文档:http://supp.iar.com/Support/?note=37778&from=search+result

按照IAR的这个方法,如果你觉得添加文件麻烦,实际上最简单的是,自己编写一个 __low_level_init 函数, 就行了, 这个函数不需要你在主函数里面调用, 这个函数会被编译器编译在程序的最开始部分。 

下面是我写的一个简单的程序,测试通过,供参考: 

#include "msp430f5438.h"  
unsigned char buffer0[10240];  
void main(void)  
{  
    
  unsigned int i; 

  P5SEL |= 0x0C;                            // Port select XT2  
  UCSCTL6 &= ~XT2OFF;                       // Enable XT2  
  UCSCTL3 |= SELREF_2;                      // FLLref = REFO  
                                            // Since LFXT1 is not used,  
                                            // sourcing FLL with LFXT1 can cause  
                                            // XT1OFFG flag to set  
  UCSCTL4 |= SELA_2;                        // ACLK=REFO,SMCLK=DCO,MCLK=DCO 

  // Loop until XT1,XT2 & DCO stabilizes  
  do  
  {  
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);  
                                            // Clear XT2,XT1,DCO fault flags  
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags  
  }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag 

  UCSCTL6 &= ~XT2DRIVE0;                    // Decrease XT2 Drive according to  
                                            // expected frequency  
  UCSCTL4 |= SELS_5 + SELM_5;               // SMCLK=MCLK=XT2 

  P1DIR |= BIT0;                            // P1.0 output 

    
  for(i=0;i<10240;i++)  
  {  
    buffer0[i] = i % 256;     
  } 

  while(1)  
  {  
      
    for(i=0;i<10240;i++)  
      P1OUT = buffer0[i];  
      
  }   


int __low_level_init(void)  
{  
  WDTCTL = WDTPW+WDTHOLD;                   // Stop WDT  
  /* Insert your low-level initializations here */ 

  /*  
   * Return value:  
   *  
   *  1 - Perform data segment initialization.  
   *  0 - Skip data segment initialization.  
   */ 

  return 1;  


如上,如果没有 __low_level_init 这个函数,直接把关闭看门狗的语句写道主函数里面,单片机将永远进入不了main。 

当然你也可以把所有的硬件初始化的语句写在这个函数里面,这样硬件将会在单片机复位后第一时间进行初始化。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会