blinking
[rapper.git] / bitbucket_lpc1768 / startup.c
diff --git a/bitbucket_lpc1768/startup.c b/bitbucket_lpc1768/startup.c
new file mode 100644 (file)
index 0000000..b1c6418
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * This is an ARM Cortex-M3 startup file for the NXP LPC1768.
+ *
+ * TODO: Add vendor (NXP) specific interrupt vectors.
+ *
+ * See also: http://bitbucket.org/jpc/lpc1768/
+ *
+ * Copyright (c) 2010 LoEE - Jakub Piotr Cłapa
+ * This program is released under the new BSD license.
+ */
+#include "CMSIS/LPC17xx.h"
+
+// Dummy handler.
+void Default_Handler (void) { while (1); }
+
+// Weakly bind all interrupt vectors to the dummy handler.
+void __attribute__((weak)) Reset_Handler(void);
+void __attribute__((weak)) NMI_Handler(void);
+void __attribute__((weak)) HardFault_Handler(void);
+void __attribute__((weak)) MemManage_Handler(void);
+void __attribute__((weak)) BusFault_Handler(void);
+void __attribute__((weak)) UsageFault_Handler(void);
+void __attribute__((weak)) SVC_Handler(void);
+void __attribute__((weak)) DebugMon_Handler(void);
+void __attribute__((weak)) PendSV_Handler(void);
+void __attribute__((weak)) SysTick_Handler(void);
+#pragma weak NMI_Handler        = Default_Handler
+#pragma weak HardFault_Handler  = Default_Handler
+#pragma weak MemManage_Handler  = Default_Handler
+#pragma weak BusFault_Handler   = Default_Handler
+#pragma weak UsageFault_Handler = Default_Handler
+#pragma weak SVC_Handler        = Default_Handler
+#pragma weak DebugMon_Handler   = Default_Handler
+#pragma weak PendSV_Handler     = Default_Handler
+#pragma weak SysTick_Handler    = Default_Handler
+
+// Start of the stack (last RAM address; exported in the linker script)
+extern void _sstack;
+
+// The signature of Cortex-M3 interrupt handlers.
+typedef void (* const Interrupt_Handler_P)(void);
+
+// Interrupt vectors table
+__attribute__ ((section(".cs3.interrupt_vector")))
+Interrupt_Handler_P interrupt_vectors[] = {
+  &_sstack,                     // the first  word contains  the initial
+                                // stack pointer  the hardware  loads it
+                                // to the  SP register before  the first
+                                // instruction
+  // Standard Cortex-M3 interrupts:
+  Reset_Handler,
+  NMI_Handler,
+  HardFault_Handler,
+  MemManage_Handler,
+  BusFault_Handler,
+  UsageFault_Handler,
+  0xefff7d26,
+  0,
+  0,
+  0,
+  SVC_Handler,
+  DebugMon_Handler,
+  0,
+  PendSV_Handler,
+  SysTick_Handler,
+  // Vendor specific interrupts for LPC1768:
+};
+
+extern int main (void);
+
+extern uint32_t _etext, _sdata, _edata, _sbss, _ebss;
+
+void
+Reset_Handler(void)
+{
+  // Initialize clocks
+  SystemInit ();
+
+  uint32_t *s, *d;
+  // Copy initialization data to RAM (.data section)
+  s = &_etext;
+  d = &_sdata;
+  while (d < &_edata) *d++ = *s++;
+  // Zero the remaining allocated RAM (.bss section)
+  d = &_sbss;
+  while (d < &_ebss)  *d++ = 0;
+  
+  // Everything is ready. Run the user program.
+  main();
+  while (1);
+}