243 lines
9.9 KiB
C
243 lines
9.9 KiB
C
/******************************************************************************
|
|
* @file startup_Nano100Series.c
|
|
* @version V1.00
|
|
* $Revision: 4 $
|
|
* $Date: 15/06/08 5:12p $
|
|
* @brief CMSIS ARM Cortex-M0 Core Device Startup File
|
|
*
|
|
* @note
|
|
* Copyright (C) 2013 Nuvoton Technology Corp. All rights reserved.
|
|
*****************************************************************************/
|
|
|
|
#include "Nano100Series.h"
|
|
|
|
/* Suppress warning messages */
|
|
#if defined(__CC_ARM)
|
|
// Suppress warning message: extended constant initialiser used
|
|
#pragma diag_suppress 1296
|
|
#elif defined(__ICCARM__)
|
|
#elif defined(__GNUC__)
|
|
#endif
|
|
|
|
/* Macro Definitions */
|
|
#if defined(__CC_ARM)
|
|
#define WEAK __attribute__ ((weak))
|
|
#define ALIAS(f) __attribute__ ((weak, alias(#f)))
|
|
|
|
#define WEAK_ALIAS_FUNC(FUN, FUN_ALIAS) \
|
|
void FUN(void) __attribute__ ((weak, alias(#FUN_ALIAS)));
|
|
|
|
#elif defined(__ICCARM__)
|
|
#define WEAK_ALIAS_FUNC(FUN, FUN_ALIAS) \
|
|
void FUN(void); \
|
|
_Pragma(_STRINGIFY(_WEAK_ALIAS_FUNC(FUN, FUN_ALIAS)))
|
|
#define _WEAK_ALIAS_FUNC(FUN, FUN_ALIAS) weak __WEAK_ALIAS_FUNC(FUN, FUN_ALIAS)
|
|
#define __WEAK_ALIAS_FUNC(FUN, FUN_ALIAS) FUN##=##FUN_ALIAS
|
|
|
|
#elif defined(__GNUC__)
|
|
#define WEAK __attribute__ ((weak))
|
|
#define ALIAS(f) __attribute__ ((weak, alias(#f)))
|
|
|
|
#define WEAK_ALIAS_FUNC(FUN, FUN_ALIAS) \
|
|
void FUN(void) __attribute__ ((weak, alias(#FUN_ALIAS)));
|
|
|
|
#endif
|
|
|
|
|
|
/* Initialize segments */
|
|
#if defined(__CC_ARM) || (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
|
|
extern uint32_t Image$$ARM_LIB_STACK$$ZI$$Limit;
|
|
extern void __main(void);
|
|
#elif defined(__ICCARM__)
|
|
void __iar_program_start(void);
|
|
#elif defined(__GNUC__)
|
|
extern uint32_t __StackTop;
|
|
extern uint32_t __etext;
|
|
extern uint32_t __data_start__;
|
|
extern uint32_t __data_end__;
|
|
extern uint32_t __bss_start__;
|
|
extern uint32_t __bss_end__;
|
|
|
|
#if defined(TOOLCHAIN_GCC_ARM)
|
|
extern void _start(void);
|
|
#else
|
|
#error("For GCC toolchain, only support GNU ARM Embedded")
|
|
#endif
|
|
#endif
|
|
|
|
/* Default empty handler */
|
|
void Default_Handler(void);
|
|
|
|
/* Reset handler */
|
|
void Reset_Handler(void);
|
|
|
|
/* Cortex-M0 core handlers */
|
|
WEAK_ALIAS_FUNC(NMI_Handler, Default_Handler) // NMI Handler
|
|
WEAK_ALIAS_FUNC(HardFault_Handler, Default_Handler) // Hard Fault Handler
|
|
WEAK_ALIAS_FUNC(SVC_Handler, Default_Handler) // SVCall Handler
|
|
WEAK_ALIAS_FUNC(PendSV_Handler, Default_Handler) // PendSV Handler
|
|
WEAK_ALIAS_FUNC(SysTick_Handler, Default_Handler) // SysTick Handler
|
|
|
|
/* Peripherals handlers */
|
|
WEAK_ALIAS_FUNC(BOD_IRQHandler, Default_Handler) // Brownout low voltage detected interrupt
|
|
WEAK_ALIAS_FUNC(WDT_IRQHandler, Default_Handler) // Watch Dog Timer interrupt
|
|
WEAK_ALIAS_FUNC(EINT0_IRQHandler, Default_Handler) // External signal interrupt from PB.14 pin
|
|
WEAK_ALIAS_FUNC(EINT1_IRQHandler, Default_Handler) // External signal interrupt from PB.15 pin
|
|
WEAK_ALIAS_FUNC(GPABC_IRQHandler, Default_Handler) // External interrupt from PA[15:0]/PB[15:0]/PC[15:0]
|
|
WEAK_ALIAS_FUNC(GPDEF_IRQHandler, Default_Handler) // External interrupt from PD[15:0]/PE[15:0]/PF[7:0]
|
|
WEAK_ALIAS_FUNC(PWM0_IRQHandler, Default_Handler) // PWM 0 interrupt
|
|
WEAK_ALIAS_FUNC(PWM1_IRQHandler, Default_Handler) // PWM 1 interrupt
|
|
WEAK_ALIAS_FUNC(TMR0_IRQHandler, Default_Handler) // Timer 0 interrupt
|
|
WEAK_ALIAS_FUNC(TMR1_IRQHandler, Default_Handler) // Timer 1 interrupt
|
|
WEAK_ALIAS_FUNC(TMR2_IRQHandler, Default_Handler) // Timer 2 interrupt
|
|
WEAK_ALIAS_FUNC(TMR3_IRQHandler, Default_Handler) // Timer 3 interrupt
|
|
WEAK_ALIAS_FUNC(UART0_IRQHandler, Default_Handler) // UART0 interrupt
|
|
WEAK_ALIAS_FUNC(UART1_IRQHandler, Default_Handler) // UART1 interrupt
|
|
WEAK_ALIAS_FUNC(SPI0_IRQHandler, Default_Handler) // SPI0 interrupt
|
|
WEAK_ALIAS_FUNC(SPI1_IRQHandler, Default_Handler) // SPI1 interrupt
|
|
WEAK_ALIAS_FUNC(SPI2_IRQHandler, Default_Handler) // SPI2 interrupt
|
|
WEAK_ALIAS_FUNC(HIRC_IRQHandler, Default_Handler) // HIRC interrupt
|
|
WEAK_ALIAS_FUNC(I2C0_IRQHandler, Default_Handler) // I2C0 interrupt
|
|
WEAK_ALIAS_FUNC(I2C1_IRQHandler, Default_Handler) // I2C1 interrupt
|
|
WEAK_ALIAS_FUNC(SC2_IRQHandler, Default_Handler) // SC2 interrupt
|
|
WEAK_ALIAS_FUNC(SC0_IRQHandler, Default_Handler) // SC0 interrupt
|
|
WEAK_ALIAS_FUNC(SC1_IRQHandler, Default_Handler) // SC1 interrupt
|
|
WEAK_ALIAS_FUNC(USBD_IRQHandler, Default_Handler) // USB FS Device interrupt
|
|
// Reserved
|
|
WEAK_ALIAS_FUNC(LCD_IRQHandler, Default_Handler) // LCD interrupt
|
|
WEAK_ALIAS_FUNC(PDMA_IRQHandler, Default_Handler) // PDMA interrupt
|
|
WEAK_ALIAS_FUNC(I2S_IRQHandler, Default_Handler) // I2S interrupt
|
|
WEAK_ALIAS_FUNC(PDWU_IRQHandler, Default_Handler) // Power Down Wake up interrupt
|
|
WEAK_ALIAS_FUNC(ADC_IRQHandler, Default_Handler) // ADC interrupt
|
|
WEAK_ALIAS_FUNC(DAC_IRQHandler, Default_Handler) // DAC interrupt
|
|
WEAK_ALIAS_FUNC(RTC_IRQHandler, Default_Handler) // Real time clock interrupt
|
|
|
|
/* Vector table */
|
|
#if defined(__CC_ARM) || (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
|
|
__attribute__ ((section("RESET"), used))
|
|
const uint32_t __vector_handlers[] = {
|
|
#elif defined(__ICCARM__)
|
|
extern uint32_t CSTACK$$Limit;
|
|
const uint32_t __vector_table[] @ ".intvec" = {
|
|
#elif defined(__GNUC__)
|
|
__attribute__ ((section(".vector_table")))
|
|
const uint32_t __vector_handlers[] = {
|
|
#endif
|
|
|
|
/* Configure Initial Stack Pointer, using linker-generated symbols */
|
|
#if defined(__CC_ARM) || (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
|
|
(uint32_t) &Image$$ARM_LIB_STACK$$ZI$$Limit,
|
|
#elif defined(__ICCARM__)
|
|
(uint32_t) &CSTACK$$Limit,
|
|
#elif defined(__GNUC__)
|
|
(uint32_t) &__StackTop,
|
|
#endif
|
|
|
|
(uint32_t) Reset_Handler, // Reset Handler
|
|
(uint32_t) NMI_Handler, // NMI Handler
|
|
(uint32_t) HardFault_Handler, // Hard Fault Handler
|
|
0, // Reserved
|
|
0, // Reserved
|
|
0, // Reserved
|
|
0, // Reserved
|
|
0, // Reserved
|
|
0, // Reserved
|
|
0, // Reserved
|
|
(uint32_t) SVC_Handler, // SVCall Handler
|
|
0, // Reserved
|
|
0, // Reserved
|
|
(uint32_t) PendSV_Handler, // PendSV Handler
|
|
(uint32_t) SysTick_Handler, // SysTick Handler
|
|
|
|
/* External Interrupts */
|
|
(uint32_t) BOD_IRQHandler, // Brownout low voltage detected interrupt
|
|
(uint32_t) WDT_IRQHandler, // Watch Dog Timer interrupt
|
|
(uint32_t) EINT0_IRQHandler, // External signal interrupt from PB.14 pin
|
|
(uint32_t) EINT1_IRQHandler, // External signal interrupt from PB.15 pin
|
|
(uint32_t) GPABC_IRQHandler, // External interrupt from PA[15:0]/PB[15:0]/PC[15:0]
|
|
(uint32_t) GPDEF_IRQHandler, // External interrupt from PD[15:0]/PE[15:0]/PF[7:0]
|
|
(uint32_t) PWM0_IRQHandler, // PWM 0 interrupt
|
|
(uint32_t) PWM1_IRQHandler, // PWM 1 interrupt
|
|
(uint32_t) TMR0_IRQHandler, // Timer 0 interrupt
|
|
(uint32_t) TMR1_IRQHandler, // Timer 1 interrupt
|
|
(uint32_t) TMR2_IRQHandler, // Timer 2 interrupt
|
|
(uint32_t) TMR3_IRQHandler, // Timer 3 interrupt
|
|
(uint32_t) UART0_IRQHandler, // UART0 interrupt
|
|
(uint32_t) UART1_IRQHandler, // UART1 interrupt
|
|
(uint32_t) SPI0_IRQHandler, // SPI0 interrupt
|
|
(uint32_t) SPI1_IRQHandler, // SPI1 interrupt
|
|
(uint32_t) SPI2_IRQHandler, // SPI2 interrupt
|
|
(uint32_t) HIRC_IRQHandler, // HIRC interrupt
|
|
(uint32_t) I2C0_IRQHandler, // I2C0 interrupt
|
|
(uint32_t) I2C1_IRQHandler, // I2C1 interrupt
|
|
(uint32_t) SC2_IRQHandler, // SC2 interrupt
|
|
(uint32_t) SC0_IRQHandler, // SC0 interrupt
|
|
(uint32_t) SC1_IRQHandler, // SC1 interrupt
|
|
(uint32_t) USBD_IRQHandler, // USB FS Device interrupt
|
|
(uint32_t) Default_Handler, // Reserved
|
|
(uint32_t) LCD_IRQHandler, // LCD interrupt
|
|
(uint32_t) PDMA_IRQHandler, // PDMA interrupt
|
|
(uint32_t) I2S_IRQHandler, // I2S interrupt
|
|
(uint32_t) PDWU_IRQHandler, // Power Down Wake up interrupt
|
|
(uint32_t) ADC_IRQHandler, // ADC interrupt
|
|
(uint32_t) DAC_IRQHandler, // DAC interrupt
|
|
(uint32_t) RTC_IRQHandler, // Real time clock interrupt
|
|
};
|
|
|
|
/**
|
|
* \brief This is the code that gets called on processor reset.
|
|
*/
|
|
void Reset_Handler(void)
|
|
{
|
|
/* Disable register write-protection function */
|
|
SYS_UnlockReg();
|
|
|
|
/* Disable Power-on Reset function */
|
|
SYS_DISABLE_POR();
|
|
|
|
/* Enable register write-protection function */
|
|
SYS_LockReg();
|
|
|
|
#if defined(__CC_ARM) || (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
|
|
__main();
|
|
|
|
#elif defined(__ICCARM__)
|
|
__iar_program_start();
|
|
|
|
#elif defined(__GNUC__)
|
|
uint32_t *src_ind = (uint32_t *) &__etext;
|
|
uint32_t *dst_ind = (uint32_t *) &__data_start__;
|
|
uint32_t *dst_end = (uint32_t *) &__data_end__;
|
|
|
|
/* Move .data section from ROM to RAM */
|
|
if (src_ind != dst_ind) {
|
|
for (; dst_ind < dst_end;) {
|
|
*dst_ind ++ = *src_ind ++;
|
|
}
|
|
}
|
|
|
|
/* Initialize .bss section to zero */
|
|
dst_ind = (uint32_t *) &__bss_start__;
|
|
dst_end = (uint32_t *) &__bss_end__;
|
|
if (dst_ind != dst_end) {
|
|
for (; dst_ind < dst_end;) {
|
|
*dst_ind ++ = 0;
|
|
}
|
|
}
|
|
|
|
_start();
|
|
|
|
#endif
|
|
|
|
/* Infinite loop */
|
|
while (1);
|
|
}
|
|
|
|
/**
|
|
* \brief Default interrupt handler for unused IRQs.
|
|
*/
|
|
void Default_Handler(void)
|
|
{
|
|
while (1);
|
|
}
|