Yahoo Groups archive

Lpc2000

Index last updated: 2026-04-28 23:31 UTC

Message

Re: Interrupt in LPC22XX

2006-05-10 by poland459

Thanks for your reply..I have added the asm code and called enableIRQ 
after the timer is enabled.. But the program is not jumping to ISR...

I forgot to mention in my first post that, iam using UART0 in polling 
mode and TIMER0 in ISR..(ISR is not triggered even if I use only 
TIMER0 in ISR).

here is the asm code..

static __inline unsigned long asm_get_cpsr(void) __arm
{
   unsigned long retval;
  __asm { mrs retval, CPSR }; 
   return retval;
}

static __inline void asm_set_cpsr(unsigned long value)  __arm{
  value = value;              // avoid warning: unused parameter
  __asm { msr CPSR_c, R0 };   // value passed in R0
}

unsigned long enableIRQ(void)
{
   unsigned long _cpsr;

   _cpsr = asm_get_cpsr();
   asm_set_cpsr(_cpsr & ~IRQ_MASK);
   return _cpsr;
}

Thank you.

--- In lpc2000@yahoogroups.com, "fordp2002" <SimonEllwood@...> wrote:
 
> I got it from the WinARM site a good place for examples.
> 
> You may have other problems too, I did not read your code in detail.
> 
> Let us know how you get on ;)
> 
> FordP
> 
> 
> Good
> --- In lpc2000@yahoogroups.com, "poland459" <poland459@> wrote:
> >
> > Hi am new to this forum.I am using "free" KEIL evalution software 
as 
> > my IDE to work on LPCE2214 OLIMEX board. Am able to work on TIMER 
and 
> > serial port in "polling" mode. But when I enable ISR functions 
using 
> > VIC,my program in not jumping to ISR.but in debug mode i could 
see 
> > the jump to ISR. also I have DefaultISR in my code.here am 
attaching 
> > my code with this mail.
> > // This program is created for LPC-E2214 board
> > #include "lpc22xx.h"
> > 
> > #define OSCILLATOR_CLOCK_FREQUENCY 14745600 //in MHz
> > #define PLOCK 0x400 //in MHz
> > 
> > 
> > void Initialize(void);
> > void feed(void);
> > void UART0Initialize(unsigned int baud);
> > void UART0WriteChar(unsigned char ch0);
> > unsigned char UART0ReadChar(void);
> > unsigned char UART0ReadChar_nostop(void);
> > unsigned int processorClockFrequency(void);
> > unsigned int peripheralClockFrequency(void);
> > 
> > void tc0(void)__irq;
> > static void DefDummyInterrupt(void)__irq;
> > 
> > void init_timer(void);
> > void InitVIC(void);
> > 
> > long volatile timeval;
> > 
> > void wait (void) /* wait function */
> > {
> > unsigned long i;
> > i = timeval;
> > while ((i + 10) != timeval); /* wait 100ms */
> > }
> > 
> > 
> > 
> > int main()
> > {
> > /**** VARIABLES ****/
> > unsigned char ch0 = 0x0;
> > unsigned char ch1 = 0x0;
> > long i=0;
> > 
> > /**** INITIALIZATION ****/
> > // Frequency initialization
> > Initialize();
> > // UART initialization
> > UART0Initialize(9600);
> > 
> > init_timer();
> > InitVIC();
> > 
> > 
> > while(1)
> > {
> > 
> > UART0WriteChar('3');
> > wait();
> > 
> > UART0WriteChar('2');
> > wait();
> > }
> > 
> > }
> > 
> > 
> > void Initialize(void)
> > {
> > 
> > // Setting Multiplier and Divider values
> > PLLCFG=0x23;
> > feed();
> > 
> > // Enabling the PLL */
> > PLLCON=0x1;
> > feed();
> > 
> > // Wait for the PLL to lock to set frequency
> > while(!(PLLSTAT & PLOCK)) ;
> > 
> > // Connect the PLL as the clock source
> > PLLCON=0x3;
> > feed();
> > 
> > // Enabling MAM and setting number of clocks used for Flash 
memory 
> > fetch (4 cclks in this case)
> > MAMCR=0x2;
> > MAMTIM=0x4;
> > 
> > // Setting peripheral Clock (pclk) to System Clock (cclk)
> > VPBDIV=0x1;
> > 
> > }
> > 
> > 
> > void feed(void)
> > {
> > PLLFEED=0xAA;
> > PLLFEED=0x55;
> > }
> > 
> > /* Setup the Timer Counter 0 Interrupt */
> > void init_timer (void) {
> > T0MR0 = 149999; // 10mSec = 150000-1 counts
> > T0MCR = 3; // Interrupt and Reset on MR0
> > T0TCR = 1; // Timer0 Enable
> > VICVectAddr0 = (unsigned long)tc0; // set interrupt vector in 0
> > VICVectCntl0 = 0x20 | 4; // use it for Timer 0 Interrupt
> > VICIntEnable = 0x00000010; // Enable Timer0 Interrupt // Timer0 
Enable
> > }
> > 
> > /* Timer0 Compare-Match Interrupt Handler (ISR) */
> > /* Timer Counter 0 Interrupt executes each 10ms @ 60 MHz CPU 
Clock */
> > /* Timer Counter 0 Interrupt executes each 10ms @ 60 MHz CPU 
Clock */
> > void tc0 (void) __irq
> > {
> > ++timeval;
> > T0IR = 1; // Clear interrupt flag
> > VICVectAddr = 0; // Acknowledge Interrupt
> > }
> > void DefDummyInterrupt(void)__irq
> > {
> > ;
> > }
> > void InitVIC()
> > {
> > VICDefVectAddr = (unsigned long)DefDummyInterrupt;
> > }
> > 
> > 
> > /**** UART0 ****/
> > void UART0Initialize(unsigned int baud)
> > {
> > unsigned int divisor = peripheralClockFrequency() / (16 * baud);
> > 
> > U0LCR = 0x83;
> > 
> > 
> > //devisor
> > U0DLL = divisor & 0xFF;
> > U0DLM = (divisor >> 8) & 0xFF;
> > U0LCR &= ~0x80;
> > 
> > //set functionalite to pins: port0.0 -> TX0, port0.1 -> RXD0
> > PINSEL0 = PINSEL0 & ~0xF | 0x5;
> > }
> > 
> > void UART0WriteChar(unsigned char ch0)
> > {
> > //when U0LSR_bit.THRE is 0 - U0THR contains valid data.
> > while ((U0LSR && 0x20) == 0);
> > U0THR = ch0;
> > }
> > 
> > unsigned char UART0ReadChar(void)
> > {
> > //when U0LSR_bit.DR is 1 - U0RBR contains valid data
> > while ((U0LSR && 0x01) == 0);
> > return U0RBR;
> > }
> > unsigned int processorClockFrequency(void)
> > {
> > //return real processor clock speed
> > return OSCILLATOR_CLOCK_FREQUENCY * (PLLCON & 1 ? (PLLCFG & 0xF) 
+ 
> > 1 : 1);
> > }
> > 
> > unsigned int peripheralClockFrequency(void)
> > {
> > //VPBDIV - determines the relationship between the processor 
clock 
> > (cclk)
> > //and the clock used by peripheral devices (pclk).
> > unsigned int divider;
> > switch (VPBDIV & 3)
> > {
> > case 0: divider = 4; break;
> > case 1: divider = 1; break;
> > case 2: divider = 2; break;
> > }
> > return processorClockFrequency() / divider;
> > }
> > 
> > Please look into this and It would be a great help for me as i 
have 
> > been trying for it from past 2 weeks.
> > I think, abviously iam missing some things. I did not changed any 
> > things in startup.s file.I will post the start up code if any 
body 
> > wanted to look in
> > please guide me.appreciate your help.
> > 
> > Thanks
> >
>

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.