|
|
@@ -0,0 +1,295 @@
|
|
|
+/**************************************************************************//**
|
|
|
+ * @file startup_ARMCM4.s
|
|
|
+ * @brief CMSIS Core Device Startup File for
|
|
|
+ * ARMCM4 Device Series
|
|
|
+ * @version V5.00
|
|
|
+ * @date 26. April 2016
|
|
|
+ ******************************************************************************/
|
|
|
+/*
|
|
|
+ * Copyright (c) 2009-2016 ARM Limited. All rights reserved.
|
|
|
+ *
|
|
|
+ * SPDX-License-Identifier: Apache-2.0
|
|
|
+ *
|
|
|
+ * Licensed under the Apache License, Version 2.0 (the License); you may
|
|
|
+ * not use this file except in compliance with the License.
|
|
|
+ * You may obtain a copy of the License at
|
|
|
+ *
|
|
|
+ * www.apache.org/licenses/LICENSE-2.0
|
|
|
+ *
|
|
|
+ * Unless required by applicable law or agreed to in writing, software
|
|
|
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
|
|
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
+ * See the License for the specific language governing permissions and
|
|
|
+ * limitations under the License.
|
|
|
+ */
|
|
|
+
|
|
|
+#include <stdint.h>
|
|
|
+
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+ Linker generated Symbols
|
|
|
+ *----------------------------------------------------------------------------*/
|
|
|
+extern uint32_t __etext;
|
|
|
+extern uint32_t __data_start__;
|
|
|
+extern uint32_t __data_end__;
|
|
|
+extern uint32_t __copy_table_start__;
|
|
|
+extern uint32_t __copy_table_end__;
|
|
|
+extern uint32_t __zero_table_start__;
|
|
|
+extern uint32_t __zero_table_end__;
|
|
|
+extern uint32_t __bss_start__;
|
|
|
+extern uint32_t __bss_end__;
|
|
|
+extern uint32_t __StackTop;
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+ Exception / Interrupt Handler Function Prototype
|
|
|
+ *----------------------------------------------------------------------------*/
|
|
|
+typedef void( *pFunc )( void );
|
|
|
+
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+ External References
|
|
|
+ *----------------------------------------------------------------------------*/
|
|
|
+#ifndef __START
|
|
|
+extern void _start(void) __attribute__((noreturn)); /* PreeMain (C library entry point) */
|
|
|
+#else
|
|
|
+extern int __START(void) __attribute__((noreturn)); /* main entry point */
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef __NO_SYSTEM_INIT
|
|
|
+extern void SystemInit (void); /* CMSIS System Initialization */
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+ Internal References
|
|
|
+ *----------------------------------------------------------------------------*/
|
|
|
+void Default_Handler(void); /* Default empty handler */
|
|
|
+void Reset_Handler(void); /* Reset Handler */
|
|
|
+
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+ User Initial Stack & Heap
|
|
|
+ *----------------------------------------------------------------------------*/
|
|
|
+#ifndef __STACK_SIZE
|
|
|
+ #define __STACK_SIZE 0x00000400
|
|
|
+#endif
|
|
|
+static uint8_t stack[__STACK_SIZE] __attribute__ ((aligned(8), used, section(".stack")));
|
|
|
+
|
|
|
+#ifndef __HEAP_SIZE
|
|
|
+ #define __HEAP_SIZE 0x00000C00
|
|
|
+#endif
|
|
|
+#if __HEAP_SIZE > 0
|
|
|
+static uint8_t heap[__HEAP_SIZE] __attribute__ ((aligned(8), used, section(".heap")));
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+ Exception / Interrupt Handler
|
|
|
+ *----------------------------------------------------------------------------*/
|
|
|
+/* Cortex-M4 Processor Exceptions */
|
|
|
+void NMI_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void HardFault_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void MemManage_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void BusFault_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void UsageFault_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void SVC_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void DebugMon_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void PendSV_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void SysTick_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+
|
|
|
+/* ARMCM4 Specific Interrupts */
|
|
|
+void WDT_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void RTC_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void TIM0_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void TIM2_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void MCIA_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void MCIB_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void UART0_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void UART1_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void UART2_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void UART4_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void AACI_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void CLCD_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void ENET_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void USBDC_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void USBHC_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void CHLCD_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void FLEXRAY_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void CAN_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void LIN_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void I2C_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void CPU_CLCD_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void UART3_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+void SPI_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
|
|
+
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+ Exception / Interrupt Vector table
|
|
|
+ *----------------------------------------------------------------------------*/
|
|
|
+const pFunc __Vectors[] __attribute__ ((section(".vectors"))) = {
|
|
|
+ /* Cortex-M4 Exceptions Handler */
|
|
|
+ (pFunc)((uint32_t)&__StackTop), /* Initial Stack Pointer */
|
|
|
+ Reset_Handler, /* Reset Handler */
|
|
|
+ NMI_Handler, /* NMI Handler */
|
|
|
+ HardFault_Handler, /* Hard Fault Handler */
|
|
|
+ MemManage_Handler, /* MPU Fault Handler */
|
|
|
+ BusFault_Handler, /* Bus Fault Handler */
|
|
|
+ UsageFault_Handler, /* Usage Fault Handler */
|
|
|
+ 0, /* Reserved */
|
|
|
+ 0, /* Reserved */
|
|
|
+ 0, /* Reserved */
|
|
|
+ 0, /* Reserved */
|
|
|
+ SVC_Handler, /* SVCall Handler */
|
|
|
+ DebugMon_Handler, /* Debug Monitor Handler */
|
|
|
+ 0, /* Reserved */
|
|
|
+ PendSV_Handler, /* PendSV Handler */
|
|
|
+ SysTick_Handler, /* SysTick Handler */
|
|
|
+
|
|
|
+ /* External interrupts */
|
|
|
+ WDT_IRQHandler, /* 0: Watchdog Timer */
|
|
|
+ RTC_IRQHandler, /* 1: Real Time Clock */
|
|
|
+ TIM0_IRQHandler, /* 2: Timer0 / Timer1 */
|
|
|
+ TIM2_IRQHandler, /* 3: Timer2 / Timer3 */
|
|
|
+ MCIA_IRQHandler, /* 4: MCIa */
|
|
|
+ MCIB_IRQHandler, /* 5: MCIb */
|
|
|
+ UART0_IRQHandler, /* 6: UART0 - DUT FPGA */
|
|
|
+ UART1_IRQHandler, /* 7: UART1 - DUT FPGA */
|
|
|
+ UART2_IRQHandler, /* 8: UART2 - DUT FPGA */
|
|
|
+ UART4_IRQHandler, /* 9: UART4 - not connected */
|
|
|
+ AACI_IRQHandler, /* 10: AACI / AC97 */
|
|
|
+ CLCD_IRQHandler, /* 11: CLCD Combined Interrupt */
|
|
|
+ ENET_IRQHandler, /* 12: Ethernet */
|
|
|
+ USBDC_IRQHandler, /* 13: USB Device */
|
|
|
+ USBHC_IRQHandler, /* 14: USB Host Controller */
|
|
|
+ CHLCD_IRQHandler, /* 15: Character LCD */
|
|
|
+ FLEXRAY_IRQHandler, /* 16: Flexray */
|
|
|
+ CAN_IRQHandler, /* 17: CAN */
|
|
|
+ LIN_IRQHandler, /* 18: LIN */
|
|
|
+ I2C_IRQHandler, /* 19: I2C ADC/DAC */
|
|
|
+ 0, /* 20: Reserved */
|
|
|
+ 0, /* 21: Reserved */
|
|
|
+ 0, /* 22: Reserved */
|
|
|
+ 0, /* 23: Reserved */
|
|
|
+ 0, /* 24: Reserved */
|
|
|
+ 0, /* 25: Reserved */
|
|
|
+ 0, /* 26: Reserved */
|
|
|
+ 0, /* 27: Reserved */
|
|
|
+ CPU_CLCD_IRQHandler, /* 28: Reserved - CPU FPGA CLCD */
|
|
|
+ 0, /* 29: Reserved - CPU FPGA */
|
|
|
+ UART3_IRQHandler, /* 30: UART3 - CPU FPGA */
|
|
|
+ SPI_IRQHandler /* 31: SPI Touchscreen - CPU FPGA */
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+ Reset Handler called on controller reset
|
|
|
+ *----------------------------------------------------------------------------*/
|
|
|
+void Reset_Handler(void) {
|
|
|
+ uint32_t *pSrc, *pDest;
|
|
|
+ uint32_t *pTable __attribute__((unused));
|
|
|
+
|
|
|
+/* Firstly it copies data from read only memory to RAM. There are two schemes
|
|
|
+ * to copy. One can copy more than one sections. Another can only copy
|
|
|
+ * one section. The former scheme needs more instructions and read-only
|
|
|
+ * data to implement than the latter.
|
|
|
+ * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */
|
|
|
+
|
|
|
+#ifdef __STARTUP_COPY_MULTIPLE
|
|
|
+/* Multiple sections scheme.
|
|
|
+ *
|
|
|
+ * Between symbol address __copy_table_start__ and __copy_table_end__,
|
|
|
+ * there are array of triplets, each of which specify:
|
|
|
+ * offset 0: LMA of start of a section to copy from
|
|
|
+ * offset 4: VMA of start of a section to copy to
|
|
|
+ * offset 8: size of the section to copy. Must be multiply of 4
|
|
|
+ *
|
|
|
+ * All addresses must be aligned to 4 bytes boundary.
|
|
|
+ */
|
|
|
+ pTable = &__copy_table_start__;
|
|
|
+
|
|
|
+ for (; pTable < &__copy_table_end__; pTable = pTable + 3) {
|
|
|
+ pSrc = (uint32_t*)*(pTable + 0);
|
|
|
+ pDest = (uint32_t*)*(pTable + 1);
|
|
|
+ for (; pDest < (uint32_t*)(*(pTable + 1) + *(pTable + 2)) ; ) {
|
|
|
+ *pDest++ = *pSrc++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+#else
|
|
|
+/* Single section scheme.
|
|
|
+ *
|
|
|
+ * The ranges of copy from/to are specified by following symbols
|
|
|
+ * __etext: LMA of start of the section to copy from. Usually end of text
|
|
|
+ * __data_start__: VMA of start of the section to copy to
|
|
|
+ * __data_end__: VMA of end of the section to copy to
|
|
|
+ *
|
|
|
+ * All addresses must be aligned to 4 bytes boundary.
|
|
|
+ */
|
|
|
+ pSrc = &__etext;
|
|
|
+ pDest = &__data_start__;
|
|
|
+
|
|
|
+ for ( ; pDest < &__data_end__ ; ) {
|
|
|
+ *pDest++ = *pSrc++;
|
|
|
+ }
|
|
|
+#endif /*__STARTUP_COPY_MULTIPLE */
|
|
|
+
|
|
|
+/* This part of work usually is done in C library startup code. Otherwise,
|
|
|
+ * define this macro to enable it in this startup.
|
|
|
+ *
|
|
|
+ * There are two schemes too. One can clear multiple BSS sections. Another
|
|
|
+ * can only clear one section. The former is more size expensive than the
|
|
|
+ * latter.
|
|
|
+ *
|
|
|
+ * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former.
|
|
|
+ * Otherwise efine macro __STARTUP_CLEAR_BSS to choose the later.
|
|
|
+ */
|
|
|
+#ifdef __STARTUP_CLEAR_BSS_MULTIPLE
|
|
|
+/* Multiple sections scheme.
|
|
|
+ *
|
|
|
+ * Between symbol address __copy_table_start__ and __copy_table_end__,
|
|
|
+ * there are array of tuples specifying:
|
|
|
+ * offset 0: Start of a BSS section
|
|
|
+ * offset 4: Size of this BSS section. Must be multiply of 4
|
|
|
+ */
|
|
|
+ pTable = &__zero_table_start__;
|
|
|
+
|
|
|
+ for (; pTable < &__zero_table_end__; pTable = pTable + 2) {
|
|
|
+ pDest = (uint32_t*)*(pTable + 0);
|
|
|
+ for (; pDest < (uint32_t*)(*(pTable + 0) + *(pTable + 1)) ; ) {
|
|
|
+ *pDest++ = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+#elif defined (__STARTUP_CLEAR_BSS)
|
|
|
+/* Single BSS section scheme.
|
|
|
+ *
|
|
|
+ * The BSS section is specified by following symbols
|
|
|
+ * __bss_start__: start of the BSS section.
|
|
|
+ * __bss_end__: end of the BSS section.
|
|
|
+ *
|
|
|
+ * Both addresses must be aligned to 4 bytes boundary.
|
|
|
+ */
|
|
|
+ pDest = &__bss_start__;
|
|
|
+
|
|
|
+ for ( ; pDest < &__bss_end__ ; ) {
|
|
|
+ *pDest++ = 0UL;
|
|
|
+ }
|
|
|
+#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */
|
|
|
+
|
|
|
+#ifndef __NO_SYSTEM_INIT
|
|
|
+ SystemInit();
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifndef __START
|
|
|
+#define __START _start
|
|
|
+#endif
|
|
|
+ __START();
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+/*----------------------------------------------------------------------------
|
|
|
+ Default Handler for Exceptions / Interrupts
|
|
|
+ *----------------------------------------------------------------------------*/
|
|
|
+void Default_Handler(void) {
|
|
|
+
|
|
|
+ while(1);
|
|
|
+}
|