void Board_RTC_Init(void) { Chip_RTC_Init(LPC_RTC); rtcCallback=NULL; Chip_RTC_CntIncrIntConfig(LPC_RTC,0, DISABLE); NVIC_EnableIRQ(RTC_IRQn); }
/** * Power State handler function */ static void PMC_PwrState_Handler(uint8_t buffer, uint8_t Wake_RTC) { CHIP_EVRT_SRC_T Evrt_Src; CHIP_PMC_PWR_STATE_T Pwr_state; uint8_t confirm = 0xFF; if (Wake_RTC) { /* Configure EVRT_SRC_RTC as wake up signal */ Evrt_Src = EVRT_SRC_RTC; /* Disable interrupt signal from Evrt_Src pin to EVRT */ Chip_EVRT_SetUpIntSrc(Evrt_Src, DISABLE); /* Initialize and configure RTC */ Chip_RTC_Init(LPC_RTC); Chip_RTC_ResetClockTickCounter(LPC_RTC); Chip_RTC_SetTime(LPC_RTC, RTC_TIMETYPE_SECOND, 0); /* Set alarm time = RTC_ALARM_TIME seconds. * So after each RTC_ALARM_TIME seconds, RTC will generate and wake-up system */ Chip_RTC_SetAlarmTime(LPC_RTC, RTC_TIMETYPE_SECOND, RTC_ALARM_TIME); Chip_RTC_CntIncrIntConfig(LPC_RTC, RTC_AMR_CIIR_IMSEC, DISABLE); /* Set the AMR for RTC_ALARM_TIME match alarm interrupt */ Chip_RTC_AlarmIntConfig(LPC_RTC, RTC_AMR_CIIR_IMSEC, ENABLE); Chip_RTC_ClearIntPending(LPC_RTC, RTC_INT_ALARM); } else { Evrt_Src = EVRT_SRC_WAKEUP0; } /* Configure wake up signal */ PMC_Evrt_Configure(Evrt_Src); /* Get confirmation from user to continue * Print wake up signal information to user */ DEBUGOUT(menu3); while ( (confirm != 'C') && (confirm != 'c')) { confirm = DEBUGIN(); } switch (buffer) { case '1': DEBUGOUT("Entering 'Sleep' state ...\r\n"); if (Wake_RTC) { DEBUGOUT("Wait for %d seconds, RTC alarm will wake up from 'Sleep' mode \r\n", RTC_ALARM_TIME); Chip_RTC_Enable(LPC_RTC, ENABLE); } else { DEBUGOUT("Press WAKEUP0 button/Connect WAKEUP0 pin to 3.3V to exit 'Sleep' mode \r\n"); } Chip_PMC_Sleep(); Chip_RTC_DeInit(LPC_RTC); DEBUGOUT("Woken up \r\n"); break; case '2': DEBUGOUT("Entering 'Deep Sleep' state ...\r\n"); if (Wake_RTC) { DEBUGOUT("Wait for %d seconds, RTC alarm will wake up from 'Deep Sleep' mode \r\n", RTC_ALARM_TIME); Chip_RTC_Enable(LPC_RTC, ENABLE); } else { DEBUGOUT("Press WAKEUP0 button/Connect WAKEUP0 pin to 3.3V to exit 'Deep Sleep' mode \r\n"); } Pwr_state = PMC_DeepSleep; /* Call Pre SleepPowerDown function */ PMC_Pre_SleepPowerDown(); /* Goto Deep Sleep mode */ Chip_PMC_Set_PwrState(Pwr_state); /* Call Post Wake up Initialisation function */ PMC_Post_Wakeup(buffer); DEBUGOUT("\r\nWoken up \r\n"); break; case '3': DEBUGOUT("Entering 'Power Down' state ...\r\n"); if (Wake_RTC) { DEBUGOUT("Wait for %d seconds, RTC alarm will wake up from 'Power Down' mode \r\n", RTC_ALARM_TIME); Chip_RTC_Enable(LPC_RTC, ENABLE); } else { DEBUGOUT("Press WAKEUP0 button/Connect WAKEUP0 pin to 3.3V to exit 'Power Down' mode \r\n"); } Pwr_state = PMC_PowerDown; /* Call Pre SleepPowerDown function */ PMC_Pre_SleepPowerDown(); /* Goto Deep Sleep mode */ Chip_PMC_Set_PwrState(Pwr_state); /* Call Post Wake up Initialisation function */ PMC_Post_Wakeup(buffer); DEBUGOUT("\r\nWoken up \r\n"); break; case '4': DEBUGOUT("Entering 'Deep Power Down' state ...\r\n"); if (Wake_RTC) { DEBUGOUT("Wait for %d seconds, RTC alarm will wake up from 'Deep Power Down' mode \r\n", RTC_ALARM_TIME); Chip_RTC_Enable(LPC_RTC, ENABLE); } else { DEBUGOUT("Press WAKEUP0 button/Connect WAKEUP0 pin to 3.3V to exit 'Deep Power Down' mode \r\n"); } Pwr_state = PMC_DeepPowerDown; /* Call Pre SleepPowerDown function */ PMC_Pre_SleepPowerDown(); /* Goto Deep Sleep mode */ Chip_PMC_Set_PwrState(Pwr_state); /* Wake up from Deep power down state is as good as RESET */ while (1) {} break; default: break; } }
/** * @brief main routine for example_lwip_tcpecho_freertos_18xx43xx * @return Function should not exit */ int main(void) { prvSetupHardware(); Chip_RTC_Init(); /*Set current time for RTC 8:59:20PM, 2016-04-11 MONDAY 102*/ FullTime.time[RTC_TIMETYPE_SECOND] = 40; FullTime.time[RTC_TIMETYPE_MINUTE] = 59; FullTime.time[RTC_TIMETYPE_HOUR] = 8; FullTime.time[RTC_TIMETYPE_DAYOFMONTH] = 11; FullTime.time[RTC_TIMETYPE_DAYOFWEEK] = 1; FullTime.time[RTC_TIMETYPE_DAYOFYEAR] = 102; FullTime.time[RTC_TIMETYPE_MONTH] = 04; FullTime.time[RTC_TIMETYPE_YEAR] = 2016; Chip_RTC_SetFullTime(&FullTime); /* Set the RTC to generate an interrupt on each second */ Chip_RTC_CntIncrIntConfig(RTC_AMR_CIIR_IMSEC, ENABLE); /* Enable matching for alarm for second, minute, hour fields only */ Chip_RTC_AlarmIntConfig(RTC_AMR_CIIR_IMSEC | RTC_AMR_CIIR_IMMIN | RTC_AMR_CIIR_IMHOUR, ENABLE); /* Enable RTC interrupt in NVIC */ NVIC_EnableIRQ((IRQn_Type) RTC_IRQn); /* Enable RTC (starts increase the tick counter and second counter register) */ Chip_RTC_Enable(ENABLE); //DIFFERENZA TRA GIORNI IP_RTC_TIME_T data1 = FullTime, data2, diffDate; uint32_t nGiorniDifferenza; data2.time[RTC_TIMETYPE_SECOND] = 40; data2.time[RTC_TIMETYPE_MINUTE] = 59; data2.time[RTC_TIMETYPE_HOUR] = 7;//23;//8; data2.time[RTC_TIMETYPE_DAYOFMONTH] = 12; data2.time[RTC_TIMETYPE_DAYOFWEEK] = 2; data2.time[RTC_TIMETYPE_DAYOFYEAR] = 103; data2.time[RTC_TIMETYPE_MONTH] = 04; data2.time[RTC_TIMETYPE_YEAR] = 2016;//2017; diffDate = differenzaDate(data2, data1); nGiorniDifferenza = differenzaGiorni(data2, data1); uint8_t counter = 0; ptrMedic = inizializzaListaMed(); for(counter = 0; counter < maxR; counter++){ if (l_tabellaMedicine[counter][65]==0) { //se più volte al giorno == 0 if (l_tabellaMedicine[counter][59]==0) { ptrMedic = inserisciInTestaListaMed(ptrMedic, l_tabellaMedicine[counter]); } else { if (l_tabellaMedicine[counter][58] == 0) { //DA ASSUMERE ptrMedic = inserisciInTestaListaMed(ptrMedic, l_tabellaMedicine[counter]); l_tabellaMedicine[counter][58] ++; } else { l_tabellaMedicine[counter][58] ++; if (l_tabellaMedicine[counter][58] = l_tabellaMedicine[counter][59]) { l_tabellaMedicine[counter][58] = 0; } } } } else { //conta quante volte prendere la medicina if (l_tabellaMedicine[counter][65]==1) { //controlla la ripetizione Chip_RTC_GetFullTime(&FullTime); IP_RTC_TIME_T dataIn; dataIn.time[RTC_TIMETYPE_DAYOFMONTH] = l_tabellaMedicine[counter][43]; dataIn.time[RTC_TIMETYPE_MONTH] = l_tabellaMedicine[counter][44]; dataIn.time[RTC_TIMETYPE_YEAR] = (l_tabellaMedicine[counter][45]<<8) | l_tabellaMedicine[counter][46]; int oraInizio = l_tabellaMedicine[counter][51]; int intervalloOre = l_tabellaMedicine[counter][57]; if (FullTime.time[RTC_TIMETYPE_DAYOFMONTH]==dataIn.time[RTC_TIMETYPE_DAYOFMONTH] && FullTime.time[RTC_TIMETYPE_MONTH]==dataIn.time[RTC_TIMETYPE_MONTH] && FullTime.time[RTC_TIMETYPE_YEAR]==dataIn.time[RTC_TIMETYPE_YEAR]) { //E' il giorno di inizio e lascio l'ora iniziale invariata oraInizio = oraInizio; } else { int go = 1; while (go){ if ((oraInizio-intervalloOre)>=0) { oraInizio = oraInizio-intervalloOre; } else { go = 0; } } } int temp = oraInizio; int contatore = 1; while ((temp+intervalloOre) < 24) { temp = temp+intervalloOre; contatore++; } int c = 0; IP_RTC_TIME_T oraMed; oraMed.time[RTC_TIMETYPE_HOUR] = oraInizio; oraMed.time[RTC_TIMETYPE_MINUTE] = l_tabellaMedicine[counter][52]; oraMed.time[RTC_TIMETYPE_SECOND] = l_tabellaMedicine[counter][53]; for (c=0; c<contatore; c++) { ptrMedic = inserisciInTestaListaMedOra(ptrMedic, l_tabellaMedicine[counter], oraMed); oraMed.time[RTC_TIMETYPE_HOUR] += intervalloOre; } } else { //orari custom int n = l_tabellaMedicine[counter][65]; int c = 0; IP_RTC_TIME_T oraMed; oraMed.time[RTC_TIMETYPE_HOUR] = l_tabellaMedicine[counter][51]; oraMed.time[RTC_TIMETYPE_MINUTE] = l_tabellaMedicine[counter][52]; oraMed.time[RTC_TIMETYPE_SECOND] = l_tabellaMedicine[counter][53]; ptrMedic = inserisciInTestaListaMedOra(ptrMedic, l_tabellaMedicine[counter], oraMed); for (c=0; c<n-1; c++) { oraMed.time[RTC_TIMETYPE_HOUR] = l_tabellaMedicine[counter][66+3*c]; oraMed.time[RTC_TIMETYPE_MINUTE] = l_tabellaMedicine[counter][67+3*c]; oraMed.time[RTC_TIMETYPE_SECOND] = l_tabellaMedicine[counter][68+3*c]; ptrMedic = inserisciInTestaListaMedOra(ptrMedic, l_tabellaMedicine[counter], oraMed); } } } } ptrMedic = ordinamento_lista_med(ptrMedic); //Inizio dall'orario attuale e non considero tutti i medicinali precedenti in giornata IP_RTC_TIME_T oraAllarme; oraAllarme.time[RTC_TIMETYPE_HOUR] = ptrMedic->oraA; oraAllarme.time[RTC_TIMETYPE_MINUTE] = ptrMedic->minA; oraAllarme.time[RTC_TIMETYPE_SECOND] = ptrMedic->secA; while (orarioDopoOrario(FullTime, oraAllarme)) { ptrMedic = ptrMedic->next; oraAllarme.time[RTC_TIMETYPE_HOUR] = ptrMedic->oraA; oraAllarme.time[RTC_TIMETYPE_MINUTE] = ptrMedic->minA; oraAllarme.time[RTC_TIMETYPE_SECOND] = ptrMedic->secA; } FullTime.time[RTC_TIMETYPE_HOUR] = oraAllarme.time[RTC_TIMETYPE_HOUR];//ptrMedic->oraA; FullTime.time[RTC_TIMETYPE_MINUTE] = oraAllarme.time[RTC_TIMETYPE_MINUTE];//ptrMedic->minA; FullTime.time[RTC_TIMETYPE_SECOND] = oraAllarme.time[RTC_TIMETYPE_SECOND];//ptrMedic->secA; Chip_RTC_SetFullAlarmTime(&FullTime); // CICLO FOR PER LEGGERE TUTTI I BIT DI UN BYTE // unsigned bit=0, n_bits = 4u, *bits = (unsigned*)malloc(sizeof(unsigned) * n_bits); // for (bit = 0; bit < n_bits; ++bit, input >>1) // bits[bit] = input & 1; uint8_t i; for (i=0;i<35;i++){ //char t = (char)m1[4+i]; //nomeMed[i]=t; arrNomiMed[i]=l_tabellaMedicine[0][4+i]; } nomeMed=&arrNomiMed; vSemaphoreCreateBinary( xSemaDataAvail ); vSemaphoreCreateBinary( xSemaGUIend ); /* xTaskCreate(vTSCTask, (signed char *) "vTSCTask", configMINIMAL_STACK_SIZE, NULL, TASK_PRIO_TOUCHSCREEN, (xTaskHandle *) NULL); */ /* BASIC ONE xTaskCreate(vLcdTask, (signed char *) "vLCDTask", configMINIMAL_STACK_SIZE * 4, NULL, TASK_PRIO_LCD, (xTaskHandle *) NULL); */ xTaskCreate(vLcdTaskNew, (signed char *) "vLCDTaskNew", configMINIMAL_STACK_SIZE * 4, NULL, TASK_PRIO_LCD, (xTaskHandle *) NULL); /* Add another thread for initializing physical interface. This is delayed from the main LWIP initialization. */ /* xTaskCreate(vSetupIFTask, (signed char *) "SetupIFx", configMINIMAL_STACK_SIZE, NULL, (tskIDLE_PRIORITY + 1UL), (xTaskHandle *) NULL); */ xTaskCreate(vSetupPollTask, (signed char *) "SetupPoll", configMINIMAL_STACK_SIZE*4, NULL, (tskIDLE_PRIORITY + 1UL), (xTaskHandle *) NULL); /* xTaskCreate(vRTCTask, (signed char *) "RTCTask", configMINIMAL_STACK_SIZE*4, NULL, (tskIDLE_PRIORITY + 2UL), (xTaskHandle *) NULL); */ /* Start the scheduler */ vTaskStartScheduler(); /* Should never arrive here */ return 1; }
/** * @brief Main entry point * @return Nothing */ int main(void) { RTC_TIME_T FullTime; SystemCoreClockUpdate(); Board_Init(); fIntervalReached = 0; fAlarmTimeMatched = 0; On0 = On1 = false; Board_LED_Set(2, false); DEBUGSTR("The RTC operates on a 1 Hz clock.\r\n" \ "Register writes can take up to 2 cycles.\r\n" \ "It will take a few seconds to fully\r\n" \ "initialize it and start it running.\r\n\r\n"); DEBUGSTR("We'll print a timestamp every 5 seconds.\r\n" \ "...and another when the alarm occurs.\r\n"); Chip_RTC_Init(LPC_RTC); /* Set current time for RTC 2:00:00PM, 2012-10-05 */ FullTime.time[RTC_TIMETYPE_SECOND] = 0; FullTime.time[RTC_TIMETYPE_MINUTE] = 0; FullTime.time[RTC_TIMETYPE_HOUR] = 14; FullTime.time[RTC_TIMETYPE_DAYOFMONTH] = 5; FullTime.time[RTC_TIMETYPE_DAYOFWEEK] = 5; FullTime.time[RTC_TIMETYPE_DAYOFYEAR] = 279; FullTime.time[RTC_TIMETYPE_MONTH] = 10; FullTime.time[RTC_TIMETYPE_YEAR] = 2012; Chip_RTC_SetFullTime(LPC_RTC, &FullTime); /* Set ALARM time for 17 seconds from time */ FullTime.time[RTC_TIMETYPE_SECOND] = 17; Chip_RTC_SetFullAlarmTime(LPC_RTC, &FullTime); /* Set the RTC to generate an interrupt on each second */ Chip_RTC_CntIncrIntConfig(LPC_RTC, RTC_AMR_CIIR_IMSEC, ENABLE); /* Enable matching for alarm for second, minute, hour fields only */ Chip_RTC_AlarmIntConfig(LPC_RTC, RTC_AMR_CIIR_IMSEC | RTC_AMR_CIIR_IMMIN | RTC_AMR_CIIR_IMHOUR, ENABLE); /* Clear interrupt pending */ Chip_RTC_ClearIntPending(LPC_RTC, RTC_INT_COUNTER_INCREASE | RTC_INT_ALARM); /* Enable RTC interrupt in NVIC */ NVIC_EnableIRQ((IRQn_Type) RTC_IRQn); /* Enable RTC (starts increase the tick counter and second counter register) */ Chip_RTC_Enable(LPC_RTC, ENABLE); /* Loop forever */ while (1) { if (fIntervalReached) { /* Every 5s */ fIntervalReached = 0; On1 = (bool) !On1; Board_LED_Set(1, On1); /* read and display time */ Chip_RTC_GetFullTime(LPC_RTC, &FullTime); showTime(&FullTime); } if (fAlarmTimeMatched) { fAlarmTimeMatched = false; /* announce event */ DEBUGSTR("ALARM triggered!\r\n"); Board_LED_Set(2, true); /* read and display time */ Chip_RTC_GetFullTime(LPC_RTC, &FullTime); showTime(&FullTime); } } }