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

[求助] 新手请教一个奇怪的问题

[求助] 新手请教一个奇怪的问题

片子是XDT512,写了一个简单的定时器中断闪烁小灯的程序,在仿真里运行程序,小灯正常闪烁。脱离仿真,正常上电运行,结果小灯不闪烁,检查发现程序只进了一次定时器中断就死掉了!请高手帮忙看看是啥原因!
你怎么知道只进了一次中断的呢?
个人BLOG:http://blog.eccn.com/u/107300/index.htm
因为在中断里有控制小灯闪烁,运行后,灯就一直亮着没闪。
怎么叫“在仿真里运行”?另外,你的小灯闪烁的频率大概是多少?
海纳百川  有容乃大

就是编译通过之后,点“Debug”,进入调试环境,在调试环境下点击"Run"。 PS:通过BDM仿真的。

另外,之前是用定时器溢出中断出现的问题。但是我昨天又试了下用模数递减计数器,却完全没有问题!

有没有喂看门狗?

喂了。看门狗肯定没问题,其它程序都跑得很正常。

关键是我Debug的情况下跑得很正常,但是脱离仿真环境,正常上电启动就不正常,实在太奇怪了

有些寄存器在调试模式下可以随意读写,但在正常运行模式下只能写一次。检查一下是否有这样的问题。
海纳百川  有容乃大

我检查了程序,并没有用到什么特殊的寄存器。注:SMALL模式

/*************************************************


PLL初始化


*************************************************/
void PLL_init(void)
{
CLKSEL_PLLSEL=0; // 选用外部晶振作为系统时钟
PLLCTL_PLLON=0; // 锁相环电路禁止
SYNR=19; // 设置倍频系数,Fpllclk=2*4M*(19+1)/(1+1)=80M,所以总线频率为40M
REFDV=1;
PLLCTL_PLLON=1; // 锁相环电路使能
while(!CRGFLG_LOCK);
CLKSEL_PLLSEL=1; // 选用锁相环电路作为系统时钟
}


/*************************************************


CPU硬件部分初始化


*************************************************/
void periph_init(void)
{
DDRB_DDRB0 = 0; // Port B[0..3] input (SW3 1-4)
DDRB_DDRB1 = 0;
DDRB_DDRB2 = 0;
DDRB_DDRB3 = 0;
DDRB_DDRB4 = 1; // Port B[4..7] output (LED1-LED4)
DDRB_DDRB5 = 1;
DDRB_DDRB6 = 1;
DDRB_DDRB7 = 1;


LED1 = OFF; // 将LED全部关闭
LED2 = OFF;
LED3 = OFF;
LED4 = OFF;


DDRP_DDRP0 = 0; // Port BP_0 and BP_1 equals input
DDRP_DDRP1 = 0; // SW1 and SW2


PUCR_PUPBE = 1; // Turn on the pullups for SW3 (1-4)


DDRJ_DDRJ7=0; // PJ7定义为输入
PPSJ_PPSJ7=0; // 下降沿触发中断
PIEJ_PIEJ7=1; // PJ7中断使能
}

/*************************************************


定时器初始化程序


*************************************************/
void Timer_init(void)
{
TSCR1_TEN=0; // 禁止定时器
TSCR1_TFFCA=1; // 快速清除标志位
TSCR2_TOI=1; // TOF置1时申请硬件中断
TSCR2_PR=3; // 预分频系数为8
//TSCR2_PR1=1;
//TSCR2_PR0=1;
TCNT=0x1000; // 设置定时计数器初值
TSCR1_TEN=1; // 使能定时器
}

/*************************************************

定时器溢出中断程序


*************************************************/
#pragma CODE_SEG NON_BANKED
interrupt void TimerOverflow_ISR(void)
{
DisableInterrupts;
TFLG2_TOF=1; // 写1清标志位
TCNT=0x1000; // 重新载入定时计数器初值
LED4=~LED4;
EnableInterrupts;
}
#pragma CODE_SEG DEFAULT

void main(void)
{
uint intTempData;
uchar charTempData;

PLL_init();
periph_init();

Timer_init();

EnableInterrupts; // 全局中断使能
for(;;)
{


}
}

[此贴子已经被作者于2008-9-10 11:33:56编辑过]

返回列表