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
> >
>Message
Re: Interrupt in LPC22XX
2006-05-10 by poland459
Attachments
- No local attachments were found for this message.