This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

LPC3250 IRQ_HANDLER HELP

Hi Please Help me out for interrupts on LPC3250. How to enable interrupt handler.my program like below

TIMCLK_CTRL1|=0x08;      // Enable timer clock
T1CTCR          = 0x00;         //use as a timer
T1TCR           =0x01;          // enable timer
T1MCR           =0x00000018;    // match reg 1
T1MR1           =0x00000000;    // reset and Interrupt

And in LPC32x0.s the interrupt handler enabled like this

                                ;PRESERVE8 {FALSE}
                                IMPORT  IRQ_Handler

Reset_Addr      DCD     Reset_Handler
Undef_Addr      DCD     Undef_Handler
SWI_Addr        DCD     SWI_Handler
PAbt_Addr       DCD     PAbt_Handler
DAbt_Addr       DCD     DAbt_Handler
                DCD     0               ; Reserved Address
IRQ_Addr        DCD     IRQ_Handler
FIQ_Addr        DCD     FIQ_Handler

Undef_Handler   B       Undef_Handler
SWI_Handler     B       SWI_Handler
PAbt_Handler    B       PAbt_Handler
DAbt_Handler    B       DAbt_Handler
;IRQ_Handler     B       IRQ_Handler
FIQ_Handler     B       FIQ_Handler

My interrupt routine as below

void IRQ_Handler(void)__irq
{
send_data('D'); // for uart5
P2_OUTP_CLR|=0x00001820; // checking for led glow

        if((MIC_SR&0x00020000)==0x00020000)
        {
        send_data('C');
          T1IR          |=0x01; // T1 Interrupt

          //timer1();

        }
        return;
}

