diff --git a/.cproject b/.cproject
new file mode 100644
index 0000000..2d7e130
--- /dev/null
+++ b/.cproject
@@ -0,0 +1,298 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ <?xml version="1.0" encoding="UTF-8"?>
+<TargetConfig>
+<Properties property_2="LPC15xx_256K.cfx" property_3="NXP" property_4="LPC1549" property_count="5" version="100300"/>
+<infoList vendor="NXP">
+<info chip="LPC1549" connectscript="LPC15RunBootRomConnect.scp" flash_driver="LPC15xx_256K.cfx" match_id="0x0" name="LPC1549" resetscript="LPC15RunBootRomReset.scp" stub="crt_emu_cm3_gen">
+<chip>
+<name>LPC1549</name>
+<family>LPC15xx</family>
+<vendor>NXP (formerly Philips)</vendor>
+<reset board="None" core="Real" sys="Real"/>
+<clock changeable="TRUE" freq="12MHz" is_accurate="TRUE"/>
+<memory can_program="true" id="Flash" is_ro="true" type="Flash"/>
+<memory id="RAM" type="RAM"/>
+<memory id="Periph" is_volatile="true" type="Peripheral"/>
+<memoryInstance derived_from="Flash" id="MFlash256" location="0x0" size="0x40000"/>
+<memoryInstance derived_from="RAM" id="Ram0_16" location="0x2000000" size="0x4000"/>
+<memoryInstance derived_from="RAM" id="Ram1_16" location="0x2004000" size="0x4000"/>
+<memoryInstance derived_from="RAM" id="Ram2_4" location="0x2008000" size="0x1000"/>
+</chip>
+<processor>
+<name gcc_name="cortex-m3">Cortex-M3</name>
+<family>Cortex-M</family>
+</processor>
+</info>
+</infoList>
+</TargetConfig>
+
+
+ LPCXpresso1549
+
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 259148f..ca1dbd7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,3 +30,4 @@
*.exe
*.out
*.app
+/Debug/
diff --git a/.project b/.project
new file mode 100644
index 0000000..ef218d5
--- /dev/null
+++ b/.project
@@ -0,0 +1,29 @@
+
+
+ Ventilation
+
+
+ lpc_board_nxp_lpcxpresso_1549
+ lpc_chip_15xx
+
+
+
+ org.eclipse.cdt.managedbuilder.core.genmakebuilder
+ clean,full,incremental,
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
+ full,incremental,
+
+
+
+
+
+ org.eclipse.cdt.core.cnature
+ org.eclipse.cdt.core.ccnature
+ org.eclipse.cdt.managedbuilder.core.managedBuildNature
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
+
+
diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml
new file mode 100644
index 0000000..7620796
--- /dev/null
+++ b/.settings/language.settings.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Ventilation.cpp b/src/Ventilation.cpp
new file mode 100644
index 0000000..b602ec6
--- /dev/null
+++ b/src/Ventilation.cpp
@@ -0,0 +1,51 @@
+/*
+===============================================================================
+ Name : main.c
+ Author : $(author)
+ Version :
+ Copyright : $(copyright)
+ Description : main definition
+===============================================================================
+*/
+
+#if defined (__USE_LPCOPEN)
+#if defined(NO_BOARD_LIB)
+#include "chip.h"
+#else
+#include "board.h"
+#endif
+#endif
+
+#include
+
+// TODO: insert other include files here
+
+// TODO: insert other definitions and declarations here
+
+int main(void) {
+
+#if defined (__USE_LPCOPEN)
+ // Read clock settings and update SystemCoreClock variable
+ SystemCoreClockUpdate();
+#if !defined(NO_BOARD_LIB)
+ // Set up and initialize all required blocks and
+ // functions related to the board hardware
+ Board_Init();
+ // Set the LED to the state of "On"
+ Board_LED_Set(0, true);
+#endif
+#endif
+
+ // TODO: insert code here
+
+ // Force the counter to be placed into memory
+ volatile static int i = 0 ;
+ // Enter an infinite loop, just incrementing a counter
+ while(1) {
+ i++ ;
+ // "Dummy" NOP to allow source level single
+ // stepping of tight while() loop
+ __asm volatile ("nop");
+ }
+ return 0 ;
+}
diff --git a/src/cr_cpp_config.cpp b/src/cr_cpp_config.cpp
new file mode 100644
index 0000000..ba7308e
--- /dev/null
+++ b/src/cr_cpp_config.cpp
@@ -0,0 +1,91 @@
+//*****************************************************************************
+// +--+
+// | ++----+
+// +-++ |
+// | |
+// +-+--+ |
+// | +--+--+
+// +----+ Copyright (c) 2009-2012 Code Red Technologies Ltd.
+// +----+ Copyright 2013, 2019 NXP
+//
+// Minimal implementations of the new/delete operators and the verbose
+// terminate handler for exceptions suitable for embedded use,
+// plus optional "null" stubs for malloc/free (only used if symbol
+// CPP_NO_HEAP is defined).
+//
+//
+// Version : 120126
+//
+// Software License Agreement
+//
+// The software is owned by Code Red Technologies and/or its suppliers, and is
+// protected under applicable copyright laws. All rights are reserved. Any
+// use in violation of the foregoing restrictions may subject the user to criminal
+// sanctions under applicable laws, as well as to civil liability for the breach
+// of the terms and conditions of this license.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
+// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
+// USE OF THIS SOFTWARE FOR COMMERCIAL DEVELOPMENT AND/OR EDUCATION IS SUBJECT
+// TO A CURRENT END USER LICENSE AGREEMENT (COMMERCIAL OR EDUCATIONAL) WITH
+// CODE RED TECHNOLOGIES LTD.
+//
+//*****************************************************************************
+
+#include
+
+void *operator new(size_t size)
+{
+ return malloc(size);
+}
+
+void *operator new[](size_t size)
+{
+ return malloc(size);
+}
+
+void operator delete(void *p)
+{
+ free(p);
+}
+
+void operator delete[](void *p)
+{
+ free(p);
+}
+
+extern "C" int __aeabi_atexit(void *object,
+ void (*destructor)(void *),
+ void *dso_handle)
+{
+ return 0;
+}
+
+#ifdef CPP_NO_HEAP
+extern "C" void *malloc(size_t) {
+ return (void *)0;
+}
+
+extern "C" void free(void *) {
+}
+#endif
+
+#ifndef CPP_USE_CPPLIBRARY_TERMINATE_HANDLER
+/******************************************************************
+ * __verbose_terminate_handler()
+ *
+ * This is the function that is called when an uncaught C++
+ * exception is encountered. The default version within the C++
+ * library prints the name of the uncaught exception, but to do so
+ * it must demangle its name - which causes a large amount of code
+ * to be pulled in. The below minimal implementation can reduce
+ * code size noticeably. Note that this function should not return.
+ ******************************************************************/
+namespace __gnu_cxx {
+void __verbose_terminate_handler()
+{
+ while(1);
+}
+}
+#endif
diff --git a/src/cr_startup_lpc15xx.cpp b/src/cr_startup_lpc15xx.cpp
new file mode 100644
index 0000000..fe98025
--- /dev/null
+++ b/src/cr_startup_lpc15xx.cpp
@@ -0,0 +1,501 @@
+//*****************************************************************************
+// LPC15xx Microcontroller Startup code for use with LPCXpresso IDE
+//
+// Version : 150706
+//*****************************************************************************
+//
+// Copyright 2013-2015, 2019, 2020 NXP
+// All rights reserved.
+//
+// NXP Confidential. This software is owned or controlled by NXP and may only be
+// used strictly in accordance with the applicable license terms.
+//
+// By expressly accepting such terms or by downloading, installing, activating
+// and/or otherwise using the software, you are agreeing that you have read, and
+// that you agree to comply with and are bound by, such license terms.
+//
+// If you do not agree to be bound by the applicable license terms, then you may not
+// retain, install, activate or otherwise use the software.
+//*****************************************************************************
+
+#if defined (__cplusplus)
+#ifdef __REDLIB__
+#error Redlib does not support C++
+#else
+//*****************************************************************************
+//
+// The entry point for the C++ library startup
+//
+//*****************************************************************************
+extern "C" {
+ extern void __libc_init_array(void);
+}
+#endif
+#endif
+
+#define WEAK __attribute__ ((weak))
+#define ALIAS(f) __attribute__ ((weak, alias (#f)))
+
+//*****************************************************************************
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
+//*****************************************************************************
+#if defined (__USE_CMSIS) || defined (__USE_LPCOPEN)
+// Declaration of external SystemInit function
+extern void SystemInit(void);
+#endif
+
+//*****************************************************************************
+//
+// Forward declaration of the default handlers. These are aliased.
+// When the application defines a handler (with the same name), this will
+// automatically take precedence over these weak definitions
+//
+//*****************************************************************************
+void ResetISR(void);
+WEAK void NMI_Handler(void);
+WEAK void HardFault_Handler(void);
+WEAK void MemManage_Handler(void);
+WEAK void BusFault_Handler(void);
+WEAK void UsageFault_Handler(void);
+WEAK void SVC_Handler(void);
+WEAK void DebugMon_Handler(void);
+WEAK void PendSV_Handler(void);
+WEAK void SysTick_Handler(void);
+WEAK void IntDefaultHandler(void);
+
+//*****************************************************************************
+//
+// Forward declaration of the specific IRQ handlers. These are aliased
+// to the IntDefaultHandler, which is a 'forever' loop. When the application
+// defines a handler (with the same name), this will automatically take
+// precedence over these weak definitions
+//
+//*****************************************************************************
+// Note: The names used for the IRQ Handlers in the LPCXpresso LPC15xx startup
+// code did not originally match those used by the LPCOpen LPC15xx packages.
+// Now default to using LPCOpen IRQ Handler names. But allow the use of the
+// previous names if necessary for legacy code by undefining the below symbol
+#define USE_LPCOPEN_IRQHANDLER_NAMES
+
+#if defined (USE_LPCOPEN_IRQHANDLER_NAMES)
+void WDT_IRQHandler(void) ALIAS(IntDefaultHandler);
+void BOD_IRQHandler(void) ALIAS(IntDefaultHandler);
+void FMC_IRQHandler(void) ALIAS(IntDefaultHandler);
+void EEPROM_IRQHandler(void) ALIAS(IntDefaultHandler);
+void DMA_IRQHandler(void) ALIAS(IntDefaultHandler);
+void GINT0_IRQHandler(void) ALIAS(IntDefaultHandler);
+void GINT1_IRQHandler(void) ALIAS(IntDefaultHandler);
+void PIN_INT0_IRQHandler(void) ALIAS(IntDefaultHandler);
+void PIN_INT1_IRQHandler(void) ALIAS(IntDefaultHandler);
+void PIN_INT2_IRQHandler(void) ALIAS(IntDefaultHandler);
+void PIN_INT3_IRQHandler(void) ALIAS(IntDefaultHandler);
+void PIN_INT4_IRQHandler(void) ALIAS(IntDefaultHandler);
+void PIN_INT5_IRQHandler(void) ALIAS(IntDefaultHandler);
+void PIN_INT6_IRQHandler(void) ALIAS(IntDefaultHandler);
+void PIN_INT7_IRQHandler(void) ALIAS(IntDefaultHandler);
+void RIT_IRQHandler(void) ALIAS(IntDefaultHandler);
+void SCT0_IRQHandler(void) ALIAS(IntDefaultHandler);
+void SCT1_IRQHandler(void) ALIAS(IntDefaultHandler);
+void SCT2_IRQHandler(void) ALIAS(IntDefaultHandler);
+void SCT3_IRQHandler(void) ALIAS(IntDefaultHandler);
+void MRT_IRQHandler(void) ALIAS(IntDefaultHandler);
+void UART0_IRQHandler(void) ALIAS(IntDefaultHandler);
+void UART1_IRQHandler(void) ALIAS(IntDefaultHandler);
+void UART2_IRQHandler(void) ALIAS(IntDefaultHandler);
+void I2C0_IRQHandler(void) ALIAS(IntDefaultHandler);
+void SPI0_IRQHandler(void) ALIAS(IntDefaultHandler);
+void SPI1_IRQHandler(void) ALIAS(IntDefaultHandler);
+void CAN_IRQHandler(void) ALIAS(IntDefaultHandler);
+void USB_IRQHandler(void) ALIAS(IntDefaultHandler);
+void USB_FIQHandler(void) ALIAS(IntDefaultHandler);
+void USBWakeup_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ADC0A_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ADC0B_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ADC0_THCMP_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ADC0_OVR_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ADC1A_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ADC1B_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ADC1_THCMP_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ADC1_OVR_IRQHandler(void) ALIAS(IntDefaultHandler);
+void DAC_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ACMP0_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ACMP1_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ACMP2_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ACMP3_IRQHandler(void) ALIAS(IntDefaultHandler);
+void QEI_IRQHandler(void) ALIAS(IntDefaultHandler);
+void RTC_ALARM_IRQHandler(void) ALIAS(IntDefaultHandler);
+void RTC_WAKE_IRQHandler(void) ALIAS(IntDefaultHandler);
+#else
+void WDT_IRQHandler(void) ALIAS(IntDefaultHandler);
+void BOD_IRQHandler(void) ALIAS(IntDefaultHandler);
+void FLASH_IRQHandler(void) ALIAS(IntDefaultHandler);
+void EEPROM_IRQHandler(void) ALIAS(IntDefaultHandler);
+void DMA_IRQHandler(void) ALIAS(IntDefaultHandler);
+void GINT0_IRQHandler(void) ALIAS(IntDefaultHandler);
+void GINT1_IRQHandler(void) ALIAS(IntDefaultHandler);
+void PININT0_IRQHandler(void) ALIAS(IntDefaultHandler);
+void PININT1_IRQHandler(void) ALIAS(IntDefaultHandler);
+void PININT2_IRQHandler(void) ALIAS(IntDefaultHandler);
+void PININT3_IRQHandler(void) ALIAS(IntDefaultHandler);
+void PININT4_IRQHandler(void) ALIAS(IntDefaultHandler);
+void PININT5_IRQHandler(void) ALIAS(IntDefaultHandler);
+void PININT6_IRQHandler(void) ALIAS(IntDefaultHandler);
+void PININT7_IRQHandler(void) ALIAS(IntDefaultHandler);
+void RIT_IRQHandler(void) ALIAS(IntDefaultHandler);
+void SCT0_IRQHandler(void) ALIAS(IntDefaultHandler);
+void SCT1_IRQHandler(void) ALIAS(IntDefaultHandler);
+void SCT2_IRQHandler(void) ALIAS(IntDefaultHandler);
+void SCT3_IRQHandler(void) ALIAS(IntDefaultHandler);
+void MRT_IRQHandler(void) ALIAS(IntDefaultHandler);
+void UART0_IRQHandler(void) ALIAS(IntDefaultHandler);
+void UART1_IRQHandler(void) ALIAS(IntDefaultHandler);
+void UART2_IRQHandler(void) ALIAS(IntDefaultHandler);
+void I2C0_IRQHandler(void) ALIAS(IntDefaultHandler);
+void SPI0_IRQHandler(void) ALIAS(IntDefaultHandler);
+void SPI1_IRQHandler(void) ALIAS(IntDefaultHandler);
+void CAN0_IRQHandler(void) ALIAS(IntDefaultHandler);
+void USB_IRQHandler(void) ALIAS(IntDefaultHandler);
+void USB_FIQHandler(void) ALIAS(IntDefaultHandler);
+void USBWakeup_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ADC0_SEQA_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ADC0_SEQB_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ADC0_THCMP_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ADC0_OVR_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ADC1_SEQA_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ADC1_SEQB_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ADC1_THCMP_IRQHandler(void) ALIAS(IntDefaultHandler);
+void ADC1_OVR_IRQHandler(void) ALIAS(IntDefaultHandler);
+void DAC_IRQHandler(void) ALIAS(IntDefaultHandler);
+void CMP0_IRQHandler(void) ALIAS(IntDefaultHandler);
+void CMP1_IRQHandler(void) ALIAS(IntDefaultHandler);
+void CMP2_IRQHandler(void) ALIAS(IntDefaultHandler);
+void CMP3_IRQHandler(void) ALIAS(IntDefaultHandler);
+void QEI_IRQHandler(void) ALIAS(IntDefaultHandler);
+void RTC_ALARM_IRQHandler(void) ALIAS(IntDefaultHandler);
+void RTC_WAKE_IRQHandler(void) ALIAS(IntDefaultHandler);
+#endif
+//*****************************************************************************
+//
+// The entry point for the application.
+// __main() is the entry point for Redlib based applications
+// main() is the entry point for Newlib based applications
+//
+//*****************************************************************************
+#if defined (__REDLIB__)
+extern void __main(void);
+#endif
+extern int main(void);
+//*****************************************************************************
+//
+// External declaration for the pointer to the stack top from the Linker Script
+//
+//*****************************************************************************
+extern void _vStackTop(void);
+
+//*****************************************************************************
+//
+// External declaration for LPC MCU vector table checksum from Linker Script
+//
+//*****************************************************************************
+WEAK extern void __valid_user_code_checksum();
+
+//*****************************************************************************
+#if defined (__cplusplus)
+} // extern "C"
+#endif
+//*****************************************************************************
+//
+// The vector table.
+// This relies on the linker script to place at correct location in memory.
+//
+//*****************************************************************************
+extern void (* const g_pfnVectors[])(void);
+__attribute__ ((used,section(".isr_vector")))
+void (* const g_pfnVectors[])(void) = {
+ // Core Level - CM3
+ &_vStackTop, // The initial stack pointer
+ ResetISR, // The reset handler
+ NMI_Handler, // The NMI handler
+ HardFault_Handler, // The hard fault handler
+ MemManage_Handler, // The MPU fault handler
+ BusFault_Handler, // The bus fault handler
+ UsageFault_Handler, // The usage fault handler
+ __valid_user_code_checksum, // LPC MCU Checksum
+ 0, // Reserved
+ 0, // Reserved
+ 0, // Reserved
+ SVC_Handler, // SVCall handler
+ DebugMon_Handler, // Debug monitor handler
+ 0, // Reserved
+ PendSV_Handler, // The PendSV handler
+ SysTick_Handler, // The SysTick handler
+
+ // Chip Level - LPC15xx
+#if defined (USE_LPCOPEN_IRQHANDLER_NAMES)
+ WDT_IRQHandler, // 0 - Windowed watchdog timer
+ BOD_IRQHandler, // 1 - BOD
+ FMC_IRQHandler, // 2 - Flash controller
+ EEPROM_IRQHandler, // 3 - EEPROM controller
+ DMA_IRQHandler, // 4 - DMA
+ GINT0_IRQHandler, // 5 - GINT0
+ GINT1_IRQHandler, // 6 - GINT1
+ PIN_INT0_IRQHandler, // 7 - PIO INT0
+ PIN_INT1_IRQHandler, // 8 - PIO INT1
+ PIN_INT2_IRQHandler, // 9 - PIO INT2
+ PIN_INT3_IRQHandler, // 10 - PIO INT3
+ PIN_INT4_IRQHandler, // 11 - PIO INT4
+ PIN_INT5_IRQHandler, // 12 - PIO INT5
+ PIN_INT6_IRQHandler, // 13 - PIO INT6
+ PIN_INT7_IRQHandler, // 14 - PIO INT7
+ RIT_IRQHandler, // 15 - RIT
+ SCT0_IRQHandler, // 16 - State configurable timer
+ SCT1_IRQHandler, // 17 - State configurable timer
+ SCT2_IRQHandler, // 18 - State configurable timer
+ SCT3_IRQHandler, // 19 - State configurable timer
+ MRT_IRQHandler, // 20 - Multi-Rate Timer
+ UART0_IRQHandler, // 21 - UART0
+ UART1_IRQHandler, // 22 - UART1
+ UART2_IRQHandler, // 23 - UART2
+ I2C0_IRQHandler, // 24 - I2C0 controller
+ SPI0_IRQHandler, // 25 - SPI0 controller
+ SPI1_IRQHandler, // 26 - SPI1 controller
+ CAN_IRQHandler, // 27 - C_CAN0
+ USB_IRQHandler, // 28 - USB IRQ
+ USB_FIQHandler, // 29 - USB FIQ
+ USBWakeup_IRQHandler, // 30 - USB wake-up
+ ADC0A_IRQHandler, // 31 - ADC0 sequence A completion
+ ADC0B_IRQHandler, // 32 - ADC0 sequence B completion
+ ADC0_THCMP_IRQHandler, // 33 - ADC0 threshold compare
+ ADC0_OVR_IRQHandler, // 34 - ADC0 overrun
+ ADC1A_IRQHandler, // 35 - ADC1 sequence A completion
+ ADC1B_IRQHandler, // 36 - ADC1 sequence B completion
+ ADC1_THCMP_IRQHandler, // 37 - ADC1 threshold compare
+ ADC1_OVR_IRQHandler, // 38 - ADC1 overrun
+ DAC_IRQHandler, // 39 - DAC
+ ACMP0_IRQHandler, // 40 - Analog Comparator 0
+ ACMP1_IRQHandler, // 41 - Analog Comparator 1
+ ACMP2_IRQHandler, // 42 - Analog Comparator 2
+ ACMP3_IRQHandler, // 43 - Analog Comparator 3
+ QEI_IRQHandler, // 44 - QEI
+ RTC_ALARM_IRQHandler, // 45 - RTC alarm
+ RTC_WAKE_IRQHandler, // 46 - RTC wake-up
+#else
+ WDT_IRQHandler, // 0 - Windowed watchdog timer
+ BOD_IRQHandler, // 1 - BOD
+ FLASH_IRQHandler, // 2 - Flash controller
+ EEPROM_IRQHandler, // 3 - EEPROM controller
+ DMA_IRQHandler, // 4 - DMA
+ GINT0_IRQHandler, // 5 - GINT0
+ GINT1_IRQHandler, // 6 - GINT1
+ PININT0_IRQHandler, // 7 - PIO INT0
+ PININT1_IRQHandler, // 8 - PIO INT1
+ PININT2_IRQHandler, // 9 - PIO INT2
+ PININT3_IRQHandler, // 10 - PIO INT3
+ PININT4_IRQHandler, // 11 - PIO INT4
+ PININT5_IRQHandler, // 12 - PIO INT5
+ PININT6_IRQHandler, // 13 - PIO INT6
+ PININT7_IRQHandler, // 14 - PIO INT7
+ RIT_IRQHandler, // 15 - RIT
+ SCT0_IRQHandler, // 16 - State configurable timer
+ SCT1_IRQHandler, // 17 - State configurable timer
+ SCT2_IRQHandler, // 18 - State configurable timer
+ SCT3_IRQHandler, // 19 - State configurable timer
+ MRT_IRQHandler, // 20 - Multi-Rate Timer
+ UART0_IRQHandler, // 21 - UART0
+ UART1_IRQHandler, // 22 - UART1
+ UART2_IRQHandler, // 23 - UART2
+ I2C0_IRQHandler, // 24 - I2C0 controller
+ SPI0_IRQHandler, // 25 - SPI0 controller
+ SPI1_IRQHandler, // 26 - SPI1 controller
+ CAN0_IRQHandler, // 27 - C_CAN0
+ USB_IRQHandler, // 28 - USB IRQ
+ USB_FIQHandler, // 29 - USB FIQ
+ USBWakeup_IRQHandler, // 30 - USB wake-up
+ ADC0_SEQA_IRQHandler, // 31 - ADC0 sequence A completion
+ ADC0_SEQB_IRQHandler, // 32 - ADC0 sequence B completion
+ ADC0_THCMP_IRQHandler, // 33 - ADC0 threshold compare
+ ADC0_OVR_IRQHandler, // 34 - ADC0 overrun
+ ADC1_SEQA_IRQHandler, // 35 - ADC1 sequence A completion
+ ADC1_SEQB_IRQHandler, // 36 - ADC1 sequence B completion
+ ADC1_THCMP_IRQHandler, // 37 - ADC1 threshold compare
+ ADC1_OVR_IRQHandler, // 38 - ADC1 overrun
+ DAC_IRQHandler, // 39 - DAC
+ CMP0_IRQHandler, // 40 - Analog Comparator 0
+ CMP1_IRQHandler, // 41 - Analog Comparator 1
+ CMP2_IRQHandler, // 42 - Analog Comparator 2
+ CMP3_IRQHandler, // 43 - Analog Comparator 3
+ QEI_IRQHandler, // 44 - QEI
+ RTC_ALARM_IRQHandler, // 45 - RTC alarm
+ RTC_WAKE_IRQHandler, // 46 - RTC wake-up
+#endif
+}; /* End of g_pfnVectors */
+
+//*****************************************************************************
+// Functions to carry out the initialization of RW and BSS data sections. These
+// are written as separate functions rather than being inlined within the
+// ResetISR() function in order to cope with MCUs with multiple banks of
+// memory.
+//*****************************************************************************
+__attribute__ ((section(".after_vectors")))
+void data_init(unsigned int romstart, unsigned int start, unsigned int len) {
+ unsigned int *pulDest = (unsigned int*) start;
+ unsigned int *pulSrc = (unsigned int*) romstart;
+ unsigned int loop;
+ for (loop = 0; loop < len; loop = loop + 4)
+ *pulDest++ = *pulSrc++;
+}
+
+__attribute__ ((section(".after_vectors")))
+void bss_init(unsigned int start, unsigned int len) {
+ unsigned int *pulDest = (unsigned int*) start;
+ unsigned int loop;
+ for (loop = 0; loop < len; loop = loop + 4)
+ *pulDest++ = 0;
+}
+
+//*****************************************************************************
+// The following symbols are constructs generated by the linker, indicating
+// the location of various points in the "Global Section Table". This table is
+// created by the linker via the Code Red managed linker script mechanism. It
+// contains the load address, execution address and length of each RW data
+// section and the execution and length of each BSS (zero initialized) section.
+//*****************************************************************************
+extern unsigned int __data_section_table;
+extern unsigned int __data_section_table_end;
+extern unsigned int __bss_section_table;
+extern unsigned int __bss_section_table_end;
+
+
+//*****************************************************************************
+// Reset entry point for your code.
+// Sets up a simple runtime environment and initializes the C/C++
+// library.
+//*****************************************************************************
+__attribute__ ((section(".after_vectors")))
+void
+ResetISR(void) {
+
+ //
+ // Copy the data sections from flash to SRAM.
+ //
+ unsigned int LoadAddr, ExeAddr, SectionLen;
+ unsigned int *SectionTableAddr;
+
+ // Load base address of Global Section Table
+ SectionTableAddr = &__data_section_table;
+
+ // Copy the data sections from flash to SRAM.
+ while (SectionTableAddr < &__data_section_table_end) {
+ LoadAddr = *SectionTableAddr++;
+ ExeAddr = *SectionTableAddr++;
+ SectionLen = *SectionTableAddr++;
+ data_init(LoadAddr, ExeAddr, SectionLen);
+ }
+ // At this point, SectionTableAddr = &__bss_section_table;
+ // Zero fill the bss segment
+ while (SectionTableAddr < &__bss_section_table_end) {
+ ExeAddr = *SectionTableAddr++;
+ SectionLen = *SectionTableAddr++;
+ bss_init(ExeAddr, SectionLen);
+ }
+
+ // Optionally enable Cortex-M3 SWV trace (off by default at reset)
+ // Note - your board support must also set up the switch matrix
+ // so that SWO is output on the appropriate pin for your hardware
+#if !defined (DONT_ENABLE_SWVTRACECLK)
+ // Write 0x00000001 to TRACECLKDIV – Trace divider
+ volatile unsigned int *TRACECLKDIV = (unsigned int *) 0x400740D8;
+ *TRACECLKDIV = 1;
+#endif
+
+#if defined (__USE_CMSIS) || defined (__USE_LPCOPEN)
+ SystemInit();
+#endif
+
+#if defined (__cplusplus)
+ //
+ // Call C++ library initialisation
+ //
+ __libc_init_array();
+#endif
+
+#if defined (__REDLIB__)
+ // Call the Redlib library, which in turn calls main()
+ __main() ;
+#else
+ main();
+#endif
+
+ //
+ // main() shouldn't return, but if it does, we'll just enter an infinite loop
+ //
+ while (1) {
+ ;
+ }
+}
+
+//*****************************************************************************
+// Default exception handlers. Override the ones here by defining your own
+// handler routines in your application code.
+//*****************************************************************************
+__attribute__ ((section(".after_vectors")))
+void NMI_Handler(void)
+{ while(1) {}
+}
+
+__attribute__ ((section(".after_vectors")))
+void HardFault_Handler(void)
+{ while(1) {}
+}
+
+__attribute__ ((section(".after_vectors")))
+void MemManage_Handler(void)
+{ while(1) {}
+}
+
+__attribute__ ((section(".after_vectors")))
+void BusFault_Handler(void)
+{ while(1) {}
+}
+
+__attribute__ ((section(".after_vectors")))
+void UsageFault_Handler(void)
+{ while(1) {}
+}
+
+__attribute__ ((section(".after_vectors")))
+void SVC_Handler(void)
+{ while(1) {}
+}
+
+__attribute__ ((section(".after_vectors")))
+void DebugMon_Handler(void)
+{ while(1) {}
+}
+
+__attribute__ ((section(".after_vectors")))
+void PendSV_Handler(void)
+{ while(1) {}
+}
+
+__attribute__ ((section(".after_vectors")))
+void SysTick_Handler(void)
+{ while(1) {}
+}
+
+//*****************************************************************************
+//
+// Processor ends up here if an unexpected interrupt occurs or a specific
+// handler is not present in the application code.
+//
+//*****************************************************************************
+__attribute__ ((section(".after_vectors")))
+void IntDefaultHandler(void)
+{ while(1) {}
+}
+
+
+
diff --git a/src/crp.c b/src/crp.c
new file mode 100644
index 0000000..6e33068
--- /dev/null
+++ b/src/crp.c
@@ -0,0 +1,27 @@
+//*****************************************************************************
+// crp.c
+//
+// Source file to create CRP word expected by LPCXpresso IDE linker
+//*****************************************************************************
+//
+// Copyright(C) NXP Semiconductors, 2013, 2020
+// All rights reserved.
+//
+// NXP Confidential. This software is owned or controlled by NXP and may only be
+// used strictly in accordance with the applicable license terms.
+//
+// By expressly accepting such terms or by downloading, installing, activating
+// and/or otherwise using the software, you are agreeing that you have read, and
+// that you agree to comply with and are bound by, such license terms.
+//
+// If you do not agree to be bound by the applicable license terms, then you may not
+// retain, install, activate or otherwise use the software.
+//*****************************************************************************
+
+#if defined (__CODE_RED)
+#include
+// Variable to store CRP value in. Will be placed automatically
+// by the linker when "Enable Code Read Protect" selected.
+// See crp.h header for more information
+__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;
+#endif
diff --git a/src/sysinit.c b/src/sysinit.c
new file mode 100644
index 0000000..7666b07
--- /dev/null
+++ b/src/sysinit.c
@@ -0,0 +1,57 @@
+/*
+ * @brief Common SystemInit function for LPC15xx chips
+ *
+ * @note
+ * Copyright 2013-2014, 2019, 2020 NXP
+ * All rights reserved.
+ *
+ * @par
+ * NXP Confidential. This software is owned or controlled by NXP and may only be
+ * used strictly in accordance with the applicable license terms.
+ *
+ * By expressly accepting such terms or by downloading, installing, activating
+ * and/or otherwise using the software, you are agreeing that you have read, and
+ * that you agree to comply with and are bound by, such license terms.
+ *
+ * If you do not agree to be bound by the applicable license terms, then you may not
+ * retain, install, activate or otherwise use the software.
+ */
+
+ #if defined(NO_BOARD_LIB)
+ #include "chip.h"
+ #else
+ #include "board.h"
+ #endif
+
+/*****************************************************************************
+ * Private types/enumerations/variables
+ ****************************************************************************/
+
+/*****************************************************************************
+ * Public types/enumerations/variables
+ ****************************************************************************/
+
+#if defined(NO_BOARD_LIB)
+const uint32_t OscRateIn = 12000000;
+const uint32_t RTCOscRateIn = 32768;
+#endif
+
+/*****************************************************************************
+ * Private functions
+ ****************************************************************************/
+
+/*****************************************************************************
+ * Public functions
+ ****************************************************************************/
+
+/* Set up and initialize hardware prior to call to main */
+void SystemInit(void)
+{
+#if defined(NO_BOARD_LIB)
+ /* Chip specific SystemInit */
+ Chip_SystemInit();
+#else
+ /* Board specific SystemInit */
+ Board_SystemInit();
+#endif
+}