打印

msp430程序堆栈溢出重复执行主函数!

[复制链接]
1614|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stirwl|  楼主 | 2011-3-24 22:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 stirwl 于 2011-3-26 22:32 编辑

看门狗关了,程序会重复的执行主函数,
天呐,这到底是为什么啊???
#include<msp430x16x.h>
#include<string.h>

#define STCS   P3OUT|=0x01
#define STSTD  P3OUT|=0x02
#define STSCLK P3OUT|=0x04
#define CLCS   P3OUT&=0xfe
#define CLSTD  P3OUT&=0xfd
#define CLSCLK P3OUT&=0xfb

char show[16]="       Hz";
unsigned freq;

void delay1ms()
{
  int i;
  for(i=0;i<8000;i++);
}

void delaynms(int n)
{
  int i;
  for(i=0;i<n;i++) delay1ms();
}

void num2str(unsigned num)
{
  int i;
  show[0]=num/10000+48;
  num%=10000;
  show[1]=num/1000+48;
  num%=1000;
  show[2]=num/100+48;
  num%=100;
  show[3]=num/10+48;
  show[4]=num%10+48;
  for(i=0;show=='0'&&i<5;i++) show=' ';
  if(show[0]==' '&&show[1]==' ')
  {
//    for(i=0;show==' ';i++);
//    for(j=0;i<5;i++,j++) show[j]=show;
    show[6]='K';
  }
  else
  {
    for(i=5;i>2;i--) show=show[i-1];
    show[2]='.';
    show[6]='M';
  }
}

void sendbyte(unsigned char byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
   if(byte&0x80) {_NOP();STSTD;}
   else {_NOP();CLSTD;}
   _NOP();
   STSCLK;
   _NOP();
   CLSCLK;
   byte=byte<<1;
}
}

void write(unsigned char start,unsigned char data)//0写指令,1写数据
{
unsigned char hdata,ldata;
if(start) start=0xfa;
else start=0xf8;
sendbyte(start);
hdata=data&0xf0;
sendbyte(hdata);
ldata=(data<<4)&0xf0;
sendbyte(ldata);
}

void writedatas(char show[16])
{
  int i,n=strlen(show);
  for(i=0;i<n;i++) write(1,show);
}

void lcdinit(void)
{
  STCS;
  delaynms(40);
  write(0,0x30);
  delay1ms();
  write(0,0x30);
  delay1ms();
  write(0,0x0c);
  delay1ms();
  write(0,0x01);
  delaynms(10);
  write(0,0x06);
}

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  P3DIR=0Xff;//0,1,2 12864液晶控制端 CS STD SCLK
  P3OUT=0;
  P4DIR=0;
  P4SEL=0x80;
  BCSCTL1=0x07;
  while(IFG1&OFIFG)
   {
     IFG1 &= ~OFIFG;
     delay1ms();
    }
  BCSCTL2=0x08;//T=0.125us
  TACTL=0x02d2;//timera时钟配置,1M,T=1us
  TACCTL0=OUTMOD_2+CCIE;//此控制位待定
  TACCR0=0;//10ms,10000
  TBCTL=0x0020;
  TBCCR0=0;
  lcdinit();
  write(0,0x80);
  writedatas("输入信号频率:");
  write(0,0x88);
  TACCR0=10000;
  _BIS_SR(LPM0_bits+GIE);
}

#pragma vector=TIMERA0_VECTOR
__interrupt void timer_a(void)
{
  freq=TBR/5;//KHz
  num2str(freq);
  writedatas(show);
  write(0,0x88);
  TBCCR0=0;
  TBR=0;
  TBCCR0=0xffff;
  TACCR0=10000;

}

找到原因了,是堆栈溢出,但我把timera程序屏蔽,然在main后放个wile(1);程序也会莫名其妙的堆栈溢出???

相关帖子

沙发
msp430ing| | 2011-3-24 22:27 | 只看该作者
楼主把程序贴出来让大家看看怎么回事吧

使用特权

评论回复
板凳
stirwl|  楼主 | 2011-3-24 22:34 | 只看该作者
2# msp430ing


贴上去了

使用特权

评论回复
地板
380121850| | 2011-3-24 23:51 | 只看该作者
很有可能是复位了

使用特权

评论回复
5
380121850| | 2011-3-24 23:56 | 只看该作者
看了你程序,。。。。。。。。。
你主函数执行到最后,用个while循环进入低功耗试试看

使用特权

评论回复
6
一级菜鸟| | 2011-3-24 23:58 | 只看该作者
main里面没有循环,main执行完成返回后你让MCU跑哪去?

使用特权

评论回复
7
jd吕凯| | 2011-3-25 17:13 | 只看该作者
在学习51 单片机时我发现主函数也是不断地在循环,除非主函数结束时加while(1);。

使用特权

评论回复
8
3B1105| | 2011-3-25 19:53 | 只看该作者
对,最后都要让程序运行在一个死循环里

使用特权

评论回复
9
t.jm| | 2011-3-26 09:53 | 只看该作者
MSP430 的中断驱动程序是很有意思,没有一个while(1);
就是一个_BIS_SR(LPM0_bits+GIE);
这才更省电啊!!

使用特权

评论回复
10
stirwl|  楼主 | 2011-3-26 21:01 | 只看该作者
main最后程序进入低功耗模式,cpu关闭,若没有中断程序不会往下运行的,
是因为堆栈溢出了

使用特权

评论回复
11
stirwl|  楼主 | 2011-3-26 22:02 | 只看该作者
4# 380121850

是的,堆栈溢出了,我把timera程序屏蔽,然在main后放个wile(1);程序也会莫名其妙的堆栈溢出

使用特权

评论回复
12
stirwl|  楼主 | 2011-3-26 22:02 | 只看该作者
5# 380121850
会堆栈溢出,然后程序终止

使用特权

评论回复
13
米其林r| | 2011-3-27 11:14 | 只看该作者
哪提示的堆栈溢出?什么症状了?

使用特权

评论回复
14
stirwl|  楼主 | 2011-3-27 22:21 | 只看该作者
13# 米其林r
按暂停的时候编译器提示堆栈溢出,而且屏幕显示不断刷新,确实是复位了

使用特权

评论回复
15
stirwl|  楼主 | 2011-3-27 22:22 | 只看该作者
实践证明程序没有问题,有问题的是编译器,新建一个工程,把程序一点一点的copy进去就行了。
结贴了

使用特权

评论回复
16
6019赵文| | 2011-3-31 12:42 | 只看该作者
你对比下两次的编译器设置,找出问题出在哪啊! 15# stirwl

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

10

帖子

1

粉丝