CODE
#include <intrinsics.h>
#include <stdio.h>
#include <nxp/iolpc1766.h>
#include "board.h"
#pragma section=".intvec"
#define FCCO_FREQ (300UL MHZ)
#define CCKL_DIV (3UL)
#define FCCLK_FREQ (FCCO_FREQ/CCKL_DIV)
#define FPCLK_FREQ (FCCLK_FREQ/4)
#define PCLK FPCLK_FREQ
volatile Int8U LedsState;
Int32U Reg;
void InitClock(void)
{
// 1. Init OSC
SCS_bit.OSCRANGE = 0;
SCS_bit.OSCEN = 1;
// 2. Wait for OSC ready
while(!SCS_bit.OSCSTAT);
// 3. Disconnect PLL
PLL0CON_bit.PLLC = 0;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
// 4. Disable PLL
PLL0CON_bit.PLLE = 0;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
// 5. Select source clock for PLL
CLKSRCSEL_bit.CLKSRC = 1; // Selects the main oscillator as a PLL clock source.
PCLKSEL0 = PCLKSEL1 = 0; // other peripherals 100/4 = 25MHz
// 6. Set PLL settings 300 MHz
PLL0CFG_bit.MSEL = 25-1;
PLL0CFG_bit.NSEL = 2-1;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
// 7. Enable PLL
PLL0CON_bit.PLLE = 1;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
// 8. Wait for the PLL to achieve lock
while(!PLL0STAT_bit.PLOCK);
// 9. Set clk divider settings
CCLKCFG = 3-1; // 1/3 Fpll
// 10. Connect the PLL
PLL0CON_bit.PLLC = 1;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
}
void GpioInit(void)
{
// Set to inputs
FIO0DIR = \
FIO1DIR = \
FIO2DIR = \
FIO3DIR = \
FIO4DIR = 0;
// clear mask registers
FIO0MASK =\
FIO1MASK =\
FIO2MASK =\
FIO3MASK =\
FIO4MASK = 0;
// Reset all GPIO pins to default primary function
PINSEL0 =\
PINSEL1 =\
PINSEL2 =\
PINSEL3 =\
PINSEL4 =\
PINSEL7 =\
PINSEL8 =\
PINSEL9 = 0;
}
Int32U cnt;
void TR0int(void)
{
cnt=0;
T0MR0=FCCLK_FREQ/200;
T0MCR=3;
SETENA0 |= (1<<1);
IP0=0;
T0TCR=1;
}
void ExInt(void)
{
IO2INTENF |= (1<<10);
SETENA0 |= (1<<18);
}
void TMR0_IRQHandler (void)
{
T0IR=1;
__enable_interrupt();
cnt++;
if ( cnt >= 0x20)
{
FIO2PIN = Reg;
Reg=Reg<<1;
if(Reg>128)
{
FIO2PIN=0;
Reg=4;
}
cnt = 0;
}
CLRPEND0 |= ~(1<<1);
}
void EINT0_IRQHandler (void)
{
IO2INTCLR |= (1<<10);
__enable_interrupt(); /* handles nested interrupt */
FIO1PIN=0x80000000;
CLRPEND0 |= ~(1<<18);
}
int main(void)
{
// Flash accelerator init
FLASHCFG = (0x5UL<<12) | 0x3AUL;
// Init clock
InitClock();
#if FCCLK_FREQ < 20000000
FLASHCFG = (0x0UL<<12) | 0x3AUL;
#elif FCCLK_FREQ < 40000000
FLASHCFG = (0x1UL<<12) | 0x3AUL;
#elif FCCLK_FREQ < 60000000
FLASHCFG = (0x2UL<<12) | 0x3AUL;
#elif FCCLK_FREQ < 80000000
FLASHCFG = (0x3UL<<12) | 0x3AUL;
#elif FCCLK_FREQ < 100000000
FLASHCFG = (0x4UL<<12) | 0x3AUL;
#endif
Reg=4;
// Init GPIO
GpioInit();
ExInt();
TR0int();
// Init LEDs
FIO2DIR = 0x000000ff;
FIO1DIR = 0xF0000000;
while (1)
{ /* Loop forever */
}
}
#include <stdio.h>
#include <nxp/iolpc1766.h>
#include "board.h"
#pragma section=".intvec"
#define FCCO_FREQ (300UL MHZ)
#define CCKL_DIV (3UL)
#define FCCLK_FREQ (FCCO_FREQ/CCKL_DIV)
#define FPCLK_FREQ (FCCLK_FREQ/4)
#define PCLK FPCLK_FREQ
volatile Int8U LedsState;
Int32U Reg;
void InitClock(void)
{
// 1. Init OSC
SCS_bit.OSCRANGE = 0;
SCS_bit.OSCEN = 1;
// 2. Wait for OSC ready
while(!SCS_bit.OSCSTAT);
// 3. Disconnect PLL
PLL0CON_bit.PLLC = 0;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
// 4. Disable PLL
PLL0CON_bit.PLLE = 0;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
// 5. Select source clock for PLL
CLKSRCSEL_bit.CLKSRC = 1; // Selects the main oscillator as a PLL clock source.
PCLKSEL0 = PCLKSEL1 = 0; // other peripherals 100/4 = 25MHz
// 6. Set PLL settings 300 MHz
PLL0CFG_bit.MSEL = 25-1;
PLL0CFG_bit.NSEL = 2-1;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
// 7. Enable PLL
PLL0CON_bit.PLLE = 1;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
// 8. Wait for the PLL to achieve lock
while(!PLL0STAT_bit.PLOCK);
// 9. Set clk divider settings
CCLKCFG = 3-1; // 1/3 Fpll
// 10. Connect the PLL
PLL0CON_bit.PLLC = 1;
PLL0FEED = 0xAA;
PLL0FEED = 0x55;
}
void GpioInit(void)
{
// Set to inputs
FIO0DIR = \
FIO1DIR = \
FIO2DIR = \
FIO3DIR = \
FIO4DIR = 0;
// clear mask registers
FIO0MASK =\
FIO1MASK =\
FIO2MASK =\
FIO3MASK =\
FIO4MASK = 0;
// Reset all GPIO pins to default primary function
PINSEL0 =\
PINSEL1 =\
PINSEL2 =\
PINSEL3 =\
PINSEL4 =\
PINSEL7 =\
PINSEL8 =\
PINSEL9 = 0;
}
Int32U cnt;
void TR0int(void)
{
cnt=0;
T0MR0=FCCLK_FREQ/200;
T0MCR=3;
SETENA0 |= (1<<1);
IP0=0;
T0TCR=1;
}
void ExInt(void)
{
IO2INTENF |= (1<<10);
SETENA0 |= (1<<18);
}
void TMR0_IRQHandler (void)
{
T0IR=1;
__enable_interrupt();
cnt++;
if ( cnt >= 0x20)
{
FIO2PIN = Reg;
Reg=Reg<<1;
if(Reg>128)
{
FIO2PIN=0;
Reg=4;
}
cnt = 0;
}
CLRPEND0 |= ~(1<<1);
}
void EINT0_IRQHandler (void)
{
IO2INTCLR |= (1<<10);
__enable_interrupt(); /* handles nested interrupt */
FIO1PIN=0x80000000;
CLRPEND0 |= ~(1<<18);
}
int main(void)
{
// Flash accelerator init
FLASHCFG = (0x5UL<<12) | 0x3AUL;
// Init clock
InitClock();
#if FCCLK_FREQ < 20000000
FLASHCFG = (0x0UL<<12) | 0x3AUL;
#elif FCCLK_FREQ < 40000000
FLASHCFG = (0x1UL<<12) | 0x3AUL;
#elif FCCLK_FREQ < 60000000
FLASHCFG = (0x2UL<<12) | 0x3AUL;
#elif FCCLK_FREQ < 80000000
FLASHCFG = (0x3UL<<12) | 0x3AUL;
#elif FCCLK_FREQ < 100000000
FLASHCFG = (0x4UL<<12) | 0x3AUL;
#endif
Reg=4;
// Init GPIO
GpioInit();
ExInt();
TR0int();
// Init LEDs
FIO2DIR = 0x000000ff;
FIO1DIR = 0xF0000000;
while (1)
{ /* Loop forever */
}
}
пограмма написана на подобие примеров IAR. работает все кроме внешнего прерывания.
вроде бы все сделал правильно. EINT0 приходится на 10 ножку P2 и флаг разрешения внешнего прерывания 0 находиться на 18 бите регистра разрешений прерываний.
в обработчике прерыванию ставлю брейк поинт и нечего нет(((
(у меня MT-link)