首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]8037实验程序中出现自动复位

[求助]8037实验程序中出现自动复位

片子是8037,写的程序如下。目的是定时(1秒)控制一个发光二极管亮一次,但是在亮了11次后,EVM板上的6个二极管都复位(全亮)了,我原先在初始化程序里设置了六个管子是熄灭的。后来把时间改成5秒,结果亮了2次后,又复位了。也就是说在程序执行一定时间后就不执行了。请帮我找找问题所在吧。谢谢


/***********************************************
*功能:GPIOA0口驱动的发光二极管每个1秒钟闪烁一次
*芯片:8037
************************************************/
#include "MC56F803x.h"
#include "SUB.h"


/*函数名:delay()*/
/*形参:dtime */
/*作用:有效延时1ms */
void delay (unsigned int dtime)
{
unsigned int i;
for(;dtime>0;dtime--)
{
for(i=0;i<124;i++)
{
;
}
}
}

/*函数名:initgpioA() */
/*作用:初始化程序*/
void initgpioA ()
{
asm(bfclr #$0002,X:COP_CTRL);
asm(bfclr #$0001,X:GPIO_A_PEREN);
asm(bfclr #$0002,X:GPIO_A_PEREN);
asm(bfclr #$0004,X:GPIO_A_PEREN);
asm(bfclr #$0008,X:GPIO_A_PEREN);
asm(bfclr #$0010,X:GPIO_A_PEREN);
asm(bfclr #$0020,X:GPIO_A_PEREN);
asm(bfset #$0001,X:GPIO_A_DDIR);
asm(bfset #$0002,X:GPIO_A_DDIR);
asm(bfset #$0004,X:GPIO_A_DDIR);
asm(bfset #$0008,X:GPIO_A_DDIR);
asm(bfset #$0010,X:GPIO_A_DDIR);
asm(bfset #$0020,X:GPIO_A_DDIR);
asm(bfclr #$0001,X:GPIO_A_DATA);
asm(bfclr #$0002,X:GPIO_A_DATA);
asm(bfclr #$0004,X:GPIO_A_DATA);
asm(bfclr #$0008,X:GPIO_A_DATA);
asm(bfclr #$0010,X:GPIO_A_DATA);
asm(bfclr #$0020,X:GPIO_A_DATA);

}



/*函数名:main() */
/*作用:主程序*/
void main (void)
{
initgpioA ();
while(1)
{
asm(bfchg #$0001,X:GPIO_A_DATA);
delay(1000);

}

}
你有没有调试过,程序跑到哪去了?
海纳百川  有容乃大
下面是MC56F803x_vector.asm文件的一部分。我在调试时看到程序停到
MC56F803x_intRoutine:
debughlt
nop 处。

下面是完整的MC56F803x_vector.asm文件。

; sample code



; interrupt vectors for MC56F803x


section interrupt_routines
org p:

MC56F803x_intRoutine:
debughlt
nop
nop
rti


; illegal instruction interrupt($04)

MC56F803x_illegal:
debughlt
nop
nop
rti


; hardware stack overflow interrupt ($08)

MC56F803x_HWSOverflow:
debughlt
nop
nop
rti


; misaligned long word access interrupt ($0A)

MC56F803x_misalign:
debughlt
nop
nop
rti


; PLL lost of lock interrupt ($22)

MC56F803x_PLL:
debughlt
nop
nop
rti


endsec




section interrupt_vectors
org p:

global FMC56F803x_intVec



FMC56F803x_intVec:

jsr >Finit_MC56F803x_ ; RESET ($00)
jsr >MC56F803x_intRoutine ; COP Watchdog reset ($02)
jsr >MC56F803x_illegal ; illegal instruction ($04)
jsr >MC56F803x_intRoutine ; software interrupt 3 ($06)
jsr >MC56F803x_HWSOverflow ; hardware stack overflow ($08)
jsr >MC56F803x_misalign ; misaligned long word access ($0A)
jsr >MC56F803x_intRoutine ; EOnCE step counter ($0C)
jsr >MC56F803x_intRoutine ; EOnCE breakpoint unit 0 ($0E)
jsr >MC56F803x_intRoutine ; EOnCE trace buffer ($10)
jsr >MC56F803x_intRoutine ; EOnCE transmit register empty ($12)
jsr >MC56F803x_intRoutine ; EOnCE receive register full ($14)
jsr >MC56F803x_intRoutine ; software interrupt 2 ($16)
jsr >MC56F803x_intRoutine ; software interrupt 1 ($18)
jsr >MC56F803x_intRoutine ; software interrupt 0 ($1A)
jsr >MC56F803x_intRoutine ; reserved ($1C)
jsr >MC56F803x_intRoutine ; reserved ($1E)
jsr >MC56F803x_intRoutine ; Low Voltage Detector (power sense) ($20)
jsr >MC56F803x_PLL ; PLL ($22)
jsr >MC56F803x_intRoutine ; HFM Error Interrupt ($24)
jsr >MC56F803x_intRoutine ; HFM Command Complete ($26)
jsr >MC56F803x_intRoutine ; HFM Command, Data, and Address Buffers Empty ($28)
jsr >MC56F803x_intRoutine ; reserved ($2A)
jsr >MC56F803x_intRoutine ; GPIO D ($2C)
jsr >MC56F803x_intRoutine ; GPIO C ($2E)
jsr >MC56F803x_intRoutine ; GPIO B ($30)
jsr >MC56F803x_intRoutine ; GPIO A ($32)
jsr >MC56F803x_intRoutine ; SPI Receiver Full ($34)
jsr >MC56F803x_intRoutine ; SPI Transmtter Empty ($36)
jsr >MC56F803x_intRoutine ; SCI Transmitter Empty ($38)
jsr >MC56F803x_intRoutine ; SCI Transmitter Idle ($3A)
jsr >MC56F803x_intRoutine ; SCI Reserved ($3C)
jsr >MC56F803x_intRoutine ; SCI Receiver Error ($3E)
jsr >MC56F803x_intRoutine ; SCI Receiver Full ($40)
jsr >MC56F803x_intRoutine ; I2C Arbitration Lost ($42)
jsr >MC56F803x_intRoutine ; I2C Byte Transfer ($44)
jsr >MC56F803x_intRoutine ; I2C Address Detect ($46)
jsr >MC56F803x_intRoutine ; Timer Channel 0 ($48)
jsr >MC56F803x_intRoutine ; Timer Channel 1 ($4A)
jsr >MC56F803x_intRoutine ; Timer Channel 2 ($4C)
jsr >MC56F803x_intRoutine ; Timer Channel 3 ($4E)
jsr >MC56F803x_intRoutine ; ADCA Conversion Complete ($50)
jsr >MC56F803x_intRoutine ; ADCB Conversion Complete ($52)
jsr >MC56F803x_intRoutine ; ADC Zero Crossing or Limit Error ($54)
jsr >MC56F803x_intRoutine ; Reload PWM ($56)
jsr >MC56F803x_intRoutine ; PWM fault ($58)
jsr >MC56F803x_intRoutine ; SW interrupt Low Priority ($5A)


endsec

end

后来又调试了一下,发现在程序停止后,灯全亮后,再手动进行执行,就是通过按F11或F11或shift+F11之后,经过下图中所示的@dunnyF2之后,也就是楼上贴出的MC56F803x_vector.asm程序后,主程序再次执行。然后一定时间后又反复了之前的情况。就这样执行后停止,再手动执行,主程序再次执行,循环着。不知道是为什么。
[upload=image/pjpeg]uploadImages/LEDPIC.JPG[/upload]
解决问题了,把三楼的MC56F803x_vector.asm文件删掉就可以一直执行了。是不是因为程序没有中断,就应该不设置这样的中断向量文件?MC56F803x_vector.asm应该是中断向量定义文件吧?我现在还不是很清楚一个工程里各部分的文件具体详细的功能。
可能是MC56F803x_init.asm文件的问题. 打开MC56F803x_init.asm文件.找到下面汇编语句,在它前面加一个分号试一试。

; hostIO cleanup with exit_halt
;jsr Fexit_halt ; stationery examples use standard i/o
; such as printf implemented with hostIO
; so we use exit_halt here
; see runtime file exit_dsp.asm
; comment out exit_halt if not using hostIO
可能是MC56F803x_init.asm文件的问题. 打开MC56F803x_init.asm文件.找到下面汇编语句,在它前面加一个分号试一试。

; hostIO cleanup with exit_halt
;jsr Fexit_halt ;stationery examples use standard i/o
; such as printf implemented with hostIO
; so we use exit_halt here
; see runtime file exit_dsp.asm
; comment out exit_halt if not using hostIO
返回列表