void rtc_init(void) {
uint32_t timestamp = 0;
SystemCoreClockUpdate();
Chip_Clock_EnableRTCOsc();
Chip_RTC_Init(LPC_RTC);
timestamp = Chip_RTC_GetCount(LPC_RTC);
Chip_RTC_Reset(LPC_RTC);
Chip_RTC_SetCount(LPC_RTC, timestamp);
Chip_RTC_SetAlarm(LPC_RTC, 3);
/* Clear latched RTC interrupt statuses */
Chip_RTC_ClearStatus(LPC_RTC, (RTC_CTRL_OFD | RTC_CTRL_ALARM1HZ | RTC_CTRL_WAKE1KHZ));
/* Enable RTC as a peripheral wakeup event */
Chip_SYSCTL_EnablePeriphWakeup(SYSCTL_WAKEUP_RTCINT);
/* Enable RTC interrupt in NVIC */
NVIC_EnableIRQ((IRQn_Type) RTC_IRQn);
Chip_RTC_Enable(LPC_RTC);
}
int main(void) {
static uint32_t delay = 0;
uint32_t i, j = 0;
SystemCoreClockUpdate();
for (delay = 0; delay < 0x5FFFFF; delay++) {
// safety delay
}
rtc_init();
for (i = 0; i < 3; i++) {
switch (i) {
case 0:
for (j = 0; j < 32; j++) {
switch (j) {
case 1: // boot has pull up
case 4: // i2c0-scl has pull up
case 5: // i2c0-sda has pull up
Chip_IOCON_PinMuxSet(LPC_IOCON, i, j, IOCON_MODE_INACT | IOCON_FUNC0);
Chip_GPIO_WriteDirBit(LPC_GPIO, i, j, true);
Chip_GPIO_WritePortBit(LPC_GPIO, i, j, true);
break;
case 0: // reset has pull up
case 10: // swclk has pull up
case 15: // swdio line
Chip_IOCON_PinMuxSet(LPC_IOCON, i, j, IOCON_MODE_INACT | IOCON_FUNC1);
Chip_GPIO_WriteDirBit(LPC_GPIO, i, j, true);
Chip_GPIO_WritePortBit(LPC_GPIO, i, j, true);
break;
case 11: // JTAG lines
case 12:
case 13:
case 14:
Chip_IOCON_PinMuxSet(LPC_IOCON, i, j, IOCON_MODE_INACT | IOCON_FUNC1);
Chip_GPIO_WriteDirBit(LPC_GPIO, i, j, true);
Chip_GPIO_WritePortBit(LPC_GPIO, i, j, false);
break;
default:
Chip_IOCON_PinMuxSet(LPC_IOCON, i, j, IOCON_MODE_INACT | IOCON_FUNC0);
Chip_GPIO_WriteDirBit(LPC_GPIO, i, j, true);
Chip_GPIO_WritePortBit(LPC_GPIO, i, j, false);
break;
}
}
break;
case 1:
case 2:
for (j = 0; j < 32; j++) {
Chip_IOCON_PinMuxSet(LPC_IOCON, i, j, IOCON_MODE_INACT | IOCON_FUNC0);
Chip_GPIO_WriteDirBit(LPC_GPIO, i, j, true);
Chip_GPIO_WritePortBit(LPC_GPIO, i, j, false);
}
break;
}
}
Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_WDT);
Chip_WWDT_SelClockSource(LPC_WWDT, WWDT_CLKSRC_WATCHDOG_WDOSC);
Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_WDT);
LPC_SYSCON->SSP0CLKDIV = 0;
LPC_SYSCON->SSP1CLKDIV = 0;
LPC_SYSCON->USBCLKDIV = 0;
LPC_SYSCON->USBCLKDIV = 0;
LPC_SYSCON->UARTFRGDIV = 0;
LPC_SYSCON->USART0CLKDIV = 0;
LPC_SYSCON->CLKOUTDIV = 0;
LPC_SYSCON->SYSAHBCLKDIV = 1;
LPC_PMU->GPREG[4] |= (1<<11); // disable wakeup path for power-down mode
Chip_SYSCTL_PowerDown(SYSCTL_POWERDOWN_BOD_PD | SYSCTL_POWERDOWN_ADC_PD | SYSCTL_POWERDOWN_SYSOSC_PD | SYSCTL_POWERDOWN_SYSPLL_PD
| SYSCTL_POWERDOWN_USBPLL_PD | SYSCTL_POWERDOWN_USBPAD_PD | SYSCTL_POWERDOWN_TS_PD | SYSCTL_SLPWAKE_WDTOSC_PD);
Chip_SYSCTL_SetDeepSleepPD(SYSCTL_DEEPSLP_BOD_PD | SYSCTL_SLPWAKE_WDTOSC_PD);
Chip_SYSCTL_SetWakeup(~(SYSCTL_SLPWAKE_IRCOUT_PD | SYSCTL_SLPWAKE_IRC_PD | SYSCTL_SLPWAKE_FLASH_PD));
while (true) {
// blink led
Chip_GPIO_WritePortBit(LPC_GPIO, 2, 7, true);
for(i = 0; i < 0xFFF; i++);
Chip_GPIO_WritePortBit(LPC_GPIO, 2, 7, false);
Chip_RTC_SetAlarm(LPC_RTC, Chip_RTC_GetCount(LPC_RTC) + 4);
Chip_RTC_EnableWakeup(LPC_RTC, (RTC_CTRL_ALARMDPD_EN | RTC_CTRL_WAKEDPD_EN));
Chip_PMU_PowerDownState(LPC_PMU);
}
return 0;
}
int main2(void) {
uint8_t main_state_rc;
Reset_CaptureResetSource();
#if defined (__USE_LPCOPEN)
#if !defined(NO_BOARD_LIB)
// Read clock settings and update SystemCoreClock variable
SystemCoreClockUpdate();
// Set up and initialize all required blocks and
// functions related to the board hardware
Board_Init();
Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 1, IOCON_MODE_INACT | IOCON_FUNC1);
Chip_GPIO_WriteDirBit(LPC_GPIO, 0, 1, false);
LPC_SYSCON->CLKOUTDIV = 1;
LPC_SYSCON->CLKOUTSEL = 2;
LPC_SYSCON->CLKOUTUEN = 0;
LPC_SYSCON->CLKOUTUEN = 1;
Board_Power_Init();
Board_Ignitor_Init();
Board_LED_Init();
Board_RTC_Init();
Board_Debug_Init();
SWT_Init();
SysTick_Init();
// if (Inputs_GetTestPinStatus() != 0) {
// Watchdog_Init(30, false);
// }
Watchdog_Init(30, false);
DATAFLASH_Init();
Config_Init();
#endif
#endif
Board_Init();
Board_PowerProfile_EnablePeripheral(PROFILE_FLAG_UART | PROFILE_FLAG_SYSTICK);
Board_PowerProfile_EnablePeripheral(PROFILE_FLAG_UART);
Board_PowerProfile_ApplyProfile();
LOG_ClearLog();
LOG_Reset(Version_GetSvn());
State_InitMachine();
State_Add(STATE_RESET, Reset_State);
// State_Add(STATE_DISABLED, Disabled_State);
State_Add(STATE_DISARMED, Disarmed_State);
// State_Add(STATE_SAFE, Safe_State);
// State_Add(STATE_ARMED, Armed_State);
// State_Add(STATE_FIRE, Fire_State);
State_Add(STATE_SERVICE, Service_State);
State_Set(1, (uint8_t) STATE_RESET);
while (true) {
Chip_WWDT_Feed(LPC_WWDT);
main_state_rc = (*state_machine[state_current])(&state_init_flag);
if (main_state_rc == 0) {
}
//IOTracer_LogPendingChanges();
}
return 0;
}
|