/** * \brief Configure the RTT to generate an alarm at the given time. * alarm happens when CRTV value equals ALMV+1, so RTT_AR should be alarmtime - 1. * if you want to get alarm when rtt hit 0 , ALMV should be set to 0xFFFFFFFF. * * \param p_rtt Pointer to an RTT instance. * \param ul_alarm_time Alarm time,Alarm time = ALMV + 1. * * \retval 0 Configuration is done. */ uint32_t rtt_write_alarm_time(Rtt *p_rtt, uint32_t ul_alarm_time) { uint32_t flag; flag = p_rtt->RTT_MR & RTT_MR_ALMIEN; rtt_disable_interrupt(RTT, RTT_MR_ALMIEN); /** * Alarm time = ALMV + 1,If the incoming parameter * is 0, the ALMV is set to 0xFFFFFFFF. */ if(ul_alarm_time == 0) { p_rtt->RTT_AR = 0xFFFFFFFF; } else { p_rtt->RTT_AR = ul_alarm_time - 1; } if (flag) { rtt_enable_interrupt(RTT, RTT_MR_ALMIEN); } return 0; }
/** * \brief RTT configuration function. * * Configures the RTT to generate a one second tick, which triggers * the RTT alarms interrupt. */ static void gpbr_test_configure_rtt(void) { uint32_t ul_previous_time; /* Configure RTT for a 1 second tick interrupt */ rtt_init(RTT, 32768); ul_previous_time = rtt_read_timer_value(RTT); while (ul_previous_time == rtt_read_timer_value(RTT)); /* Enable RTT alarms interrupt to return from backup mode */ NVIC_DisableIRQ(RTT_IRQn); NVIC_ClearPendingIRQ(RTT_IRQn); NVIC_SetPriority(RTT_IRQn, 0); NVIC_EnableIRQ(RTT_IRQn); rtt_enable_interrupt(RTT, RTT_MR_ALMIEN); }
/** * \brief RTT configuration function. * * Configure the RTT to generate a one second tick, which triggers the RTTINC * interrupt. */ static void configure_rtt(void) { uint32_t ul_previous_time; /* Configure RTT for a 1 second tick interrupt */ #if SAM4N || SAM4S || SAM4E || SAM4C || SAM4CP || SAM4CM rtt_sel_source(RTT, false); #endif rtt_init(RTT, 32768); ul_previous_time = rtt_read_timer_value(RTT); while (ul_previous_time == rtt_read_timer_value(RTT)); /* Enable RTT interrupt */ NVIC_DisableIRQ(RTT_IRQn); NVIC_ClearPendingIRQ(RTT_IRQn); NVIC_SetPriority(RTT_IRQn, 0); NVIC_EnableIRQ(RTT_IRQn); rtt_enable_interrupt(RTT, RTT_MR_RTTINCIEN); }
/** * \brief Configure the RTT to generate an alarm at the given time. * * \param p_rtt Pointer to an RTT instance. * \param ul_alarm_time Alarm time. * * \retval 0 Configuration is done. * \retval 1 Parameter error. */ uint32_t rtt_write_alarm_time(Rtt *p_rtt, uint32_t ul_alarm_time) { uint32_t flag; if (ul_alarm_time == 0) { return 1; } flag = p_rtt->RTT_MR & RTT_MR_ALMIEN; rtt_disable_interrupt(RTT, RTT_MR_ALMIEN); /* Alarm time = ALMV + 1 */ p_rtt->RTT_AR = ul_alarm_time - 1; if (flag) { rtt_enable_interrupt(RTT, RTT_MR_ALMIEN); } return 0; }
int main(void) { enum sleepmgr_mode current_sleep_mode = SLEEPMGR_ACTIVE; /* * Initialize the synchronous clock system to the default configuration * set in conf_clock.h. * \note All non-essential peripheral clocks are initially disabled. */ sysclk_init(); /* * Initialize the resources used by this example to the default * configuration set in conf_board.h */ board_init(); /* * Turn the activity status LED on to inform the user that the device * is active. */ ioport_set_pin_level(LED_ACTIVITY_STATUS_PIN, LED_STATUS_ON); rtt_init(RTT, 32768); /* Enable RTT interrupt */ NVIC_DisableIRQ(RTT_IRQn); NVIC_ClearPendingIRQ(RTT_IRQn); NVIC_SetPriority(RTT_IRQn, 0); NVIC_EnableIRQ(RTT_IRQn); rtt_enable_interrupt(RTT, RTT_MR_ALMIEN); /* Set wakeup source to rtt_alarm */ pmc_set_fast_startup_input(PMC_FSMR_RTTAL); #if (!SAMG) supc_set_wakeup_mode(SUPC, SUPC_WUMR_RTTEN_ENABLE); #endif /* Initialize the sleep manager, lock initial mode. */ sleepmgr_init(); sleepmgr_lock_mode(current_sleep_mode); while (1) { rtt_write_alarm_time(RTT, rtt_read_timer_value(RTT) + SLEEP_TIME); /* * Turn the activity status LED off to inform the user that the * device is in a sleep mode. */ ioport_set_pin_level(LED_ACTIVITY_STATUS_PIN, LED_STATUS_OFF); /* * Go to sleep in the deepest allowed sleep mode (i.e. no * deeper than the currently locked sleep mode). */ sleepmgr_enter_sleep(); /* * Turn the activity status LED on to inform the user that the * device is active. */ ioport_set_pin_level(LED_ACTIVITY_STATUS_PIN, LED_STATUS_ON); /* Unlock the current sleep mode. */ sleepmgr_unlock_mode(current_sleep_mode); /* Add a 3s delay. */ delay_s(ACTIVE_TIME); /* Lock the next sleep mode. */ ++current_sleep_mode; if ((current_sleep_mode >= SLEEPMGR_NR_OF_MODES)) { current_sleep_mode = SLEEPMGR_ACTIVE; } sleepmgr_lock_mode(current_sleep_mode); } }