//***************************************************************************** // // Returns maximum startup time (in microseconds) of XOSC_HF // //***************************************************************************** uint32_t OSCHF_GetStartupTime( uint32_t timeUntilWakeupInMs ) { uint32_t deltaTimeSinceXoscOnInMs ; int32_t deltaTempSinceXoscOn ; uint32_t newStartupTimeInUs ; deltaTimeSinceXoscOnInMs = RTC_CV_TO_MS( AONRTCCurrentCompareValueGet() - oscHfGlobals.timeXoscOn_CV ); deltaTempSinceXoscOn = AONBatMonTemperatureGetDegC() - oscHfGlobals.tempXoscOff; if ( deltaTempSinceXoscOn < 0 ) { deltaTempSinceXoscOn = -deltaTempSinceXoscOn; } if ( (( timeUntilWakeupInMs + deltaTimeSinceXoscOnInMs ) > 3000 ) || ( deltaTempSinceXoscOn > 5 ) || ( oscHfGlobals.timeXoscStable_CV < oscHfGlobals.timeXoscOn_CV ) || ( oscHfGlobals.previousStartupTimeInUs == 0 ) ) { newStartupTimeInUs = 2000; if (( HWREG( CCFG_BASE + CCFG_O_SIZE_AND_DIS_FLAGS ) & CCFG_SIZE_AND_DIS_FLAGS_DIS_XOSC_OVR_M ) == 0 ) { newStartupTimeInUs = (( HWREG( CCFG_BASE + CCFG_O_MODE_CONF_1 ) & CCFG_MODE_CONF_1_XOSC_MAX_START_M ) >> CCFG_MODE_CONF_1_XOSC_MAX_START_S ) * 125; // Note: CCFG startup time is "in units of 100us" adding 25% margin results in *125 }
// interrupts ----------------------------------------------------------- void GPIOIntHandler(void){ uint32_t event_flags; static uint32_t time1 = 0,time2 = 0; powerEnablePeriph(); powerEnableGPIOClockRunMode(); /* Wait for domains to power on */ while((PRCMPowerDomainStatus(PRCM_DOMAIN_PERIPH) != PRCM_DOMAIN_POWER_ON)); time1 = time2; time2=AONRTCCurrentCompareValueGet(); g_diff=time2-time1; /*Disable interrupts while clearing flags*/ IntDisable(INT_EDGE_DETECT); /* Read interrupt flags */ event_flags = (HWREG(GPIO_BASE + GPIO_O_EVFLAGS31_0) & GPIO_PIN_MASK); if(event_flags){//Is an event flag set? (should always be set) /* Clear the interrupt flags*/ HWREG(GPIO_BASE + GPIO_O_EVFLAGS31_0) = event_flags; /*Wait until the flag is cleared, no new flag possible because interrupt disabled*/ //while((HWREG(GPIO_BASE + GPIO_O_EVFLAGS31_0) & GPIO_PIN_MASK)); // CRASH } /*Enable after flags cleared*/ IntEnable(INT_EDGE_DETECT); powerDisablePeriph(); // Disable clock for GPIO in CPU run mode HWREGBITW(PRCM_BASE + PRCM_O_GPIOCLKGR, PRCM_GPIOCLKGR_CLK_EN_BITN) = 0; // Load clock settings HWREGBITW(PRCM_BASE + PRCM_O_CLKLOADCTL, PRCM_CLKLOADCTL_LOAD_BITN) = 1; //To avoid second interupt with register = 0 (its not fast enough!!) __asm(" nop"); __asm(" nop"); __asm(" nop"); __asm(" nop"); __asm(" nop"); __asm(" nop"); }