/******************************************************************************* * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * * Except as contained in this notice, the name of Maxim Integrated * Products, Inc. shall not be used except as stated in the Maxim Integrated * Products, Inc. Branding Policy. * * The mere transfer of this software does not imply any licenses * of trade secrets, proprietary technology, copyrights, patents, * trademarks, maskwork rights, or any other form of intellectual * property whatsoever. Maxim Integrated Products, Inc. retains all * ownership rights. ******************************************************************************* */ .syntax unified .arch armv7-m /* Memory Model The HEAP starts at the end of the DATA section and grows upward. The STACK starts at the end of the RAM and grows downward. The HEAP and stack STACK are only checked at compile time: (DATA_SIZE + HEAP_SIZE + STACK_SIZE) < RAM_SIZE This is just a check for the bare minimum for the Heap+Stack area before aborting compilation, it is not the run time limit: Heap_Size + Stack_Size = 0x80 + 0x80 = 0x100 */ .section .stack .align 3 #ifdef __STACK_SIZE .equ Stack_Size, __STACK_SIZE #else .equ Stack_Size, 0x00001000 #endif .globl __StackTop .globl __StackLimit __StackLimit: .space Stack_Size .size __StackLimit, . - __StackLimit __StackTop: .size __StackTop, . - __StackTop .section .heap .align 3 #ifdef __HEAP_SIZE .equ Heap_Size, __HEAP_SIZE #else .equ Heap_Size, 0x00000C00 #endif .globl __HeapBase .globl __HeapLimit __HeapBase: .space Heap_Size .size __HeapBase, . - __HeapBase __HeapLimit: .size __HeapLimit, . - __HeapLimit .section .isr_vector .align 2 .globl __isr_vector __isr_vector: .long __StackTop /* Top of Stack */ .long Reset_Handler /* Reset Handler */ .long NMI_Handler /* NMI Handler */ .long HardFault_Handler /* Hard Fault Handler */ .long MemManage_Handler /* MPU Fault Handler */ .long BusFault_Handler /* Bus Fault Handler */ .long UsageFault_Handler /* Usage Fault Handler */ .long 0 /* Reserved */ .long 0 /* Reserved */ .long 0 /* Reserved */ .long 0 /* Reserved */ .long SVC_Handler /* SVCall Handler */ .long DebugMon_Handler /* Debug Monitor Handler */ .long 0 /* Reserved */ .long PendSV_Handler /* PendSV Handler */ .long SysTick_Handler /* SysTick Handler */ /* Externals interrupts */ .long UART0_IRQHandler /* 16: 1 UART0 */ .long UART1_IRQHandler /* 17: 2 UART1 */ .long I2CM0_IRQHandler /* 18: 3 I2C Master 0 */ .long I2CS_IRQHandler /* 19: 4 I2C Slave */ .long USB_IRQHandler /* 20: 5 USB */ .long PMU_IRQHandler /* 21: 6 DMA */ .long AFE_IRQHandler /* 22: 7 AFE */ .long MAA_IRQHandler /* 23: 8 MAA */ .long AES_IRQHandler /* 24: 9 AES */ .long SPI0_IRQHandler /* 25:10 SPI0 */ .long SPI1_IRQHandler /* 26:11 SPI1 */ .long SPI2_IRQHandler /* 27:12 SPI2 */ .long TMR0_IRQHandler /* 28:13 Timer32-0 */ .long TMR1_IRQHandler /* 29:14 Timer32-1 */ .long TMR2_IRQHandler /* 30:15 Timer32-1 */ .long TMR3_IRQHandler /* 31:16 Timer32-2 */ .long RSVD0_IRQHandler /* 32:17 RSVD */ .long RSVD1_IRQHandler /* 33:18 RSVD */ .long DAC0_IRQHandler /* 34:19 DAC0 (12-bit DAC) */ .long DAC1_IRQHandler /* 35:20 DAC1 (12-bit DAC) */ .long DAC2_IRQHandler /* 36:21 DAC2 (8-bit DAC) */ .long DAC3_IRQHandler /* 37:22 DAC3 (8-bit DAC) */ .long ADC_IRQHandler /* 38:23 ADC */ .long FLC_IRQHandler /* 39:24 Flash Controller */ .long PWRMAN_IRQHandler /* 40:25 PWRMAN */ .long CLKMAN_IRQHandler /* 41:26 CLKMAN */ .long RTC0_IRQHandler /* 42:27 RTC INT0 */ .long RTC1_IRQHandler /* 43:28 RTC INT1 */ .long RTC2_IRQHandler /* 44:29 RTC INT2 */ .long RTC3_IRQHandler /* 45:30 RTC INT3 */ .long WDT0_IRQHandler /* 46:31 WATCHDOG0 */ .long WDT0_P_IRQHandler /* 47:32 WATCHDOG0 PRE-WINDOW */ .long WDT1_IRQHandler /* 48:33 WATCHDOG1 */ .long WDT1_P_IRQHandler /* 49:34 WATCHDOG1 PRE-WINDOW */ .long GPIO_P0_IRQHandler /* 50:35 GPIO Port 0 */ .long GPIO_P1_IRQHandler /* 51:36 GPIO Port 1 */ .long GPIO_P2_IRQHandler /* 52:37 GPIO Port 2 */ .long GPIO_P3_IRQHandler /* 53:38 GPIO Port 3 */ .long GPIO_P4_IRQHandler /* 54:39 GPIO Port 4 */ .long GPIO_P5_IRQHandler /* 55:40 GPIO Port 5 */ .long GPIO_P6_IRQHandler /* 56:41 GPIO Port 6 */ .long GPIO_P7_IRQHandler /* 57:42 GPIO Port 7 */ .long TMR16_0_IRQHandler /* 58:43 Timer16-s0 */ .long TMR16_1_IRQHandler /* 59:44 Timer16-s1 */ .long TMR16_2_IRQHandler /* 60:45 Timer16-s2 */ .long TMR16_3_IRQHandler /* 61:46 Timer16-s3 */ .long I2CM1_IRQHandler /* 62:47 I2C Master 1 */ .text .thumb .thumb_func .align 2 .globl Reset_Handler .type Reset_Handler, %function Reset_Handler: /* Loop to copy data from read only memory to RAM. The ranges * of copy from/to are specified by following symbols evaluated in * linker script. * __etext: End of code section, i.e., begin of data sections to copy from. * __data_start__/__data_end__: RAM address range that data should be * copied to. Both must be aligned to 4 bytes boundary. */ ldr r1, =__etext ldr r2, =__data_start__ ldr r3, =__data_end__ .Lflash_to_ram_loop: cmp r2, r3 ittt lt ldrlt r0, [r1], #4 strlt r0, [r2], #4 blt .Lflash_to_ram_loop .Lflash_to_ram_loop_end: ldr r0, =SystemInit blx r0 ldr r0, =_start bx r0 .pool .size Reset_Handler, . - Reset_Handler .text /* Macro to define default handlers. Default handler * will be weak symbol and just dead loops. They can be * overwritten by other handlers */ .macro def_default_handler handler_name .align 1 .thumb_func .weak \handler_name .type \handler_name, %function \handler_name : b . .size \handler_name, . - \handler_name .endm def_default_handler NMI_Handler def_default_handler HardFault_Handler def_default_handler MemManage_Handler def_default_handler BusFault_Handler def_default_handler UsageFault_Handler def_default_handler SVC_Handler def_default_handler DebugMon_Handler def_default_handler PendSV_Handler def_default_handler SysTick_Handler def_default_handler Default_Handler .macro def_irq_default_handler handler_name .weak \handler_name .set \handler_name, Default_Handler .endm def_irq_default_handler UART0_IRQHandler /* 16: 1 UART0 */ def_irq_default_handler UART1_IRQHandler /* 17: 2 UART1 */ def_irq_default_handler I2CM0_IRQHandler /* 18: 3 I2C Master 0 */ def_irq_default_handler I2CS_IRQHandler /* 19: 4 I2C Slave */ def_irq_default_handler USB_IRQHandler /* 20: 5 USB */ def_irq_default_handler PMU_IRQHandler /* 21: 6 DMA */ def_irq_default_handler AFE_IRQHandler /* 22: 7 AFE */ def_irq_default_handler MAA_IRQHandler /* 23: 8 MAA */ def_irq_default_handler AES_IRQHandler /* 24: 9 AES */ def_irq_default_handler SPI0_IRQHandler /* 25:10 SPI0 */ def_irq_default_handler SPI1_IRQHandler /* 26:11 SPI1 */ def_irq_default_handler SPI2_IRQHandler /* 27:12 SPI2 */ def_irq_default_handler TMR0_IRQHandler /* 28:13 Timer32-0 */ def_irq_default_handler TMR1_IRQHandler /* 29:14 Timer32-1 */ def_irq_default_handler TMR2_IRQHandler /* 30:15 Timer32-1 */ def_irq_default_handler TMR3_IRQHandler /* 31:16 Timer32-2 */ def_irq_default_handler RSVD0_IRQHandler /* 32:17 RSVD */ def_irq_default_handler RSVD1_IRQHandler /* 33:18 RSVD */ def_irq_default_handler DAC0_IRQHandler /* 34:19 DAC0 (12-bit DAC) */ def_irq_default_handler DAC1_IRQHandler /* 35:20 DAC1 (12-bit DAC) */ def_irq_default_handler DAC2_IRQHandler /* 36:21 DAC2 (8-bit DAC) */ def_irq_default_handler DAC3_IRQHandler /* 37:22 DAC3 (8-bit DAC) */ def_irq_default_handler ADC_IRQHandler /* 38:23 ADC */ def_irq_default_handler FLC_IRQHandler /* 39:24 Flash Controller */ def_irq_default_handler PWRMAN_IRQHandler /* 40:25 PWRMAN */ def_irq_default_handler CLKMAN_IRQHandler /* 41:26 CLKMAN */ def_irq_default_handler RTC0_IRQHandler /* 42:27 RTC INT0 */ def_irq_default_handler RTC1_IRQHandler /* 43:28 RTC INT1 */ def_irq_default_handler RTC2_IRQHandler /* 44:29 RTC INT2 */ def_irq_default_handler RTC3_IRQHandler /* 45:30 RTC INT3 */ def_irq_default_handler WDT0_IRQHandler /* 46:31 WATCHDOG0 */ def_irq_default_handler WDT0_P_IRQHandler /* 47:32 WATCHDOG0 PRE-WINDOW */ def_irq_default_handler WDT1_IRQHandler /* 48:33 WATCHDOG1 */ def_irq_default_handler WDT1_P_IRQHandler /* 49:34 WATCHDOG1 PRE-WINDOW */ def_irq_default_handler GPIO_P0_IRQHandler /* 50:35 GPIO Port 0 */ def_irq_default_handler GPIO_P1_IRQHandler /* 51:36 GPIO Port 1 */ def_irq_default_handler GPIO_P2_IRQHandler /* 52:37 GPIO Port 2 */ def_irq_default_handler GPIO_P3_IRQHandler /* 53:38 GPIO Port 3 */ def_irq_default_handler GPIO_P4_IRQHandler /* 54:39 GPIO Port 4 */ def_irq_default_handler GPIO_P5_IRQHandler /* 55:40 GPIO Port 5 */ def_irq_default_handler GPIO_P6_IRQHandler /* 56:41 GPIO Port 6 */ def_irq_default_handler GPIO_P7_IRQHandler /* 57:42 GPIO Port 7 */ def_irq_default_handler TMR16_0_IRQHandler /* 58:43 Timer16-s0 */ def_irq_default_handler TMR16_1_IRQHandler /* 59:44 Timer16-s1 */ def_irq_default_handler TMR16_2_IRQHandler /* 60:45 Timer16-s2 */ def_irq_default_handler TMR16_3_IRQHandler /* 61:46 Timer16-s3 */ def_irq_default_handler I2CM1_IRQHandler /* 62:47 I2C Master 1 */ .end