程序代码如下。不知道是什么原因使得标志位无法清除,哪位达人解答一下啊
#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;
}
谢谢指点。标志位是否清除通过观察连接PB0的指示灯的亮灭。我设定的总线频率25M,定时器的基频位25M/8=3.125M,那么定时溢出时间为65536/3.125M=21ms,PB0口输出的波形频率25HZ,足以用肉眼观察。用示波器查看没有输出波形,程序调试自动运行的话会自己停止,在汇编窗口出现如下代码:BGND,反复执行
中断能进入。反复执行BGND,是不是表示程序跑飞了
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |