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

Pin Interrupt Enable/Disable Confusion

Note: This was originally posted on 11th June 2012 at http://forums.arm.com

Hello, at the moment i study the LPC11U1x manual(Cortex-M0) and i found some very confusing thing, in the GPIO interrupt registers to enable a rising edge or level interrupt i can set a bit in IENR or delete a bit to disable the interrupt. but the CIENR disables a interrupt by deleting the corresponding  bit in IENR and again there is SIENR that only set the corresponding bit in IENR

ISEL Pin Interrupt Mode register: Selects if edge or level sensitive

IENR Pin Interrupt Enable: Enables rising edge/level interrupt
0 = Disable rising edge or level interrupt.
1 = Enable rising edge or level interrupt

SIENR Set Pin Interrupt Enable
0 = No operation.
1 = Enable rising edge or level interrupt.

CIENR Clear Pin Interrupt Enable
0 = No operation.
1 = Disable rising edge or level interrupt.

IST Pin Interrupt Status register
1 =  (edge-sensitive): clear rising- and falling-edge detection for this pin.

So if i have a rising edge interrupt i can set him over IENR or SIENR
if i wont to disable the interrupt i can do that by IENR or CIENR or IST
so IST my make sense but why CIENR and SIENR

is this for compatibility with other cortex`s?.  did i understood it right?

Regards Thomas
Parents
  • Note: This was originally posted on 12th June 2012 at http://forums.arm.com

    Hi Thomas,

    I guess you are reading
    http://www.nxp.com/d...ual/UM10462.pdf
    IENR, SIENR and CIENR are physically one hardware register. The reason  for having SIENR and CIENR is to allow a interrupt to be enable/disable  using a single access. Otherwise, if using IENR to enable/disable just  one interrupt, you need a read-modify-write sequence.
    If a interrupt happen between the read and the write, and the interrupt  service routine (ISR) modifies another bit in the IENR, the change made  by the ISR will be lost after interrupt return because the write back of  IENR.

    Similarly, IENF, SIENF and CIENF are also one physically register.

    I haven't use this chip before, so not entirely sure if my understand is correct.

               PMODE(ISEL)   ENRL(IENR)  ENAF(IENF)
     
    Disable             X     0   X
    High level       0     1   1
    Low level           0     1   0
    Rising edge         1     1   0
    Falling edge     1     1   1

     
      [font="Arial"]If you have setup the design as edge trigger  interrupt, you can write 1 to IST register inside your interrupt service  routine to clear the interrupt request.
       
      [/font]If you have setup the design as level  trigger interrupt, you can write 1 to IST register inside your  interrupt service routine to toggle the trigger level. By doing this,  you can make the interrupt trigger on both rising and falling edges.
     
    Hope it make sense.
    regards,
    Joseph
Reply
  • Note: This was originally posted on 12th June 2012 at http://forums.arm.com

    Hi Thomas,

    I guess you are reading
    http://www.nxp.com/d...ual/UM10462.pdf
    IENR, SIENR and CIENR are physically one hardware register. The reason  for having SIENR and CIENR is to allow a interrupt to be enable/disable  using a single access. Otherwise, if using IENR to enable/disable just  one interrupt, you need a read-modify-write sequence.
    If a interrupt happen between the read and the write, and the interrupt  service routine (ISR) modifies another bit in the IENR, the change made  by the ISR will be lost after interrupt return because the write back of  IENR.

    Similarly, IENF, SIENF and CIENF are also one physically register.

    I haven't use this chip before, so not entirely sure if my understand is correct.

               PMODE(ISEL)   ENRL(IENR)  ENAF(IENF)
     
    Disable             X     0   X
    High level       0     1   1
    Low level           0     1   0
    Rising edge         1     1   0
    Falling edge     1     1   1

     
      [font="Arial"]If you have setup the design as edge trigger  interrupt, you can write 1 to IST register inside your interrupt service  routine to clear the interrupt request.
       
      [/font]If you have setup the design as level  trigger interrupt, you can write 1 to IST register inside your  interrupt service routine to toggle the trigger level. By doing this,  you can make the interrupt trigger on both rising and falling edges.
     
    Hope it make sense.
    regards,
    Joseph
Children
No data