Код
#pragma vector=0x18
__irq __arm void IRQ_ISR_Handler (void)
{
void (*interrupt_function)();
unsigned int vector;
vector = VICVectAddr; // Get interrupt vector.
interrupt_function = (void(*)())vector;
(*interrupt_function)(); // Call vectored interrupt function.
}
вот майн:
int main()
{
MEMMAP = 2; // Must set this way when executing code out of RAM
FrecInit();
VIC_Init();
__enable_interrupt();
LedInit();
T0_Init(); // 10 msec tick
//PWM_Init();
while(1)
{
if (f_10ms) // every 10 mseconds
{
f_10ms = 0; // reset flag
}
}
}
... и инициализация таймера
void T0_Isr(void) // Timer 0 ISR every 10 msec
{
int IntStatus;
// IntStatus = TIMER_CheckIntType(TIMER0);
// TIMER_ClearInt(TIMER0, IntStatus);
// if(cnt&1)
// IO0CLR_bit.P0_23 = 1;
// else
IO0SET_bit.P0_23 = 1;
// f_10ms = 1; // toggles every 10 mseconds
// if (++cnt > 20)
// {
// f_200ms = 1; // toggles every 200 mseconds
// LedOn();
// }
// if (++cnt > 50)
// {
// cnt = 0;
// LedOff();
// }
T0IR = 0xFF; // reset interrupt flag
VICVectAddr = 0; // reset VIC
}
//------------------------------------------------------------------------------
void T0_Init(void)
{
VICIntSelect &= ~(1<<VIC_TIMER0); // Timer 0 intrpt is an IRQ (VIC_TIMER0 = 4)
VICVectAddr0 = (unsigned int)&T0_Isr; // Install ISR in VIC addr slot 0
VICVectCntl0 = 0x20 | VIC_TIMER0; // IRQ type, TIMER 0 int enabled
VICIntEnable |= (1<<VIC_TIMER0); // Turn on Timer0 Interrupt
T0IR=0xFF; // reset match and capture event interrupts
T0MR2 = 0; // match on the next positive edge of PCLK
T0MR3 = 1; //
T0MCR_bit.MR3RES=1; // reset timer
T0EMR_bit.EM2 =1; // MAT1.2 is on
T0EMR_bit.EM3 =1; // MAT1.3 is on
T0EMR_bit.EMC2 =1; // output set to low
T0EMR_bit.EMC3 =2; // output set to high
T0PR = 0; // prescale counter = 0 ms
T0TC = 0; // reset Timer counter
PINSEL1_bit.P0_28=3; // connect MAT1.2 to pin 19
PINSEL1_bit.P0_29=3; // connect MAT1.3 to pin 20
T0TCR = 1; // enable Timer
unsigned int pclk=GetPclk();
T0TCR = 0; // disable Timer
PINSEL1_bit.P0_23=0;
IO0DIR_bit.P0_23 = 1;
IO0CLR_bit.P0_23 = 1;
T0MCR_bit.MR3RES=1; // reset timer
T0MCR_bit.MR3INT=1; // call interrupt
T0EMR_bit.EMC2 =3; // toggle output
T0EMR_bit.EMC3 =3; // toggle output
T0MR2 = pclk/100; // = 10 msec
T0MR3 = pclk/100; // = 10 msec
prescale counter = 1 ms
T0TC = 0; // reset Timer counter
T0TCR = 1; // enable Timer
}
__irq __arm void IRQ_ISR_Handler (void)
{
void (*interrupt_function)();
unsigned int vector;
vector = VICVectAddr; // Get interrupt vector.
interrupt_function = (void(*)())vector;
(*interrupt_function)(); // Call vectored interrupt function.
}
вот майн:
int main()
{
MEMMAP = 2; // Must set this way when executing code out of RAM
FrecInit();
VIC_Init();
__enable_interrupt();
LedInit();
T0_Init(); // 10 msec tick
//PWM_Init();
while(1)
{
if (f_10ms) // every 10 mseconds
{
f_10ms = 0; // reset flag
}
}
}
... и инициализация таймера
void T0_Isr(void) // Timer 0 ISR every 10 msec
{
int IntStatus;
// IntStatus = TIMER_CheckIntType(TIMER0);
// TIMER_ClearInt(TIMER0, IntStatus);
// if(cnt&1)
// IO0CLR_bit.P0_23 = 1;
// else
IO0SET_bit.P0_23 = 1;
// f_10ms = 1; // toggles every 10 mseconds
// if (++cnt > 20)
// {
// f_200ms = 1; // toggles every 200 mseconds
// LedOn();
// }
// if (++cnt > 50)
// {
// cnt = 0;
// LedOff();
// }
T0IR = 0xFF; // reset interrupt flag
VICVectAddr = 0; // reset VIC
}
//------------------------------------------------------------------------------
void T0_Init(void)
{
VICIntSelect &= ~(1<<VIC_TIMER0); // Timer 0 intrpt is an IRQ (VIC_TIMER0 = 4)
VICVectAddr0 = (unsigned int)&T0_Isr; // Install ISR in VIC addr slot 0
VICVectCntl0 = 0x20 | VIC_TIMER0; // IRQ type, TIMER 0 int enabled
VICIntEnable |= (1<<VIC_TIMER0); // Turn on Timer0 Interrupt
T0IR=0xFF; // reset match and capture event interrupts
T0MR2 = 0; // match on the next positive edge of PCLK
T0MR3 = 1; //
T0MCR_bit.MR3RES=1; // reset timer
T0EMR_bit.EM2 =1; // MAT1.2 is on
T0EMR_bit.EM3 =1; // MAT1.3 is on
T0EMR_bit.EMC2 =1; // output set to low
T0EMR_bit.EMC3 =2; // output set to high
T0PR = 0; // prescale counter = 0 ms
T0TC = 0; // reset Timer counter
PINSEL1_bit.P0_28=3; // connect MAT1.2 to pin 19
PINSEL1_bit.P0_29=3; // connect MAT1.3 to pin 20
T0TCR = 1; // enable Timer
unsigned int pclk=GetPclk();
T0TCR = 0; // disable Timer
PINSEL1_bit.P0_23=0;
IO0DIR_bit.P0_23 = 1;
IO0CLR_bit.P0_23 = 1;
T0MCR_bit.MR3RES=1; // reset timer
T0MCR_bit.MR3INT=1; // call interrupt
T0EMR_bit.EMC2 =3; // toggle output
T0EMR_bit.EMC3 =3; // toggle output
T0MR2 = pclk/100; // = 10 msec
T0MR3 = pclk/100; // = 10 msec
prescale counter = 1 ms
T0TC = 0; // reset Timer counter
T0TCR = 1; // enable Timer
}
в обработчике таймера уже всё убрал, оставил только дёрганье ногой чтоб узнать сработало ли прерывание.
Заранее благодарен
Поправил, IgorKossak