ArduinoCore-samd/bootloaders/feather/board_startup.c

147 lines
3.6 KiB
C

/*
Copyright (c) 2015 Arduino LLC. All right reserved.
Copyright (c) 2015 Atmel Corporation/Thibaut VIARD. All right reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <sam.h>
struct ConstVectors
{
/* Stack pointer */
void* pvStack;
/* Cortex-M handlers */
void* pfnReset_Handler;
void* pfnNMI_Handler;
void* pfnHardFault_Handler;
void* pfnReservedM12;
void* pfnReservedM11;
void* pfnReservedM10;
void* pfnReservedM9;
void* pfnReservedM8;
void* pfnReservedM7;
void* pfnReservedM6;
void* pfnSVC_Handler;
void* pfnReservedM4;
void* pfnReservedM3;
void* pfnPendSV_Handler;
void* pfnSysTick_Handler;
};
/* Symbols exported from linker script */
extern uint32_t __etext ;
extern uint32_t __data_start__ ;
extern uint32_t __data_end__ ;
extern uint32_t __bss_start__ ;
extern uint32_t __bss_end__ ;
extern uint32_t __StackTop;
extern int main(void);
extern void __libc_init_array(void);
/* Exception Table */
__attribute__ ((section(".isr_vector")))
const struct ConstVectors exception_table =
{
/* Configure Initial Stack Pointer, using linker-generated symbols */
.pvStack = (void*) (&__StackTop),
.pfnReset_Handler = (void*) Reset_Handler,
.pfnNMI_Handler = (void*) NMI_Handler,
.pfnHardFault_Handler = (void*) HardFault_Handler,
.pfnReservedM12 = (void*) (0UL), /* Reserved */
.pfnReservedM11 = (void*) (0UL), /* Reserved */
.pfnReservedM10 = (void*) (0UL), /* Reserved */
.pfnReservedM9 = (void*) (0UL), /* Reserved */
.pfnReservedM8 = (void*) (0UL), /* Reserved */
.pfnReservedM7 = (void*) (0UL), /* Reserved */
.pfnReservedM6 = (void*) (0UL), /* Reserved */
.pfnSVC_Handler = (void*) SVC_Handler,
.pfnReservedM4 = (void*) (0UL), /* Reserved */
.pfnReservedM3 = (void*) (0UL), /* Reserved */
.pfnPendSV_Handler = (void*) PendSV_Handler,
.pfnSysTick_Handler = (void*) SysTick_Handler,
};
/**
* \brief This is the code that gets called on processor reset.
* Initializes the device and call the main() routine.
*/
void Reset_Handler( void )
{
uint32_t *pSrc, *pDest;
/* Initialize the initialized data section */
pSrc = &__etext;
pDest = &__data_start__;
if ( (&__data_start__ != &__data_end__) && (pSrc != pDest) )
{
for (; pDest < &__data_end__ ; pDest++, pSrc++ )
{
*pDest = *pSrc ;
}
}
/* Clear the zero section */
if ( &__bss_start__ != &__bss_end__ )
{
for ( pDest = &__bss_start__ ; pDest < &__bss_end__ ; pDest++ )
{
*pDest = 0ul ;
}
}
// board_init(); // will be done in main() after app check
/* Initialize the C library */
// __libc_init_array();
main();
while (1);
}
void NMI_Handler(void)
{
__BKPT(14);
while (1);
}
void HardFault_Handler(void)
{
__BKPT(13);
while (1);
}
void SVC_Handler(void)
{
__BKPT(5);
while (1);
}
void PendSV_Handler(void)
{
__BKPT(2);
while (1);
}
void SysTick_Handler(void)
{
__BKPT(1);
while (1);
}