void __interrupt() __frame() Reset_Handler( void ) { /* Set flash wait states to 3 */ PREF_FCON = (PREF_FCON & 0xFFFFFFF0) | 0x00000003; SCU_GCU_PEFLAG =0xFFFFFFFF; /* Clear existing parity errors if any */ SCU_GCU_PEEN = 0; /* Disable parity */ /* * Anticipate possible ROM/RAM remapping * by loading the 'real' program address. */ __remap_pc(); /* * Initialize stack pointer. */ __setsp( _lc_ub_stack ); /* * Call a user function which initializes hardware, * such as ROM/RAM re-mapping or MMU configuration. */ SystemInit(); /* * Copy initialized sections from ROM to RAM * and clear uninitialized data sections in RAM. */ __init(); __asm( "_cptable_handled:" ); /* symbol may be used by debugger */ /* * Load VTOR register with the actual vector table * start address */ VTOR = (unsigned int)_lc_vtor_value; #ifdef __POSIX__ __setsp( _posix_boot_stack_top ); #endif #if __PROF_ENABLE__ __prof_init(); #endif #ifdef __POSIX__ exit( posix_main() ); #elif defined __USE_ARGC_ARGV exit( main( _argcv( argcv, __ARGCV_BUFSIZE ), (char **)argcv ) ); #else exit( main( 0, NULL ) ); #endif return; }
/********************************************************************************* * _cstart() - startup code, invoked from the RESET vector *********************************************************************************/ void __interrupt(0) __registerbank( cstart_rb ) _cstart( void ) { #if !__WDT_ENABLED __diswdt(); /* disable watchdog timer */ #endif /* * Initialize registers */ #ifdef __WDTCON if (__WDTCON_INIT) __WDTCON.U = __WDTCON_VALUE; #else /* when no WDTCON available, use WDTREL and WDTCS */ # ifdef __WDTREL if (__WDTREL_INIT) __WDTREL.U = __WDTREL_VALUE; # endif # ifdef __WDTCS if (__WDTCS_INIT) __WDTCS.U = (__WDTCS.U & ~__WDTCS_MASK) | (__WDTCS_VALUE & __WDTCS_MASK); # endif #endif #if __WDT_ENABLED __srvwdt(); /* serve watchdog timer */ #endif #ifdef __XPERCON if (__XPERCON_INIT) __XPERCON.U = __XPERCON_VALUE; #endif #ifdef __SYSCON # if __SYSCON_DO_MASK if ( __SYSCON_INIT) __bfld( &__SYSCON.U, ~__SYSCON_MASK, __SYSCON_VALUE & ~__SYSCON_MASK ); # else if ( __SYSCON_INIT) __SYSCON.U = __SYSCON_VALUE; # endif #endif #if defined(XPEREMU) && defined(XPERCON) && defined(SYSCON) # if (__XPERCON_VALUE & 0x07D3) && (__SYSCON_VALUE & 0x0004) && __XPEREMU_INIT __XPEREMU.U = __XPEREMU_VALUE; # endif #endif #ifdef __RSTCON # if __RSTCON_DO_MASK if ( __RSTCON_INIT) __RSTCON.U = (__RSTCON.U & ~__RSTCON_MASK) | (__RSTCON_MASK & __RSTCON_VALUE); # else if ( __RSTCON_INIT) __RSTCON.U = __RSTCON_VALUE; # endif #endif #ifdef __CPUCON1 if ( __CPUCON1_INIT) __CPUCON1.U = __CPUCON1_VALUE; #endif #ifdef __CPUCON2 if ( __CPUCON2_INIT) __CPUCON2.U = __CPUCON2_VALUE; #endif #ifdef __SYSCON0 if(__SYSCON0_INIT) __SYSCON0.U = __SYSCON0_VALUE; #endif #ifdef __SYSCON1 if(__SYSCON1_INIT) __SYSCON1.U = __SYSCON1_VALUE; #endif #ifdef __SYSCON2 if(__SYSCON2_INIT) __bfld( &__SYSCON2.U, 0x04,__SYSCON2_VALUE & 0x4 ); #endif #ifdef __SYSCON3 if(__SYSCON3_INIT) __SYSCON3.U = __SYSCON3_VALUE; #endif #ifdef __PLLCON if(__PLLCON_INIT) __PLLCON.U = __PLLCON_VALUE; #endif /* * Bus configuration */ #ifdef __EBCMOD0 # if __EBCMOD0_DO_MASK if ( __EBCMOD0_INIT) __EBCMOD0.U |= __EBCMOD0_VALUE & ~__EBCMOD0_MASK; # else if ( __EBCMOD0_INIT) __EBCMOD0.U = __EBCMOD0_VALUE; # endif #endif #ifdef __EBCMOD1 if(__EBCMOD1_INIT) __EBCMOD1.U = __EBCMOD1_VALUE; #endif #ifdef __BUSCON0 # if __BUSCON0_DO_MASK if ( __BUSCON0_INIT) __bfld( &__BUSCON0.U, ~__BUSCON0_MASK, __BUSCON0_VALUE & ~__BUSCON0_MASK ); # else if ( __BUSCON0_INIT) __BUSCON0.U = __BUSCON0_VALUE; # endif #endif #ifdef __BUSCON1 if(__ADDRSEL1_INIT) __ADDRSEL1.U = __ADDRSEL1_VALUE; if(__BUSCON1_INIT) __BUSCON1.U = __BUSCON1_VALUE; #endif #ifdef __BUSCON2 if(__ADDRSEL2_INIT) __ADDRSEL2.U = __ADDRSEL2_VALUE; if(__BUSCON2_INIT) __BUSCON2.U = __BUSCON2_VALUE; #endif #ifdef __BUSCON3 if(__ADDRSEL3_INIT) __ADDRSEL3.U = __ADDRSEL3_VALUE; if(__BUSCON3_INIT) __BUSCON3.U = __BUSCON3_VALUE; #endif #ifdef __BUSCON4 if(__ADDRSEL4_INIT) __ADDRSEL4.U = __ADDRSEL4_VALUE; if(__BUSCON4_INIT) __BUSCON4.U = __BUSCON4_VALUE; #endif #ifdef __XBCON1 if(__XBCON1_INIT) __bfld( &__XBCON1.U, 0x1fff, __XBCON1_VALUE & 0x1fff); #endif #ifdef __XADRS1 if(__XADRS1_INIT) __XADRS1.U = __XADRS1_VALUE; #endif #ifdef __XBCON2 if(__XBCON2_INIT) __bfld( &__XBCON2.U, 0x1fff, __XBCON2_VALUE & 0x1fff); #endif #ifdef __XADRS2 if(__XADRS2_INIT) __XADRS2.U = __XADRS2_VALUE; #endif #ifdef __XBCON3 if(__XBCON3_INIT) __bfld( &__XBCON3.U, 0x1fff, __XBCON3_VALUE & 0x1fff); if(__XADRS3_INIT) __XADRS3.U = __XADRS3_VALUE; #endif #ifdef __XBCON4 if(__XBCON4_INIT) __bfld( &__XBCON4.U, 0x1fff, __XBCON4_VALUE & 0x1fff); if(__XADRS4_INIT) __XADRS4.U = __XADRS4_VALUE; #endif #ifdef __XBCON5 if(__XBCON5_INIT) __bfld( &__XBCON5.U, 0x1fff, __XBCON5_VALUE & 0x1fff); if(__XADRS5_INIT) __XADRS5.U = __XADRS5_VALUE; #endif #ifdef __XBCON6 if(__XBCON6_INIT) __bfld( &__XBCON6.U, 0x1fff, __XBCON6_VALUE & 0x1fff); if(__XADRS6_INIT) __XADRS6.U = __XADRS6_VALUE; #endif #ifdef __TCONBURSTCS0 if(__TCONBURSTCS0_INIT) TCONBURSTCS0 = __TCONBURSTCS0_VALUE; #endif #ifdef __TCONCS0 if(__TCONCS0_INIT) __TCONCS0.U = __TCONCS0_VALUE; # if __FCONCS0_DO_MASK if ( __FCONCS0_INIT) __FCONCS0.U |= __FCONCS0_VALUE & ~__FCONCS0_MASK; # else if ( __FCONCS0_INIT) __FCONCS0.U = __FCONCS0_VALUE; # endif #endif #ifdef __TCONBURSTCS0 if(__TCONBURSTCS0_INIT) __TCONBURSTCS0.U = __TCONBURSTCS0_VALUE; #endif #ifdef __TCONCS0 if(__TCONCS0_INIT) __TCONCS0.U = __TCONCS0_VALUE; if(__FCONCS0_INIT) __FCONCS0.U = __FCONCS0_VALUE; #endif #ifdef __TCONBURSTCS1 if(__TCONBURSTCS1_INIT) __TCONBURSTCS1.U = __TCONBURSTCS1_VALUE; #endif #ifdef __TCONCS1 if(__ADDRSEL1_INIT) __ADDRSEL1.U = __ADDRSEL1_VALUE; if(__TCONCS1_INIT) __TCONCS1.U = __TCONCS1_VALUE; if(__FCONCS1_INIT) __FCONCS1.U = __FCONCS1_VALUE; #endif #ifdef __TCONBURSTCS2 if(__TCONBURSTCS2_INIT) __TCONBURSTCS2.U = __TCONBURSTCS2_VALUE; #endif #ifdef __TCONCS2 if(__ADDRSEL2_INIT) __ADDRSEL2.U = __ADDRSEL2_VALUE; if(__TCONCS2_INIT) __TCONCS2.U = __TCONCS2_VALUE; if(__FCONCS2_INIT) __FCONCS2.U = __FCONCS2_VALUE; #endif #ifdef __TCONBURSTCS3 if(__TCONBURSTCS3_INIT) __TCONBURSTCS3.U = __TCONBURSTCS3_VALUE; #endif #ifdef __TCONCS3 if(__ADDRSEL3_INIT) __ADDRSEL3.U = __ADDRSEL3_VALUE; if(__TCONCS3_INIT) __TCONCS3.U = __TCONCS3_VALUE; if(__FCONCS3_INIT) __FCONCS3.U = __FCONCS3_VALUE; #endif #ifdef __TCONBURSTCS4 if(__TCONBURSTCS4_INIT) __TCONBURSTCS4.U = __TCONBURSTCS4_VALUE; #endif #ifdef __TCONCS4 if(__ADDRSEL4_INIT) __ADDRSEL4.U = __ADDRSEL4_VALUE; if(__TCONCS4_INIT) __TCONCS4.U = __TCONCS4_VALUE; if(__FCONCS4_INIT) __FCONCS4.U = __FCONCS4_VALUE; #endif #ifdef __TCONBURSTCS5 if(__TCONBURSTCS5_INIT) __TCONBURSTCS5.U = __TCONBURSTCS5_VALUE; #endif #ifdef __TCONCS5 if(__ADDRSEL5_INIT) __ADDRSEL5.U = __ADDRSEL5_VALUE; if(__TCONCS5_INIT) __TCONCS5.U = __TCONCS5_VALUE; if(__FCONCS5_INIT) __FCONCS5.U = __FCONCS5_VALUE; #endif #ifdef __TCONBURSTCS6 if(__TCONBURSTCS6_INIT) __TCONBURSTCS6.U = __TCONBURSTCS6_VALUE; #endif #ifdef __TCONCS6 if(__ADDRSEL6_INIT) __ADDRSEL6.U = __ADDRSEL6_VALUE; if(__TCONCS6_INIT) __TCONCS6.U = __TCONCS6_VALUE; if(__FCONCS6_INIT) __FCONCS6.U = __FCONCS6_VALUE; #endif #ifdef __TCONBURSTCS7 if(__TCONBURSTCS7_INIT) __TCONBURSTCS7.U = __TCONBURSTCS7_VALUE; #endif #ifdef __TCONCS7 if(__ADDRSEL7_INIT) __ADDRSEL7.U = __ADDRSEL7_VALUE; if(__TCONCS7_INIT) __TCONCS7.U = __TCONCS7_VALUE; if(__FCONCS7_INIT) __FCONCS7.U = __FCONCS7_VALUE; #endif /* * Miscellaneous */ #ifdef __EXICON if(__EXICON_INIT) __EXICON.U = __EXICON_VALUE; #endif #ifdef __EXISEL0 if(__EXISEL0_INIT) __EXISEL0.U = __EXISEL0_VALUE; #endif #ifdef __EXISEL1 if(__EXISEL1_INIT) __EXISEL1.U = __EXISEL1_VALUE; #endif #ifdef __IMBCTR if(__IMBCTR_INIT) __IMBCTR.U = __IMBCTR_VALUE; #endif #ifdef __IMB_IMBCTRL if(__IMB_IMBCTRL_INIT) __IMB_IMBCTRL.U = __IMB_IMBCTRL_VALUE; #endif #ifdef __IMB_IMBCTRH if(__IMB_IMBCTRH_INIT) __IMB_IMBCTRH.U = __IMB_IMBCTRH_VALUE; #endif #ifdef __ADC_EVS if(__ADC_EVS_INIT) __ADC_EVS.U = __ADC_EVS_VALUE; #endif #ifdef __CAPCOM_EVS if(__CAPCOM_EVS_INIT) __CAPCOM_EVS.U = __CAPCOM_EVS_VALUE; #endif #ifdef __CLK_CONF if(__CLK_CONF_INIT) __CLK_CONF.U = __CLK_CONF_VALUE; #endif #ifdef __CMCTR if(__CMCTR_INIT) __CMCTR.U = __CMCTR_VALUE; #endif #ifdef __EBCCSEN if(__EBCCSEN_INIT) __EBCCSEN.U = __EBCCSEN_VALUE; #endif #ifdef __EMUPCON if(__EMUPCON_INIT) __EMUPCON.U = __EMUPCON_VALUE; #endif #ifdef __EMU_XPCON if(__EMU_XPCON_INIT) __EMU_XPCON.U = __EMU_XPCON_VALUE; #endif #ifdef __EXISEL if(__EXISEL_INIT) __EXISEL.U = __EXISEL_VALUE; #endif #ifdef __FOCON if(__FOCON_INIT) __FOCON.U = __FOCON_VALUE; #endif #ifdef __GPT_EVS if(__GPT_EVS_INIT) __GPT_EVS.U = __GPT_EVS_VALUE; #endif #ifdef __OPSEN if(__OPSEN_INIT) __OPSEN.U = __OPSEN_VALUE; #endif #ifdef __PLL_CONF if(__PLL_CONF_INIT) __PLL_CONF.U = __PLL_CONF_VALUE; #endif #ifdef __SYS_MEM if(__SYS_MEM_INIT) __SYS_MEM.U = __SYS_MEM_VALUE; #endif #ifdef __SYS_PALT if(__SYS_PALT_INIT) __SYS_PALT.U = __SYS_PALT_VALUE; #endif #ifdef __TCONCSMM if(__TCONCSMM_INIT) __TCONCSMM.U = __TCONCSMM_VALUE; #endif #ifdef __TCONCSSM if(__TCONCSSM_INIT) __TCONCSSM.U = __TCONCSSM_VALUE; #endif #ifdef __VREG_CONF if(__VREG_CONF_INIT) __VREG_CONF.U = __VREG_CONF_VALUE; #endif #ifdef __XPERCONC if(__XPERCONC_INIT) __XPERCONC.U = __XPERCONC_VALUE; #endif #ifdef __XPERCONS if(__XPERCONS_INIT) __XPERCONS.U = __XPERCONS_VALUE; #endif /* * Kernel State Configuration Registers */ #ifdef __RTC_KSCCFG if(__RTC_KSCCFG_INIT) __RTC_KSCCFG.U = __RTC_KSCCFG_VALUE; #endif #ifdef __GPT12E_KSCCFG if(__GPT12E_KSCCFG_INIT)__GPT12E_KSCCFG.U = __GPT12E_KSCCFG_VALUE; #endif #ifdef __CC2_KSCCFG if(__CC2_KSCCFG_INIT) __CC2_KSCCFG.U = __CC2_KSCCFG_VALUE; #endif #ifdef __MEM_KSCCFG if(__MEM_KSCCFG_INIT) __MEM_KSCCFG.U = __MEM_KSCCFG_VALUE; #endif #ifdef __FL_KSCCFG if(__FL_KSCCFG_INIT) __FL_KSCCFG.U = __FL_KSCCFG_VALUE; #endif #ifdef __MCAN_KSCCFG if(__MCAN_KSCCFG_INIT) __MCAN_KSCCFG.U = __MCAN_KSCCFG_VALUE; #endif /* * ICACHE */ #ifdef __ICACHE_CTRL # if __ICACHE_CTRL_DO_MASK if ( __ICACHE_CTRL_INIT) __ICACHE_CTRL.U |= __ICACHE_CTRL_VALUE & ~__ICACHE_CTRL_MASK; # else if(__ICACHE_CTRL_INIT) __ICACHE_CTRL.U = __ICACHE_CTRL_VALUE; # endif #endif #ifdef __ICACHE_EDCON if(__ICACHE_EDCON_INIT) __ICACHE_EDCON.U = __ICACHE_EDCON_VALUE; #endif #ifdef __ICACHE_DACON # if __ICACHE_DACON_DO_MASK if ( __ICACHE_DACON_INIT) __ICACHE_DACON.U |= __ICACHE_DACON_VALUE & ~__ICACHE_DACON_MASK; # else if(__ICACHE_DACON_INIT) __ICACHE_DACON.U = __ICACHE_DACON_VALUE; # endif #endif /* * Vector table segment */ #if __SET_VECSEG __VECSEG.U = __seg( _lc_vector_table ); /* use linker symbol */ #endif /* * Initialize system stack pointer and underflow and overflow registers */ __asm("$nowarning(735)" ); /* do not complain about the labels in the atomic sequence */ #if __SET_SPSEG __asm( "atomic #4" ); __SPSEG.U = __seg( _lc_ub_system_stack ); /* use linker symbol */ #else __asm( "atomic #3" ); #endif __SP.U = (int)_lc_ub_system_stack; __STKOV.U = (int)(_lc_ue_system_stack + 6 * 2); __STKUN.U = (int)_lc_ub_system_stack; /* * einit: end-of-initialization, set reset output pin /RSTOUT high */ #if __EXECUTE_EINIT __einit(); #endif #if __WDT_ENABLED __srvwdt(); #endif /* * Initialize user stack pointer */ __setsp( _lc_ub_user_stack ); /* * Initialize user stack pointers in local register banks */ #if defined(__CORE_XC16X__) || defined(__CORE_SUPER10__) #ifndef BANK /* BANK not defined in new style SFR files */ #define BANK __PSW.B.BANK #endif # if __INIT_USER_STACK1 BANK = 2; /* local registerbank 1 */ __setsp( _lc_ub_user_stack1 ); /* initialize user stack pointer */ # endif # if __INIT_USER_STACK2 BANK = 3; /* local registerbank 2 */ __setsp( _lc_ub_user_stack2 ); /* initialize user stack pointer */ # endif # if __INIT_USER_STACK1 || __INIT_USER_STACK2 BANK = 0; /* back to global registerbank */ # endif #endif /* * DPPs for near __addressing */ __DPP0.U = __pag(_lc_base_dpp0); __DPP1.U = __pag(_lc_base_dpp1); __DPP2.U = __pag(_lc_base_dpp2); /* * Initialize C variables */ if( _lc_copy_table[0].action != ac_stop ) /* only initialize if copy table contains data */ _init( __WDT_ENABLED ); /* library routine: initialize C variables */ /* * Set up profiling */ #if __PROF_ENABLE__ __prof_init(); #endif #ifndef IEN /* IEN not defined in new style SFR files */ #define IEN __PSW.B.IEN #endif if( __ENABLE_INTERRUPTS ) IEN = 1; /* enable interrupts */ #if __WDT_ENABLED __srvwdt(); /* serve watchdog timer */ #endif #if __USE_ARGC_ARGV exit( main( _argcv( argcv, __ARGCV_BUFSIZE ), (char **)argcv ) ); #else exit( main( 0, NULL ) ); /* argc is 0 */ #endif }