标题: 版主帮忙看下我的cop错误 [打印本页]
作者: 碧落星空 时间: 2006-7-10 16:48 标题: 版主帮忙看下我的cop错误
我写了一个小程序试验cop
#define _ENABLE_COP(period) ((*(volatile unsigned char*)_COPCTL_ADR)= (period)) /* Note: 7 longest posible COP duration. 0 == COP disabled. */
#define _ENABLE_COP_X() _ENABLE_COP(7) /* as long as possible */
#define _DISABLE_COP() _ENABLE_COP(0x00) /* COP is disabled if period is 0 */
#define _FEED_COP() ((*(volatile unsigned char*)_COP_RST_ADR)= 0x55,(*(volatile unsigned char*)_COP_RST_ADR)= 0xAA)
#include <hidef.h> /* common defines and macros */
#include <MC9S12NE64.h> /* derivative information */
#include "MOTTYPES.h"
#pragma LINK_INFO DERIVATIVE "MC9S12NE64"
tU16 count;
void main(void) {
CRGINT_RTIE = 0; /* Disable interrupt */
RTICTL_RTR = 0x73; /* Store given value to the prescaler */
CRGFLG = CRGINT_RTIE_MASK; /* Reset interrupt request flag */
CRGINT_RTIE = 1; /* Enable interrupt */
_ENABLE_COP(1);
/* put your own code here */
EnableInterrupts;
for(;;) {} /* wait forever */
}
#pragma CODE_SEG NON_BANKED
void interrupt 7 RTI(void)
{
CRGFLG = CRGINT_RTIE_MASK; /* Reset interrupt request flag */
count++;
_FEED_COP();
}
#pragma CODE_SEG DEFAULT
程序运行一段时间 就会报错,请问这可能是怎么回事?
作者: strongchen 时间: 2006-7-10 17:02
COP应该在主程序里清。在中断里清WATCHDOG能保证间隔吗?即使能,也是不好的。因为有可能主程序跑飞后,中断还能发生,这样WATCHDOG就其不到作用了。
作者: 碧落星空 时间: 2006-7-11 09:41
可是我现在把喂狗操作放在for循环里,程序还是会跑飞,而且调试器不能进入断点和停止,只能复位。
作者: 碧落星空 时间: 2006-7-11 09:51
还有我想问下版主,我想通过cop使mcu复位。那我的cop复位中断向量处是不是应该写_Startup?
还有怎么停止喂狗?
[此贴子已经被作者于2006-7-11 9:51:46编辑过]
作者: strongchen 时间: 2006-7-11 10:28
COP复位发生后,整个MCU就复位了,不管COP中断向量处写的是不是_Startup。至于COP中断向量处到底要写什么,就要看发生COP复位后你的程序要怎么处理了。
怎么停止喂狗?我想,你的程序应该根据某个控制标志来判断是否要继续喂狗。
作者: 碧落星空 时间: 2006-7-11 10:29
tU16 count;
void main(void) {
_ENABLE_COP(1);
/* put your own code here */
EnableInterrupts;
for(;;) {
count++;
_FEED_COP();
if (count==1000) goto NOT_FEED;
} /* wait forever */
NOT_FEED:for(;;){}
}
我这样试了一下,停止喂狗后程序还是跳转到ffff,请问该怎么调试
[此贴子已经被作者于2006-7-11 10:29:56编辑过]
作者: strongchen 时间: 2006-7-11 14:42
你的COP中断矢量里写的是什么地址?
作者: 碧落星空 时间: 2006-7-11 14:55
我试过在prm文件里写VECTOR 2 _Startup
也试过写一个空的中断函数
#pragma CODE_SEG NON_BANKED
void interrupt 2 COP(void){}
#pragma CODE_SEG DEFAULT
但是都这样
作者: strongchen 时间: 2006-7-11 17:15
把你的整个project打包发给我看看吧:strongchen_free@yahoo.com.cn
作者: 碧落星空 时间: 2006-7-12 09:43
谢谢版主,程序我已经发过去了
作者: strongchen 时间: 2006-7-12 11:08
你可以这样试试:
void main(void) {
INITRM=0;
count=0;
_ENABLE_COP(1);
/* put your own code here */
EnableInterrupts;
for(;;) {
count++;
_FEED_COP();
if (count==1000) goto NOT_FEED;
} /* wait forever */
NOT_FEED:for(;;){}
}
作者: 碧落星空 时间: 2006-7-12 11:35
这样还是不行,我又写了这样一个vector文件
#pragma CODE_SEG __NEAR_SEG NON_BANKED /* Interrupt section for this module. Placement will be in NON_BANKED area. */
__interrupt void Cpu_Interrupt(void)
{
}
__interrupt void Cpu_Interrupt1(void)
{
}
#pragma CODE_SEG DEFAULT /* Change code section to DEFAULT. */
typedef void (*near tIsrFunc)(void);
const tIsrFunc _vect[] @0xFF80 = { /* Interrupt table */
Cpu_Interrupt, /* 0 Default (unused) interrupt */
Cpu_Interrupt, /* 1 Default (unused) interrupt */
Cpu_Interrupt, /* 2 Default (unused) interrupt */
Cpu_Interrupt, /* 3 Default (unused) interrupt */
Cpu_Interrupt, /* 4 Default (unused) interrupt */
Cpu_Interrupt, /* 5 Default (unused) interrupt */
Cpu_Interrupt, /* 6 Default (unused) interrupt */
Cpu_Interrupt, /* 7 Default (unused) interrupt */
Cpu_Interrupt, /* 8 Default (unused) interrupt */
Cpu_Interrupt, /* 9 Default (unused) interrupt */
Cpu_Interrupt, /* 10 Default (unused) interrupt */
Cpu_Interrupt, /* 11 Default (unused) interrupt */
Cpu_Interrupt, /* 12 Default (unused) interrupt */
Cpu_Interrupt, /* 13 Default (unused) interrupt */
Cpu_Interrupt, /* 14 Default (unused) interrupt */
Cpu_Interrupt, /* 15 Default (unused) interrupt */
Cpu_Interrupt, /* 16 Default (unused) interrupt */
Cpu_Interrupt, /* 17 Default (unused) interrupt */
Cpu_Interrupt, /* 18 Default (unused) interrupt */
Cpu_Interrupt, /* 19 Default (unused) interrupt */
Cpu_Interrupt, /* 20 Default (unused) interrupt */
Cpu_Interrupt, /* 21 Default (unused) interrupt */
Cpu_Interrupt, /* 22 Default (unused) interrupt */
Cpu_Interrupt, /* 23 Default (unused) interrupt */
Cpu_Interrupt, /* 24 Default (unused) interrupt */
Cpu_Interrupt, /* 25 Default (unused) interrupt */
Cpu_Interrupt, /* 26 Default (unused) interrupt */
Cpu_Interrupt, /* 27 Default (unused) interrupt */
Cpu_Interrupt, /* 28 Default (unused) interrupt */
Cpu_Interrupt, /* 29 Default (unused) interrupt */
Cpu_Interrupt, /* 30 Default (unused) interrupt */
Cpu_Interrupt, /* 31 Default (unused) interrupt */
Cpu_Interrupt, /* 32 Default (unused) interrupt */
Cpu_Interrupt, /* 33 Default (unused) interrupt */
Cpu_Interrupt, /* 34 Default (unused) interrupt */
Cpu_Interrupt, /* 35 Default (unused) interrupt */
Cpu_Interrupt, /* 36 Default (unused) interrupt */
Cpu_Interrupt, /* 37 Default (unused) interrupt */
Cpu_Interrupt, /* 38 Default (unused) interrupt */
Cpu_Interrupt, /* 39 Default (unused) interrupt */
Cpu_Interrupt, /* 40 Default (unused) interrupt */
Cpu_Interrupt, /* 41 Default (unused) interrupt */
Cpu_Interrupt, /* 42 Default (unused) interrupt */
Cpu_Interrupt, /* 43 Default (unused) interrupt */
Cpu_Interrupt, /* 44 Default (unused) interrupt */
Cpu_Interrupt, /* 45 Default (unused) interrupt */
Cpu_Interrupt, /* 46 Default (unused) interrupt */
Cpu_Interrupt, /* 47 Default (unused) interrupt */
Cpu_Interrupt, /* 48 Default (unused) interrupt */
Cpu_Interrupt, /* 49 Default (unused) interrupt */
Cpu_Interrupt, /* 50 Default (unused) interrupt */
Cpu_Interrupt, /* 51 Default (unused) interrupt */
Cpu_Interrupt, /* 52 Default (unused) interrupt */
Cpu_Interrupt, /* 53 Default (unused) interrupt */
Cpu_Interrupt, /* 54 Default (unused) interrupt */
Cpu_Interrupt, /* 55 Default (unused) interrupt */
Cpu_Interrupt, /* 56 Default (unused) interrupt */
Cpu_Interrupt, /* 57 Default (unused) interrupt */
Cpu_Interrupt, /* 58 Default (unused) interrupt */
Cpu_Interrupt, /* 59 Default (unused) interrupt */
Cpu_Interrupt, /* 60 Default (unused) interrupt */
Cpu_Interrupt1, /* 61 Default (unused) interrupt */
Cpu_Interrupt, /* 62 Default (unused) interrupt */
_Startup /* Reset vector */
};
但是不管我把 Cpu_Interrupt1 放在那个中断向量处,调试器都回出现上面图中的情况,并且代码停在
__interrupt void Cpu_Interrupt1(void)
{
}
中断函数处
作者: 碧落星空 时间: 2006-7-12 11:39
还有如果不开启cop,或者一直正常喂狗都不会发生这种情况
作者: strongchen 时间: 2006-7-12 17:31
你是在用硬件进行调试吗?出现这种情况应该是正常的吧,因为芯片发生了复位,BDM的通讯就断掉了。你的问题到底是什么?
作者: 碧落星空 时间: 2006-7-13 08:41
是硬件调试。BDM通信断掉了?我是看到调试器报错,就是ILLEGAL_BP,然后调试器SOURCE就停在上面那个中断处,是因为BDM通信断掉了?那就是说我的程序是没有问题的?
作者: strongchen 时间: 2006-7-13 09:04
程序应该是没问题的。
作者: zephanshaka 时间: 2008-7-11 14:58
我现在也遇到了同样的问题,主要是用RTI唤醒STOP模式的时候,如果不喂狗,程序会跑飞(现象就是死机),所有BDM观察数据都变成FF,但是如果不用COP程序就是正常的。
作者: hooter 时间: 2008-7-11 20:48
我也遇到相同的问题,就是想知道在程序跑飞 无法正常喂狗 产生中断 后,在中断程序里应该如何设置才能将单片机重新初始化 然后再正常运行//??
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) |
Powered by Discuz! 7.0.0 |