|  | 
 
| 本帖最后由 liuliya21c 于 2011-11-1 21:27 编辑 
 在裸奔用定时器做个定时中断,用小灯来检测下,无奈做了一天一直没解决问题,总是进不去中断,而且程序的switch语句在JLINK仿真时也有问题,只能在部分的case语句那放置断点,请指点下,谢谢,下面我贴下我的程序
 #define GLOBAL_CLK  1
 #include <stdlib.h>
 #include <string.h>
 #include "def.h"
 #include "option.h"
 #include "2440addr.h"
 #include "2440lib.h"
 #include "2440slib.h"
 #include "mmu.h"
 #include "profile.h"
 #include "memtest.h"
 //宏定义---------------------------------------------------------
 #define LED1_ON   (rGPBDAT&=(0<<5))
 #define LED1_OFF  (rGPBDAT&=(1<<5))
 #define LED2_ON   (rGPBDAT&=(0<<6))
 #define LED2_OFF  (rGPBDAT&=(1<<6))
 #define LED3_ON   (rGPBDAT&=(0<<7))
 #define LED3_OFF  (rGPBDAT&=(1<<7))
 #define LED4_ON   (rGPBDAT&=(0<<8))
 #define LED4_OFF  (rGPBDAT&=(1<<8))
 #define M_DIV    92
 #define M_PDIV   1
 #define M_SDIV   1
 #define U_DIV    56
 #define U_PDIV   2
 #define U_SDIV   2
 #define CLKDIVN_VAL 5
 #define CNT_TIM0  25000
 //变量声明--------------------------------------
 unsigned char ucFlag1s;
 unsigned char ucCntTime;
 //----------定时器0中断处理子程序---------------
 void __irq TIME0_INT()
 {
 rSRCPND|=(1<<10);//写1来清除标志位
 rINTPND|=(1<<10);;//写1来清除标志位
 if(++ucCntTime==10)
 {
 ucCntTime=0;
 ucFlag1s=1;
 }
 }
 //-----------初始化GPORTB用来控制LED-------------------
 void init_PORT()
 {
 rGPBUP =0x7ff;
 rGPBCON =0x155555;    //设置为输出
 rGPFCON =0X0000;    //设置为输入
 rGPBDAT |=0x1e0;   //
 }
 //------------初始化TIME0作为定时功能
 void init_Time0()
 {
 rLOCKTIME=0xFFFFFFFF;   //锁定时间计数寄存器
 rUPLLCON=(U_DIV<<12)+(U_PDIV<<2)+U_SDIV;
 //UPLL控制寄存器:Fin=12M,UCLK=48M
 rMPLLCON=(M_DIV<<12)+(M_PDIV<<2)+M_SDIV;
 //MPLL控制寄存器:Fin=12M,FCLK=400M
 rCLKDIVN=CLKDIVN_VAL;           //时钟分频控制寄存器:运算结果PCLK=FCLK/8=50M
 //定时器输入时钟频率=PCLK/{预分频值+1}/分频值
 rTCFG0&=~0xFF;     //定时器0配置寄存器
 rTCFG0=99;     //预分频值=99;
 rTCFG1=0;      //MUX0=1/2;
 //至此,计数周期为250000
 rTCNTB0=CNT_TIM0;  //25000/250000=0.1s,即0.1s中断一次
 rTCON|=0x0000000f;    //开定时器0中断,开启手动更新,自动重载
 rTCON|=(1<<1);    //关闭手动更新
 rINTMSK &=~(1<<10); //开中断
 pISR_TIMER0=(U32)TIME0_INT;//中断处理函数
 }
 //-----------初始化看门狗-----------------------
 void init_WatchDog()
 {
 rWTCON=0x0000;    //关狗
 }
 //-----------主程序的初始化---------------------
 void init_main()
 {
 init_WatchDog();
 init_Time0();
 init_PORT();
 ucFlag1s=0;
 }
 //-----------显示主程序-------------------------
 //1s到了,LED顺序点亮,再顺序熄灭
 void DispLed()
 {
 static unsigned char ucTemp;
 if(ucFlag1s==0)return;
 ucFlag1s=0;
 switch(ucTemp)
 {
 case 0:
 LED1_OFF;
 LED2_OFF;
 LED3_OFF;
 LED4_OFF;
 break;
 case 1:
 LED1_ON;
 break;
 case 2:
 LED2_ON;
 break;
 case 3:
 LED3_ON;
 break;
 case 4:
 LED4_ON;
 break;
 case 5:
 LED4_OFF;
 break;
 case 6:
 LED3_OFF;
 break;
 case 7:
 LED2_OFF;
 break;
 case 8:
 LED1_OFF;ucTemp=0;
 break;
 default :ucTemp=0;break;
 }
 ucTemp++;
 }
 //-----------主程序循环-------------------------
 void Main(void)
 {
 init_main();
 while(1)
 {
 DispLed();
 }
 }
 | 
 |