| /**************************************************************************//** |
| * @file startup_ARMCM7.s |
| * @brief CMSIS Core Device Startup File for |
| * ARMCM7 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-M7 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"))); |
| |
| /* ARMCM7 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-M7 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); |
| } |