плата Olimex LPC-P2148
cpu: lpc2148
хочу: мигать светодиодом каждые 2 секунды по прерыванию от таймера 0
результат: вообще ничего не происходит (не мигает)
код задержки
Код
void Soft_Delay (DWORD N)
{
volatile DWORD i;
for (i=0; i<N; i++)
{
;
}
return;
}
{
volatile DWORD i;
for (i=0; i<N; i++)
{
;
}
return;
}
код main:
Код
//******************************************************************************
// GLOBAL DEFINITIONS
//******************************************************************************
#define TIMER0_INT 0x00000010
#define LED 0x00000400 // P0.10 pin
#define PRESCALE_VAL 0x0001869F // TC increments on every 100000 PCLK
#define MATCH_VAL 0x00000078 // Match on 120 value (decimal)
#define MATCH_CONFIG 0x0003 // Interrupt on MR0; Reset on MR0
//******************************************************************************
// FUNCTION PROTOTYPE
//******************************************************************************
__irq void FIQ_Handler (void);
//******************************************************************************
// CODE
//******************************************************************************
int main()
{
//Fosc = 12 MHz
Init_PLL(0x42, 0x00); // CCLK = 2*Fosc = 24 MHz; PCLK = CCLK / 4 = 6 MHz
IO0DIR=LED; // Set P0.10 as output
IO0SET=LED; // initially turn OFF LED
Init_Timer(PRESCALE_VAL, MATCH_VAL, MATCH_CONFIG);
Enable_Timer(0x00); // Timer 0 enable
VICIntSelect = TIMER0_INT; //assign TIMER0 intterupt to FIQ category
VICIntEnable = TIMER0_INT; //Enable TIMER0 interrupt
while(1)
{
;
}
}
//interupt handler function
__irq void FIQ_Handler (void)
{
IO0CLR=LED; // turn ON LED
Soft_Delay(10000000); // delay
IO0SET=LED; // turn OFF LED
T0IR = 0x00; // Clear the interrupt flag
}
// GLOBAL DEFINITIONS
//******************************************************************************
#define TIMER0_INT 0x00000010
#define LED 0x00000400 // P0.10 pin
#define PRESCALE_VAL 0x0001869F // TC increments on every 100000 PCLK
#define MATCH_VAL 0x00000078 // Match on 120 value (decimal)
#define MATCH_CONFIG 0x0003 // Interrupt on MR0; Reset on MR0
//******************************************************************************
// FUNCTION PROTOTYPE
//******************************************************************************
__irq void FIQ_Handler (void);
//******************************************************************************
// CODE
//******************************************************************************
int main()
{
//Fosc = 12 MHz
Init_PLL(0x42, 0x00); // CCLK = 2*Fosc = 24 MHz; PCLK = CCLK / 4 = 6 MHz
IO0DIR=LED; // Set P0.10 as output
IO0SET=LED; // initially turn OFF LED
Init_Timer(PRESCALE_VAL, MATCH_VAL, MATCH_CONFIG);
Enable_Timer(0x00); // Timer 0 enable
VICIntSelect = TIMER0_INT; //assign TIMER0 intterupt to FIQ category
VICIntEnable = TIMER0_INT; //Enable TIMER0 interrupt
while(1)
{
;
}
}
//interupt handler function
__irq void FIQ_Handler (void)
{
IO0CLR=LED; // turn ON LED
Soft_Delay(10000000); // delay
IO0SET=LED; // turn OFF LED
T0IR = 0x00; // Clear the interrupt flag
}
код PLL_Init
Код
void Init_PLL (BYTE MP_Mask, BYTE PCLK_Mask)
{
//set multiplier and divider of the PLL0
PLL0CFG = MP_Mask;
//enable PLL0
PLL0CON = 0x1;
//provide feed sequence
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
//wait until PLL0 is locked
while (!(PLL0STAT & PLL0_LOCKED))
{
;
}
//connect PLL0
PLL0CON = 0x3;
//provide feed sequence
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
//set peripheral clock
VPBDIV = PCLK_Mask;
return;
}
{
//set multiplier and divider of the PLL0
PLL0CFG = MP_Mask;
//enable PLL0
PLL0CON = 0x1;
//provide feed sequence
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
//wait until PLL0 is locked
while (!(PLL0STAT & PLL0_LOCKED))
{
;
}
//connect PLL0
PLL0CON = 0x3;
//provide feed sequence
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
//set peripheral clock
VPBDIV = PCLK_Mask;
return;
}
Init_timer:
Код
void Init_Timer(DWORD Prescale_Val, DWORD Match_Val, WORD Match_Config)
{
T0PR = Prescale_Val;
T0MR0 = Match_Val;
T0MCR = Match_Config;
return;
}
void Enable_Timer(BYTE Timer_Num)
{
if (Timer_Num==0)
{
T0TCR = 0x01;
}
else
{
T1TCR = 0x01;
}
return;
}
{
T0PR = Prescale_Val;
T0MR0 = Match_Val;
T0MCR = Match_Config;
return;
}
void Enable_Timer(BYTE Timer_Num)
{
if (Timer_Num==0)
{
T0TCR = 0x01;
}
else
{
T1TCR = 0x01;
}
return;
}
PCLK настроил на 6 МГц (VPBDIV=0 --> pclk=0.25*cclk),
в таймере Prescale настроил на 100000 чтобы счетчик считал с частотой 60 Герц (6MHz/100000), в MR записал 120 (120/60 = 2 сек), т.е. каждые 2 секнды должно быть прерывание по таймеру 0 и LED должен мигнуть.
но этого не происходит ... в чем проблема - понять не могу.