示例#1
0
/**
 * \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;
}
示例#2
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);
}
示例#3
0
/**
 * \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);
}
示例#4
0
/**
 * \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;
}
示例#5
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);
	}
}