打印
[ZLG-ARM]

LPC2148的问题,请高手解答

[复制链接]
2240|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nyf1972|  楼主 | 2008-1-3 13:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   我用KEIL 3。03A 做软仿,程序可以进入所有的中断,但是一旦下载LPC2148内部的时候,就不能够进入中断。
   可以确定目标板没有问题,我换了多块。用ULINK 调试,也是进入不了。
   拜托帮忙!谢谢!

   如下是程序部分的描述,有些程序是比较长,我把用一个函数代替,有些用空函数代替。那些代码都与硬件没有关系。
   做软仿,非常容易进入定时中断,下载后,没有(可看到有个测试灯在定时任务中),用是示波器测试也没有波形。
   郁闷中!
 void Timer1Handler (void) __irq     //定时器1中断
    {
    //T1IR=0xff;//清除中断
    T1IR=1;
    Timer1Pro();  
    VICVectAddr = 0;        /* Acknowledge Interrupt */
    }

 // 这部分程序还没有完善
void UartHandler (void ) __irq //UartHandler:  //串口中断 
    {
//   IENABLE;            /* handles nested interrupt */ 
    UartPro();  
    VICVectAddr = 0;        /* Acknowledge Interrupt */
    }

void USTrigInHandler (void) __irq  //超声输入中断
{  
    EXTINT=0X2;            /* clear EINT1 flag */ //如果使用
    USTrigPro();  
    VICVectAddr = 0;        /* Acknowledge Interrupt */
}


unsigned int PwmOutFreshData[10];

void PWM0Handler (void) __irq 
    {
    PWMIR=PWMIR|0X04;       //清除中断寄存器 pwm2通道
    PWM0Pro();
    VICVectAddr = 0;        /* Acknowledge Interrupt */
    }

void IRHandler (void) __irq  //红外输入中断
{  
    EXTINT=0X1;            /* clear EINT0 flag */
    IRPro();        
    VICVectAddr = 0;        /* Acknowledge Interrupt */
}

//***************************Tasks********************************************
void Timer0Handler (void) __irq 
            {  
            T0IR = 1;            /* clear interrupt flag */
            T0MR0=cInterVal_100uS;
            T0MCR=0x03;//T0和MR0匹配时候产生中断,
            T0IR=0;//清除中断
            T0TCR= 0x01;//    定时器控制寄存器。                     T0CTCR=0;
       
            switch(++Cnt_Task)
                { 
                case 1:  //硬件驱动
                    {
                                     IOCLR0=1<<TestLed;

                    //喂狗程序
                                                                 WDMOD=0x03;//WDMOD=0x00;//0x03    ;                     WDTC=cWatchDog_10mS;
                    WDFEED=0xaa;
                    WDFEED=0x55;
                    }break;

                case 2://软件定时器处理
                    {
                         //软件定时器处理     
                                 }break;
                                              
                         case 3: //计算
                    {
                    }break;
                                                    
                case 4://输出控制
                    {
            IOSET0=1<<TestLed;
                    }break;

                case 5: //显示控制
                    {
                         
                    }break;
                             case 6: 
                    { 
                    }break;

                case 7:                                {  
           
                    }break;
                case 8:
                    {
                    Cnt_Task=0;                              
                    }break;
                }
            VICVectAddr = 0;        /* Acknowledge Interrupt */
            }



//***************************fuctions define**************************************

void OSCInit(void)  //初始化OSC PLL
    {
    }
void InitTimer0(void)//初始化T0
    {
    //用匹配寄存器产生中断
    T0IR=1;//清除中断
    T0TCR= 0x03;//    定时器控制寄存器。使能定时器/计数器 
    T0PR=0;    //预分频率为
    T0MR0=cInterVal_100uS;
    T0MCR=0x03;//T0和MR0匹配时候产生中断,同时复位T0
    T0CTCR=0;
    //T0TC内部的计数值。
    T0TCR= 0x01;//    定时器开始运行

    }
