static void clock_init(void) { /** * Disable global interrupts */ bool bIntDisabled = IntMasterDisable(); /** * Configure the 32 kHz pins, PD6 and PD7, for crystal operation * By default they are configured as GPIOs */ GPIODirModeSet(GPIO_D_BASE, 0x40, GPIO_DIR_MODE_IN); GPIODirModeSet(GPIO_D_BASE, 0x80, GPIO_DIR_MODE_IN); IOCPadConfigSet(GPIO_D_BASE, 0x40, IOC_OVERRIDE_ANA); IOCPadConfigSet(GPIO_D_BASE, 0x80, IOC_OVERRIDE_ANA); /** * Set the real-time clock to use the 32khz internal crystal * Set the system clock to use the external 32 MHz crystal * Set the system clock to 32 MHz */ SysCtrlClockSet(true, false, SYS_CTRL_SYSDIV_32MHZ); /** * Set the IO clock to operate at 16 MHz * This way peripherals can run while the system clock is gated */ SysCtrlIOClockSet(SYS_CTRL_SYSDIV_16MHZ); /** * Wait until the selected clock configuration is stable */ while (!((HWREG(SYS_CTRL_CLOCK_STA)) & (SYS_CTRL_CLOCK_STA_XOSC_STB))); /** * Define what peripherals run in each mode */ SysCtrlDeepSleepSetting(); SysCtrlSleepSetting(); SysCtrlRunSetting(); SysCtrlWakeupSetting(); /** * Re-enable interrupt if initially enabled. */ if(!bIntDisabled) { IntMasterEnable(); } }
/************************************************************************************************** * @fn main * * @brief This function is the C-main function invoked from the IAR reset ISR handler. * * input parameters * * None. * * output parameters * * None. * * @return None. */ void main(void) { uint32 ledgerPageAddr = FLASH_BASE + (HAL_IBM_LEDGER_PAGE * HAL_FLASH_PAGE_SIZE); for (int pgCnt = 0; pgCnt < HAL_IBM_LEDGER_PAGE; pgCnt++, ledgerPageAddr -= HAL_FLASH_PAGE_SIZE) { ibm_ledger_t *pLedger = (ibm_ledger_t *)ledgerPageAddr; int ledgerCnt = 0; if (memcmp(pLedger, &LedgerPageSignature, sizeof(ibm_ledger_t))) { continue; } for (pLedger++; ledgerCnt < (HAL_FLASH_PAGE_SIZE/sizeof(ibm_ledger_t)); ledgerCnt++, pLedger++) { if ( (pLedger->imageCRC[0] == 0xFFFFFFFF) || // Not expected except first 2-step programming. ((pLedger->imageCRC[0] != 0) && (pLedger->imageCRC[0] == pLedger->imageCRC[1])) ) { // Sanity check NVIC entries. if ((pLedger->nvicJump[0] > 0x20004000) && (pLedger->nvicJump[0] < 0x27007FFF) && (pLedger->nvicJump[1] > FLASH_BASE) && (pLedger->nvicJump[1] < 0x0027EFFF)) { EnterNvmApplication(pLedger->nvicJump[0], pLedger->nvicJump[1]); } } } } SysCtrlDeepSleepSetting(); HAL_DISABLE_INTERRUPTS(); SysCtrlDeepSleep(); HAL_SYSTEM_RESET(); }
void zclEnergyHarvester_Init( byte task_id ) { zclEnergyHarvester_TaskID = task_id; // This app is part of the Home Automation Profile zclHA_Init( &zclSampleLight_SimpleDesc ); // Register for a test endpoint afRegister( &testEp ); zcl_registerPlugin( ZCL_CLUSTER_ID_MS_ILLUMINANCE_MEASUREMENT, ZCL_CLUSTER_ID_MS_ALL, zclEnergyHarvester_HdlIncoming ); ZDO_RegisterForZDOMsg( zclEnergyHarvester_TaskID, End_Device_Bind_rsp ); #if DEV_TYPE == COORDINATOR ZDO_RegisterForZDOMsg( zclEnergyHarvester_TaskID, Device_annce ); #else adc_Init(); // Configure signal from off-chip timer to be wake-up signal GPIODirModeSet( GPIO_B_BASE, GPIO_PIN_3 , GPIO_DIR_MODE_IN ); // Configure deep sleep in power mode 3, woken up by off-chip timer SysCtrlDeepSleepSetting(); SysCtrlPowerModeSet( SYS_CTRL_PM_3 ); GPIODirModeSet( GPIO_B_BASE, GPIO_PIN_4 , GPIO_DIR_MODE_IN ); HWREG( SYS_CTRL_IWE ) = 0x02; GPIOPowIntTypeSet( GPIO_B_BASE, GPIO_PIN_4, GPIO_POW_RISING_EDGE ); GPIOPowIntClear( GPIO_B_BASE, GPIO_PIN_4 ); GPIOPowIntEnable( GPIO_B_BASE, GPIO_PIN_4 ); // Done with off-chip timer acknowledge GPIOPinWrite( GPIO_B_BASE, GPIO_PIN_5, GPIO_PIN_5 ); #endif }