fpc/rtl/embedded/arm/lpc8xx.pp

535 lines
16 KiB
ObjectPascal

unit lpc8xx;
{$goto on}
{$define lpc8xx}
interface
{$PACKRECORDS 2}
const
//------------------------- Cortex-M0 Processor Exceptions Numbers -------------------------
Reset_IRQn = -15; // 1 Reset Vector, invoked on Power up and warm reset
NonMaskableInt_IRQn = -14; // 2 Non Maskable Interrupt
HardFault_IRQn = -13; // 3 Cortex-M0 Hard Fault Interrupt
SVCall_IRQn = -5; // 11 Cortex-M0 SV Call Interrupt
PendSV_IRQn = -2; // 14 Cortex-M0 Pend SV Interrupt
SysTick_IRQn = -1; // 15 Cortex-M0 System Tick Interrupt
//------------------------- LPC8xx Specific Interrupt Numbers -------------------------
SPI0_IRQn = 0; // SPI0
SPI1_IRQn = 1; // SPI1
UART0_IRQn = 3; // USART0
UART1_IRQn = 4; // USART1
UART2_IRQn = 5; // USART2
I2C_IRQn = 8; // I2C
SCT_IRQn = 9; // SCT
MRT_IRQn = 10; // MRT
CMP_IRQn = 11; // CMP
WDT_IRQn = 12; // WDT
BOD_IRQn = 13; // BOD
WKT_IRQn = 15; // WKT Interrupt
PININT0_IRQn = 24; // External Interrupt 0
PININT1_IRQn = 25; // External Interrupt 1
PININT2_IRQn = 26; // External Interrupt 2
PININT3_IRQn = 27; // External Interrupt 3
PININT4_IRQn = 28; // External Interrupt 4
PININT5_IRQn = 29; // External Interrupt 5
PININT6_IRQn = 30; // External Interrupt 6
PININT7_IRQn = 31; // External Interrupt 7
type
{ ------------- System Control (SYSCON) ------------- }
TSYSCON_Registers = record
SYSMEMREMAP : longword;
PRESETCTRL : longword;
SYSPLLCTRL : longword;
SYSPLLSTAT : longword;
RESERVED0 : array [0 .. 3] of longword;
SYSOSCCTRL : longword;
WDTOSCCTRL : longword;
RESERVED1 : array [0 .. 1] of longword;
SYSRSTSTAT : longword;
RESERVED2 : array [0 .. 2] of longword;
SYSPLLCLKSEL : longword;
SYSPLLCLKUEN : longword;
RESERVED3 : array [0 .. 9] of longword;
MAINCLKSEL : longword;
MAINCLKUEN : longword;
SYSAHBCLKDIV : longword;
RESERVED4 : longword;
SYSAHBCLKCTRL: longword;
RESERVED5 : array [0 .. 3] of longword;
UARTCLKDIV : longword;
RESERVED6 : array [0 .. 17] of longword;
CLKOUTSEL : longword;
CLKOUTUEN : longword;
CLKOUTDIV : longword;
RESERVED7 : longword;
UARTFRGDIV : longword;
UARTFRGMULT : longword;
RESERVED8 : longword;
EXTTRACECMD : longword;
PIOPORCAP0 : longword;
RESERVED9 : array [0 .. 11] of longword;
IOCONCLKDIV : array [0 .. 6] of longword;
BODCTRL : longword;
SYSTCKCAL : longword;
RESERVED10 : array [0 .. 5] of longword;
IRQLATENCY : longword;
NMISRC : longword;
PINTSEL : array [0 .. 7] of longword;
RESERVED11 : array [0 .. 26] of longword;
STARTERP0 : longword;
RESERVED12 : array [0 .. 2] of longword;
STARTERP1 : longword;
RESERVED13 : array [0 .. 5] of longword;
PDSLEEPCFG : longword;
PDAWAKECFG : longword;
PDRUNCFG : longword;
RESERVED14 : array [0 .. 109] of longword;
DEVICE_ID : longword;
end;
{ ------------- Pin Connect Block (IOCON) ------------- }
TIOCON_Registers = record
PIO0_17 : longword;
PIO0_13 : longword;
PIO0_12 : longword;
PIO0_5 : longword;
PIO0_4 : longword;
PIO0_3 : longword;
PIO0_2 : longword;
PIO0_11 : longword;
PIO0_10 : longword;
PIO0_16 : longword;
PIO0_15 : longword;
PIO0_1 : longword;
RESERVED0: longword;
PIO0_9 : longword;
PIO0_8 : longword;
PIO0_7 : longword;
PIO0_6 : longword;
PIO0_0 : longword;
PIO0_14 : longword;
end;
{ ------------- Flash Controller (FLASHCTRL) ------------- }
TFLASHCTRL_Registers = record
RESERVED0: array [0 .. 3] of longword;
FLASHCFG : longword;
RESERVED1: array [0 .. 2] of longword;
FMSSTART : longword;
FMSSTOP : longword;
RESERVED2: longword;
FMSW0 : longword;
end;
{ ------------- Power Management Unit (PMU) ------------- }
TPMU_Registers = record
PCON : longword;
GPREG0 : longword;
GPREG1 : longword;
GPREG2 : longword;
GPREG3 : longword;
DPDCTRL: longword;
end;
{ ------------- Switch Matrix Register (SWM) ------------- }
TSWM_Registers = record
PINASSIGN : array [0 .. 8] of longword;
RESERVED0 : array [0 .. 102] of longword;
PINENABLE0: longword;
end;
{ ------------- General Purpose Input/Output (GPIO) ------------- }
TGPIOPORT_Registers = record
B0 : array [0 .. 17] of byte;
RESERVED0: array [0 .. 2038] of word;
W0 : array [0 .. 17] of longword;
RESERVED1: array [0 .. 1005] of longword;
DIR0 : longword;
RESERVED2: array [0 .. 30] of longword;
MASK0 : longword;
RESERVED3: array [0 .. 30] of longword;
PIN0 : longword;
RESERVED4: array [0 .. 30] of longword;
MPIN0 : longword;
RESERVED5: array [0 .. 30] of longword;
SET0 : longword;
RESERVED6: array [0 .. 30] of longword;
CLR0 : longword;
RESERVED7: array [0 .. 30] of longword;
NOT0 : longword;
end;
{ ------------- Pin interrupts/pattern match engine (PIN_INT) ------------- }
TPININT_Registers = record
ISEL : longword;
IENR : longword;
SIENR : longword;
CIENR : longword;
IENF : longword;
SIENF : longword;
CIENF : longword;
RISE : longword;
FALL : longword;
IST : longword;
PMCTRL: longword;
PMSRC : longword;
PMCFG : longword;
end;
{ ------------- CRC Engine (CRC) ------------- }
TCRC_Registers = record
MODE: longword;
SEED: longword;
SUM : longword;
end;
{ ------------- Comparator (CMP) ------------- }
TCMP_Registers = record
CTRL: longword;
LAD : longword;
end;
{ ------------- Wakeup Timer (WKT) ------------- }
TWKT_Registers = record
CTRL : longword;
RESERVED0: array [0 .. 1] of longword;
COUNT : longword;
end;
{ ------------- Multi-Rate Timer(MRT) ------------- }
TMRTChannel = record
INTVAL: longword;
TIMER : longword;
CTRL : longword;
STAT : longword;
end;
TMRT_Registers = record
CHANNEL : array [0 .. 3] of TMRTChannel;
RESERVED0: array [0 .. 0] of longword;
IDLE_CH : longword;
IRQ_FLAG : longword;
end;
{ ------------- Universal Asynchronous Receiver Transmitter (USART) ------------- }
TUSART_Registers = record
CFG : longword;
CTRL : longword;
STAT : longword;
INTENSET : longword;
INTENCLR : longword;
RXDATA : longword;
RXDATA_STAT: longword;
TXDATA : longword;
BRG : longword;
INTSTAT : longword;
end;
{ ------------- Synchronous Serial Interface Controller (SPI) ------------- }
TSPI_Registers = record
CFG : longword;
DLY : longword;
STAT : longword;
INTENSET: longword;
INTENCLR: longword;
RXDAT : longword;
TXDATCTL: longword;
TXDAT : longword;
TXCTRL : longword;
_DIV : longword;
INTSTAT : longword;
end;
{ ------------- Inter-Integrated Circuit (I2C) ------------- }
TI2C_Registers = record
CFG : longword;
STAT : longword;
INTENSET : longword;
INTENCLR : longword;
TIMEOUT : longword;
_DIV : longword;
INTSTAT : longword;
RESERVED0: longword;
MSTCTL : longword;
MSTTIME : longword;
MSTDAT : longword;
RESERVED1: array [0 .. 4] of longword;
SLVCTL : longword;
SLVDAT : longword;
SLVADR0 : longword;
SLVADR1 : longword;
SLVADR2 : longword;
SLVADR3 : longword;
SLVQUAL0 : longword;
RESERVED2: array [0 .. 8] of longword;
MONRXDAT : longword;
end;
{ ------------- State Configurable Timer (SCT) ------------- }
const
CONFIG_SCT_nEV = 6;
{ Number of match/compare registers }
CONFIG_SCT_nRG = 5;
{ Number of outputs }
CONFIG_SCT_nOU = 4;
type
TSCTState = record
STATE : longword;
CTRL : longword;
end;
TSCTSet = record
_SET : longword;
CLR : longword;
end;
type
TSCT_Registers = record
CONFIG : longword;
CTRL : longword;
LIMIT : longword;
HALT : longword;
STOP : longword;
START : longword;
RESERVED1 : array [0 .. 9] of longword;
COUNT : longword;
STATE : longword;
INPUT : longword;
REGMODE : longword;
OUTPUT : longword;
OUTPUTDIRCTRL : longword;
RES : longword;
RESERVED2 : array [0 .. 36] of longword;
EVEN : longword;
EVFLAG : longword;
CONEN : longword;
CONFLAG : longword;
MATCH_CAP : array [0 .. (CONFIG_SCT_nRG) - 1] of longword;
RESERVED3 : array [0 .. (32 - CONFIG_SCT_nRG) - 1] of longword;
MATCHREL_CAPCTRL: array [0 .. (CONFIG_SCT_nRG) - 1] of longword;
RESERVED6 : array [0 .. (32 - CONFIG_SCT_nRG) - 1] of longword;
EVENT : array [0 .. (CONFIG_SCT_nEV) - 1] of TSCTState;
RESERVED9 : array [0 .. (128 - (2 * CONFIG_SCT_nEV)) - 1] of longword;
_OUT : array [0 .. (CONFIG_SCT_nOU) - 1] of TSCTSet;
end;
{ ------------- Watchdog Timer (WDT) ------------- }
TWDT_Registers = record
_MOD : longword;
TC : longword;
FEED : longword;
TV : longword;
RESERVED0: longword;
WARNINT : longword;
WINDOW : longword;
end;
{ **************************************************************************** }
{ Peripheral memory map }
{ **************************************************************************** }
const
{ Base addresses }
LPC_FLASH_BASE = $00000000;
LPC_RAM_BASE = $10000000;
LPC_ROM_BASE = $1FFF0000;
LPC_APB0_BASE = $40000000;
LPC_AHB_BASE = $50000000;
{ APB0 peripherals }
LPC_WDT_BASE = LPC_APB0_BASE + $00000;
LPC_MRT_BASE = LPC_APB0_BASE + $04000;
LPC_WKT_BASE = LPC_APB0_BASE + $08000;
LPC_SWM_BASE = LPC_APB0_BASE + $0C000;
LPC_PMU_BASE = LPC_APB0_BASE + $20000;
LPC_CMP_BASE = LPC_APB0_BASE + $24000;
LPC_FLASHCTRL_BASE = LPC_APB0_BASE + $40000;
LPC_IOCON_BASE = LPC_APB0_BASE + $44000;
LPC_SYSCON_BASE = LPC_APB0_BASE + $48000;
LPC_I2C_BASE = LPC_APB0_BASE + $50000;
LPC_SPI0_BASE = LPC_APB0_BASE + $58000;
LPC_SPI1_BASE = LPC_APB0_BASE + $5C000;
LPC_USART0_BASE = LPC_APB0_BASE + $64000;
LPC_USART1_BASE = LPC_APB0_BASE + $68000;
LPC_USART2_BASE = LPC_APB0_BASE + $6C000;
{ AHB peripherals }
LPC_CRC_BASE = LPC_AHB_BASE + $00000;
LPC_SCT_BASE = LPC_AHB_BASE + $04000;
LPC_GPIO_PORT_BASE = $A0000000;
LPC_PIN_INT_BASE = LPC_GPIO_PORT_BASE + $4000;
// ****************************************************************************
// Peripheral declaration
// ****************************************************************************
{$ALIGN 2}
var
WDT : TWDT_Registers absolute LPC_WDT_BASE;
MRT : TMRT_Registers absolute LPC_MRT_BASE;
WKT : TWKT_Registers absolute LPC_WKT_BASE;
SWM : TSWM_Registers absolute LPC_SWM_BASE;
PMU : TPMU_Registers absolute LPC_PMU_BASE;
CMP : TCMP_Registers absolute LPC_CMP_BASE;
FLASHCTRL: TFLASHCTRL_Registers absolute LPC_FLASHCTRL_BASE;
IOCON : TIOCON_Registers absolute LPC_IOCON_BASE;
SYSCON : TSysCon_Registers absolute LPC_SYSCON_BASE;
I2C : TI2C_Registers absolute LPC_I2C_BASE;
SPI0 : TSPI_Registers absolute LPC_SPI0_BASE;
SPI1 : TSPI_Registers absolute LPC_SPI1_BASE;
USART0 : TUSART_Registers absolute LPC_USART0_BASE;
USART1 : TUSART_Registers absolute LPC_USART0_BASE;
USART2 : TUSART_Registers absolute LPC_USART0_BASE;
CRC : TCRC_Registers absolute LPC_CRC_BASE;
SCT : TSCT_Registers absolute LPC_SCT_BASE;
GPIO_PORT: TGPIOPort_Registers absolute LPC_GPIO_PORT_BASE;
PIN_INT : TPININT_Registers absolute LPC_PIN_INT_BASE;
implementation
procedure NonMaskableInt_interrupt; external name 'NonMaskableInt_interrupt';
procedure Hardfault_interrupt; external name 'Hardfault_interrupt';
procedure Startup_Checksum; external name 'Startup_Checksum';
procedure SVCall_interrupt; external name 'SVCall_interrupt';
procedure PendSV_interrupt; external name 'PendSV_interrupt';
procedure SysTick_interrupt; external name 'SysTick_interrupt';
procedure SPI0_Interrupt; external name 'SPI0_Interrupt';
procedure SPI1_Interrupt; external name 'SPI1_Interrupt';
procedure UART0_Interrupt; external name 'UART0_Interrupt';
procedure UART1_Interrupt; external name 'UART1_Interrupt';
procedure UART2_Interrupt; external name 'UART2_Interrupt';
procedure I2C_Interrupt; external name 'I2C_Interrupt';
procedure SCT_Interrupt; external name 'SCT_Interrupt';
procedure MRT_Interrupt; external name 'MRT_Interrupt';
procedure CMP_Interrupt; external name 'CMP_Interrupt';
procedure WDT_Interrupt; external name 'WDT_Interrupt';
procedure BOD_Interrupt; external name 'BOD_Interrupt';
procedure WKT_Interrupt; external name 'WKT_Interrupt';
procedure PINIT0_Interrupt; external name 'PINIT0_Interrupt';
procedure PINIT1_Interrupt; external name 'PINIT1_Interrupt';
procedure PINIT2_Interrupt; external name 'PINIT2_Interrupt';
procedure PINIT3_Interrupt; external name 'PINIT3_Interrupt';
procedure PINIT4_Interrupt; external name 'PINIT4_Interrupt';
procedure PINIT5_Interrupt; external name 'PINIT5_Interrupt';
procedure PINIT6_Interrupt; external name 'PINIT6_Interrupt';
procedure PINIT7_Interrupt; external name 'PINIT7_Interrupt';
{$I cortexm0_start.inc}
procedure Vectors; assembler;
nostackframe;
label interrupt_vectors;
asm
.section ".init.interrupt_vectors"
interrupt_vectors:
.long _stack_top
.long Startup
.long NonMaskableInt_interrupt
.long Hardfault_interrupt
.long 0
.long 0
.long 0
.long Startup_Checksum
.long 0
.long 0
.long 0
.long SVCall_interrupt
.long 0
.long 0
.long PendSV_interrupt
.long SysTick_interrupt
.long SPI0_Interrupt
.long SPI1_Interrupt
.long 0
.long UART0_Interrupt
.long UART1_Interrupt
.long UART2_Interrupt
.long 0
.long 0
.long I2C_Interrupt
.long SCT_Interrupt
.long MRT_Interrupt
.long CMP_Interrupt
.long WDT_Interrupt
.long BOD_Interrupt
.long 0
.long WKT_Interrupt
.long 0
.long 0
.long 0
.long 0
.long 0
.long 0
.long 0
.long 0
.long PINIT0_Interrupt
.long PINIT1_Interrupt
.long PINIT2_Interrupt
.long PINIT3_Interrupt
.long PINIT4_Interrupt
.long PINIT5_Interrupt
.long PINIT6_Interrupt
.long PINIT7_Interrupt
.weak NonMaskableInt_interrupt
.weak Hardfault_interrupt
.weak Startup_Checksum
.weak SVCall_interrupt
.weak PendSV_interrupt
.weak SysTick_interrupt
.weak SPI0_Interrupt
.weak SPI1_Interrupt
.weak UART0_Interrupt
.weak UART1_Interrupt
.weak UART2_Interrupt
.weak I2C_Interrupt
.weak SCT_Interrupt
.weak MRT_Interrupt
.weak CMP_Interrupt
.weak WDT_Interrupt
.weak BOD_Interrupt
.weak WKT_Interrupt
.weak PINIT0_Interrupt
.weak PINIT1_Interrupt
.weak PINIT2_Interrupt
.weak PINIT3_Interrupt
.weak PINIT4_Interrupt
.weak PINIT5_Interrupt
.weak PINIT6_Interrupt
.weak PINIT7_Interrupt
.set NonMaskableInt_interrupt, Startup
.set Hardfault_interrupt , Startup
.set SVCall_interrupt , Startup
.set PendSV_interrupt , Startup
.set SysTick_interrupt , Startup
.set SPI0_Interrupt , Startup
.set SPI1_Interrupt , Startup
.set UART0_Interrupt , Startup
.set UART1_Interrupt , Startup
.set UART2_Interrupt , Startup
.set I2C_Interrupt , Startup
.set SCT_Interrupt , Startup
.set MRT_Interrupt , Startup
.set CMP_Interrupt , Startup
.set WDT_Interrupt , Startup
.set BOD_Interrupt , Startup
.set WKT_Interrupt , Startup
.set PINIT0_Interrupt, Startup
.set PINIT1_Interrupt, Startup
.set PINIT2_Interrupt, Startup
.set PINIT3_Interrupt, Startup
.set PINIT4_Interrupt, Startup
.set PINIT5_Interrupt, Startup
.set PINIT6_Interrupt, Startup
.set PINIT7_Interrupt, Startup
.text
end;
end.