void InitAD(void)//初始化AD转换器
    {
    AD0CR=0x1207702
    AD0INTEN=0x0;
    }
void InitUart0(void
    {
    U0LCR = 0x83;               /* 8 bits, no Parity, 1 Stop bit    */
    U0DLM = ( 22118400 / 16 ) / 9600 / 256;                            
    U0DLL =( 22118400 / 16 ) / 9600 % 256;    
    U0LCR = 0x03;               /* DLAB = 0                         */
    }

void VICInit(void)
    {
    VICIntEnable=0x1c170;//0x00000010;//全部需要使能
    VICIntSelect=0x00000000; //全部选择为IRQ

    VICVectCntl0=0X00000025;// 定时器T1中断
    VICVectCntl1=0X0000002F;//  
    VICVectCntl2=0X00000028;//PWM中断
    VICVectCntl3=0X0000002E;//红外中断  使用EINT0输入
    VICVectCntl4=0X00000026;//串口中断
    VICVectCntl5=0X00000024;//定时器T0

    VICVectAddr=0;

    VICVectAddr0=(unsigned)Timer1Handler;
    VICVectAddr1=(unsigned)USTrigInHandler;
    VICVectAddr2=(unsigned)PWM0Handler;
    VICVectAddr3=(unsigned)IRHandler;
    VICVectAddr4=(unsigned)UartHandler;
    VICVectAddr5=(unsigned)Timer0Handler;

    }

 
void PinInit(void)//设置引脚
    {
    PINSEL0=0x800080c5;
    PINSEL1=0x05400001    
    PINSEL2=0X00000004;
    SCS=0x02;    //P1使用高速控制,P0使用低速控制
    IODIR0 =0xc07e1f74    
    //port initialized
    FIO1DIR2=0xFF;//定义P1.16~P1.23为输出
    }
    
void EintInit(void)
    {
    EXTINT=0x00;
    INTWAKE=0;
    EXTMODE=0x07;
    EXTPOLAR=0x07;
    }

void PWMInit(void)//使用PWM2输出
    {
    PWMIR=0x70f;       //清除所有的PWM中断寄存器
    PWMMR2=cPwmPeroid/2;//匹配寄存器赋值
    PWMMR0=cPwmPeroid;     //PMW周期
    PWMLER=0x05;//允许最后写入PWM 匹配0 ,匹配2
    PWMPCR=0x0400;//使能PWM2 输出,PWM2选择单边沿控制模式。
    PWMTCR=0x09; //pwm使能
    PWMMCR=0X00000003; //MR0匹配的时候同步复位 开启中断
    PWMPC=(26-1);//预分频系数为(26/20*25000=32500us) 
    }


void CopyFlashDatatoRam(void)
    {
    }
void MoveBmpTempData(void)
    {
    int32 i;
    for (i=0;i<122;i++)
        {
        LcdRamH=*pBmpDataH;
        LcdRamL=*pBmpDataL;
        pBmpDataH++;
        pBmpDataL++;
        }
    }


void IAPPro(void)
     {
    }
void InitParaData(void)
    {
    **TimerEn=1;
    }

 int main(void)
    {
    PinInit();//设置引脚定义,方向
    OSCInit(); //初始化OSC PLL
    InitTimer0();//初始化T0
    InitAD();//初始化AD转换器
    InitUart0();//初始化串口0
    EintInit();//红外接受器输入
    PWMInit();//使用PWM2输出
    VICInit();//初始化中断系统
    InitParaData();
__asm{MSR     CPSR_c, #0x5f }                                                                                                 
    CopyFlashDatatoRam();
    for(;;)
        {
        IAPPro();//IAPSaveEn做完毕后应该清除

        }

     } 

相关帖子

沙发
zlgmcu| | 2008-1-3 20:27 | 只看该作者

可能是外部中断2出问题

“VICIntEnable=0x1c170;”这一句使能了EXTINT2,但是没有设置中断,也没有处理函数。应该改为"VICIntEnable=0x0c170;”

                                   by     zlgARM_ldj

使用特权

评论回复
板凳
nyf1972|  楼主 | 2008-1-3 23:54 | 只看该作者

RE:ZLGMCU

   VICIntEnable=0x1c170;  >>VICIntEnable=0x0c170;
结果还是一样的。
   是否于启动代码有关?还是与FIQ有关,我没有FIQ

使用特权

评论回复
地板
zlgmcu| | 2008-1-4 12:44 | 只看该作者

先弄一个小的例程把中断调出来

我们公司网站上有一个例程,你试试看
http://www.zlgmcu.com/tools/kaifaban/EasyARM2100/VICVect1.zip

            by  zlgARM_ldj

使用特权

评论回复
5
nyf1972|  楼主 | 2008-1-4 22:08 | 只看该作者

没准是LPC214X的BUG!!!

我找了一些熟手,好像也搞不定!原因我们也在查!真是奇怪了。

使用特权

评论回复
6
NYF1972| | 2008-1-7 14:05 | 只看该作者

ZLGARM是否可以帮我?

中断还是搞不定!真的,奇怪了。 

使用特权

评论回复
7
zlgarm| | 2008-1-7 17:13 | 只看该作者

nyf1972,您好!

有两个地方您能否再检查一下:
1.OSCInit初始化是否正确?此处关系到整个系统的运行。
2.请先将喂狗程序删除,然后再试试。

由于您的程序太长,一下子很难找到问题所在,建议化整为零,一部分一部分查找问题。

                                                          By zlgarm_zxm

使用特权

评论回复
8
zlgarm| | 2008-1-7 19:34 | 只看该作者

中断

nyf1972 您好;

似乎你没有使能内核中的IRQ中断

              By  zlgarm_zhp

使用特权

评论回复
9
nyf1972|  楼主 | 2008-1-7 22:10 | 只看该作者

RE:ZLGARM

IRQ已经使能!还是不行(软仿可以,硬件不行)。晕啊!!!
   我用别人的STARTUP,把我的程序拷入。
   测试结果如下:
   如果不加入EINT1中断,能够进入T0,T1中断,但是我的STARTUP就不行。
   一旦加入EINT1中断,就有问题。如下是EINT1的代码:

void USTrigInHandler (void) __irq  //超声输入中断
{  
    EXTINT=0X2;            /* clear EINT1 flag */ 
    PluseReturnTimer1=T1TC;// 读取定时器  以20M为基础
    USTimerDataFresh=1;//设置刷新标志        
    PluseReturnFlag=1;    //
    VICVectAddr = 0;        /* Acknowledge Interrupt */
}

难道与读取T1TC有问题吗?

    调试中也发现如下的问题,希望得到指点:

    另外用下面两语句测试(TrigOut为P0.11,TestLed;p0.31,Alarm1Port:P0.9):
      IOCLR0=1<<TestLed|1<<TrigOut|1<<Alarm1Port;
      IOSET0=1<<TestLed|1<<TrigOut|1<<Alarm1Port;
    结果发现 TrigOut 无输出,其他端口没有问题,正常输出。
    我的初始化代码为:
void PinInit(void)//设置引脚
    {
    PINSEL0=0x800080c5;//0B1000 0000 0000 0000 1000 0000 1100 0101;
    PINSEL1=0x05400001;//0b0000 0101 0100 0000 0000 0000 0000 0001;    
    PINSEL2=0X00000004;
    SCS=0x02;    //P1使用高速控制,P0使用低速控制
    IODIR0 =0xc07e3f74;//0B1100 0000 0111 1110 0011 1111 0111 0100;    
    //port initialized
    FIO1DIR2=0xFF;//定义P1.16~P1.23为输出
    }

         
     还有,我已经屏蔽掉看门狗,硬件全速运行的时候是否看门狗会起作用?我的程序老是在4秒左右就死了。
     有些怀疑是看门狗。如果是的话如何处理才能够完全关闭看门狗?如果不是看门狗的问题,如何跟踪出问题的地方?
   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

107

帖子

1

粉丝