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

求助:ECT定时溢出进入中断后标志位无法清除

求助:ECT定时溢出进入中断后标志位无法清除

程序代码如下。不知道是什么原因使得标志位无法清除,哪位达人解答一下啊

#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
/******************************************************************
*函数名:PLLINIT
*入口参数SNNR寄存器值,REFDV0寄存器值
*出口参数: 无
*功能描述:使用PLLCLK,时钟频率等于2*晶振频率*(SYNR0+1)/(REFDV0+1)
*******************************************************************/
void PLLINIT(uchar SYNR0,uchar REFDV0)
{
CLKSEL=0x00; //disable pll;
CLKSEL_PLLSEL = 0;
PLLCTL_PLLON = 0;
SYNR = SYNR0; //
REFDV = REFDV0;
PLLCTL = 192; //0xC0 CME=1,PLLON=1
PLLCTL_PLLON = 1;
while(!CRGFLG_LOCK);
CLKSEL_PLLSEL = 1;
}

/******************************************************************
*函数名C0_Init()
*入口参数无
*出口参数: 无
*功能描述:设置IOC通道为比较输出,当成功发生匹配时OC0输出翻转
*******************************************************************/
void OC0_Init()
{
TIOS_IOS0=1; //定义IOC0作为比较输出
TCTL2_OM0=0; //OC0输出翻转//00:与输出引脚断开;01:翻转;10:输出清零;11:输出置1
TCTL2_OL0=1;
TC0=10000; //输出占空比为15.3%的方波
TTOV_TOV0=1; //Enable toggle on OC0
}

void main(void) {
/* put your own code here */
DisableInterrupts;
DDRB_BIT0=1;
PLLINIT(24,5);//6M晶振获得25M总线频率
TSCR2_TOI=1; //允许定时中断
TSCR2|=3; //预分频器输出时钟频率为P时钟的1/8,定时器溢出时间为21.97ms
OC0_Init();
TSCR1_TEN=1; //TIMER ENABLE
EnableInterrupts;
for(;;) {} /* wait forever */
/* please make sure that you never leave this function */
}

#pragma CODE_SEG NON_BANKED
void TOI_ISR(void) //定时器溢出{
DisableInterrupts;
TFLG2=0x80; //对标志位清零
PORTB_BIT0=!PORTB_BIT0;
EnableInterrupts;
}

在中断程序里无需软件开关中断,MCU硬件会自动完成。另外,如何知道标志位没有清楚呢?
海纳百川  有容乃大

谢谢指点。标志位是否清除通过观察连接PB0的指示灯的亮灭。我设定的总线频率25M,定时器的基频位25M/8=3.125M,那么定时溢出时间为65536/3.125M=21ms,PB0口输出的波形频率25HZ,足以用肉眼观察。用示波器查看没有输出波形,程序调试自动运行的话会自己停止,在汇编窗口出现如下代码:BGND,反复执行

你可以设置断点看一下是否进了中断。
海纳百川  有容乃大

中断能进入。反复执行BGND,是不是表示程序跑飞了

程序应该是跑飞了。中断矢量地址对吗?
海纳百川  有容乃大
矢量地址定义:VECTOR ADDRESS 0xFFDE  TOI_ISR,应该没有错
把整个project打包上传吧。
海纳百川  有容乃大
这个问题,我也遇到了,楼主解决了吗?急。
小弟也遇到了同样的问题,请问楼主解决了吗?
你 的 中断 程序 void TOI_ISR(void) 有问题。
前面没有加 interrupt 关键字,也没有加#pragma TRAP_PROC,
所以编译器在编译成汇编指令时会当成普通函数处理。
在程序返回时 指令变成RTC ,而不是中断程序应该有的RTI。
这样,你的中断函数应该只能进一次。没办法恢复中断前的现场。
所以程序肯定就异常了。
返回列表