打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
MSP430定义超大数组的问题

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。 

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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
MSP430基本时钟模块
MSP430F149单片机驱动DS2762读写操作C语言程序
【MSP430趣谈】MSP430第八讲之时钟设置
MSP430F5529时钟详解
关于MSP430中断机制
MSP430单片机看门狗实用方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服