program does not entering into IRQ_Handler
Please Help me out.
Thanks in advance.

  • You need to configure the interrupt controller.

    Here's a starting point for you:

      MIC_APR &= ~(1<<17);     // Activation Polarity
      MIC_ATR &= ~(1<<17);     // Activation Type
      MIC_ITR &= ~(1<<17);     // Interrupt Type (IRQ)
      MIC_ER  |=  (1<<17);     // Enable register
    

    Refer to chapter 5 of the LPC3250 user manual for further details.

  • Thanks for reply.
    This is the way i used in the program.
    MIC_APR |= 0x00020000;
    MIC_ATR &=~0x00020000; // Timer 1 Edge interrupt
    MIC_ITR &=~0x00020000; // IRQ interrupt
    MIC_ER |= 0x00020000;

    we Tested timers without interrupt at match pins successfully.
    Now, for the interrupt
    Is my Procedure to enable the interrupts was right?

  • It says in the manual that the interrupt is active low.
    This is why I included the line:

    MIC_APR &= ~(1<<17);     // Activation Polarity
    

    or, in your form it would be:

    MIC_APR &= ~0x00020000;
    

  • Yes,In User manual it is low. i changed the value now. but still not getting interrupt.Please advice.
    Thank you

  • It would be sensible to initialise T1PR.

    I do not know what effect there would be to setting MR1 to zero. This register contains the match of count; i.e., the frequency of interrupts.

    If PCLK is set to (the typical) 13MHz, then the following would be suitable for a periodic 5ms interrupt:

      T1PR   = 1-1;             // PCLK/1
    
      T1MR0  = 65000-1;         // 5ms/(1/13MHz)
    

  • Yes.i'm getting 5ms as per this values. But help me with interrupt. i studied the data sheet. there is no support about "How to use Interrupt Handler". by following some examples and Datasheet i written the below logic.

    void IRQ_Handler(void)__irq
    {
    send_data('D'); // for uart5
    P2_OUTP_CLR|=0x00001820; // checking for led glow
    
            if((MIC_SR&0x00020000)==0x00020000)
            {
            send_data('C');
              T1IR          |=0x01; // T1 Interrupt
    
              //timer1();
    
            }
            return;
    }
    


    Is this correct?
    If it is correct that 'D' must be print on serial port.
    Please tell me about this IRQ handler enable.

  • The most important requirement of the ISR is to release/acknowledge the interrupt so you can get another one; as:

      T1IR = 1;  // Clear/Acknowledge the interrupt request
    

    You can put anything else into the function that you want.

    I can't advise you on the use send_data function nor your use of P2 because that would be specific to your hardware and code of your project.

    It is typical on the LPC3250 to have a single interrupt entry point that determines the source of the interrupt and calls (or jumps to) the appropriate code, such as:

    void __irq IRQ_Handler(void)
    {
      if ((MIC_SR&0x00020000)!=0)
      {
        Irq_Timer1();
      }
      else if (MIC_SR&0x00040000)!=0)
      {
        Irq_Other();
      }
    }
    

    "Please tell me about this IRQ handler enable."

    I've given you some sample code and a reference to the relevant section of the manual.

    If you want other information, please be more precise.

  • I'm trying with this but i was unable to generate interrupt. Is there any changes have to made on .s file to enable IRQ_Handler?
    And i'm using Keil micro vision 3 compiler.

  • The only change you need to make for IRQ_Handler is in the startup, which you have done. I gave you code to initialise the interrupt controller and timer.

    If your project is very small, then maybe you should consider posting more of the code so we can get a better idea about what you're doing (and what you might be doing wrong).

  • Project is very big and confidential also. But i need support. i'm sending the program which i'm testing.
    C File

    
    #include"LPC325x.h"
    
    
    //void Init_INTERRUPT(void);
    void uart5_init(void);
    void send_data(unsigned char ch);
    unsigned char  receive_data (void);
    //void timer1Handler(void) __irq;
    void Irq_Other (void);
    void Irq_Timer1(void);
    
    main()
    {
    
            P2_MUX_SET|=0x00000008;
            P2_DIR_SET|=0x00001820;
            P_MUX_SET |=0x8000;
            LCD_CTRL=0x00000000;
    
    
            uart5_init();
            send_data('H');
            TIMCLK_CTRL1|=0x08;             // Enable timer clock
            T1CTCR          = 0x00;                 //use as a timer
            T1TCR           =0x01;                  // enable timer
            T1MCR           =0x00000018;    // enable interrupt
            T1MR1           =0x0001387;             // reset and gives interrupt when match occurs
    
            T1TC            =0x00000000;
    
            T1PC            =0x00000000;
            T1PR            =0x00000004;     //set timer frequency to 1h
    
            T1EMR           =0x00C0;                // When match occurs Toggle
    
    
            MIC_APR         &=~0x00020000;
            MIC_ATR         &=~0x00020000;      // Timer 1 Edge interrupt
            MIC_ITR         &=~0x00020000;      // IRQ interrupt
            MIC_ER          |= 0x00020000;
    
    }
    
    
    
    void  IRQ_Handler(void) __irq
            {
             if ((MIC_SR&0x00020000)!=0)
                {
    
               Irq_Timer1();
    
                     T1IR = 0x02;  // Clear/Acknowledge the interrupt request
                    }
             else
                    {
                     Irq_Other();
                    }
            }
    
    
    
    void Irq_Timer1(void)
    {
    unsigned int i;
    
            while(1)
            {
                    P2_OUTP_SET|=0x00001820;           // LED's Toggle
                                                                    for(i=0;i<60000;i++);
                                                                    for(i=0;i<60000;i++);
                                                                    for(i=0;i<60000;i++);
                                                                    for(i=0;i<60000;i++);
                                                                    for(i=0;i<60000;i++);
                                                                    for(i=0;i<60000;i++);
                                                                    for(i=0;i<60000;i++);
                                                                    for(i=0;i<60000;i++);
                    P2_OUTP_CLR|=0x00001820;
                                                                    for(i=0;i<60000;i++);
                                                                    for(i=0;i<60000;i++);
                                                                    for(i=0;i<60000;i++);
                                                                    for(i=0;i<60000;i++);
                                                                    for(i=0;i<60000;i++);
                                                                    for(i=0;i<60000;i++);
                                                                    for(i=0;i<60000;i++);
                                                                    for(i=0;i<60000;i++);
            }
    
    
    }
    
    void Irq_Other (void) // Sending u to hyper terminal and Turn off my LED's
    {
     send_data('u');
     P2_OUTP_CLR|=0x00001820;
    }
    
    /****************************************************************************************
    *Function    :send_data
    *Inputs      :string
    *Output      :none
    *Purpose         :To print the string on serial port
    ****************************************************************************************/
    void send_data(unsigned char ch)
    {
     U5THR=ch;
     while(!(U5LSR & 0x20));
    }
    
    /****************************************************************************************
    *Function    :receive_data
    *Inputs      :string
    *Output      :none
    *Purpose         :To print the string on serial port
    ****************************************************************************************/
    
     unsigned char  receive_data (void)
      {
               unsigned char ch;
            while(!(U5LSR&0x01));
             ch=U5RBR;
             return(ch);
       }
    
    /****************************************************************************************
    *Function    :uart5_init
    *Inputs      :
    *Output      :
    *Purpose         :
    ****************************************************************************************/
    void uart5_init(void)
     {
            //UART_CLKMODE=0x00084010;      // uart 4 selected
            UART_CLKMODE=0x00104100;        // uart 5 selected
            U5LCR=0x83;                                     //DLAB enable,odd parity,disble break transmission,1 stop bit,8 bit character length
            U5CLK =0x00000101;                      //x=1,y=1..115200
            U5DLL=0x07;                             //115200 baud rate
            U5DLM=0x00;
            U5LCR=0x03;                                     //DLAB enable,odd parity,disble break transmission,1 stop bit,8 bit character length
     }
    

    .s File

    
    
    LDR PC,IRQ_Addr LDR PC,FIQ_Addr
    ;PRESERVE8 {FALSE} IMPORT IRQ_Handler
    Reset_Addr DCD Reset_Handler Undef_Addr DCD Undef_Handler SWI_Addr DCD SWI_Handler PAbt_Addr DCD PAbt_Handler DAbt_Addr DCD DAbt_Handler DCD 0 ; Reserved Address IRQ_Addr DCD IRQ_Handler FIQ_Addr DCD FIQ_Handler
    Undef_Handler B Undef_Handler SWI_Handler B SWI_Handler PAbt_Handler B PAbt_Handler DAbt_Handler B DAbt_Handler ;IRQ_Handler B IRQ_Handler FIQ_Handler B FIQ_Handler
    ; Reset Handler
    EXPORT Reset_Handler Reset_Handler

    Please take a look and tell me the problum
    Thanks for helping

  • "Project is very big and confidential also."

    Really?

    Anyway ... You're falling off the end of 'main'!

  • Thank you very much for helping. now i'm able to generate interupt.

  • need help again. I want to capture an interrupt which is coming on CAP3.0 for every 20ms. The interrupt coming from another device for every 20ms.

            TIMCLK_CTRL1|=0x04;// Enable timer clock
            T0CTCR          = 0x1F; //use as CAP 3 Register
            T0CCR           &=~0x0E00;// Making CAP 0
            T0TCR           =0x01;  // enable timer
            T0MCR           =0x00000018;// enable interrupt
    
    
    
    
            MIC_APR         &= ~0x00010000;
            MIC_ATR         &= ~0x00010000;
            MIC_ITR         &=~0x00010000;
            MIC_ER          |= 0x00010000;
    

    Can you please tell me the procedure to capture.
    Thank you.

  • You now have the fundamental ability to get a timer going and processing an interrupt from it.

    You also now know where to look in the reference manual for the infomation concerning each.

    The same section in the reference manual clearly describes what facilities are available and how they should be configured.