• Resolved

Tiva Launchpad (TM4C123) Hibernation Reset Behavior when toggling VDD3ON

I have been working on putting the TM4C123(custom board) to sleep(Hibernate) for a few days. I need to enable the VDD3ON feature of the hibernation module in order to maintain LED functionality. I am having an issue where I would like to reset the device(Not wake from hibernate, microcontroller reset) while the controller  is hibernating but the reset feature is disabled. Based on the following forum, I was informed that the reset pad of the micro controller is held at a constant state (i.e Disabled) during hibernation when VDD3ON is enabled. http://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/t/388799

I am experimenting with the Tiva launchpad to verify this result by creating a program that inspects cause of system reset and puts the system into hibernate mode. The system can be woken with the WAKE button, and hibernation is not entered until the user pressed the other push button on the device. I have provided the main function for my code below.

My question is: Has anyone performed a similar test and can verify that the reset button is unavailable /  Is there a software/hardware work around for using the reset button in hibernation?

  uint32_t ui32Status = 0;	// Keeps Track of Hibernation Wake Cause
	uint32_t ulResetCause;		// Keeps Track of System Reset Cause

    FPULazyStackingEnable();
    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
    
	ConfigureUART();
	ConfigureUserButton();
	Configure_RED_LED();
	Configure_Blue_LED();
	Configure_Green_LED();

    SysCtlPeripheralEnable(SYSCTL_PERIPH_HIBERNATE);     // Enable the Hibernation module.

    UARTprintf("Start\r\n");
	ulResetCause = SysCtlResetCauseGet();
    SysCtlResetCauseClear(ulResetCause);

	//Print Reset Cause
    if((ulResetCause & SYSCTL_CAUSE_HIB) == SYSCTL_CAUSE_HIB)
        UARTprintf("SYSCTL_CAUSE_HIB\r\n");
    if((ulResetCause & SYSCTL_CAUSE_SW) == SYSCTL_CAUSE_SW)
    	UARTprintf("SYSCTL_CAUSE_SW\r\n");
    if((ulResetCause & SYSCTL_CAUSE_EXT) == SYSCTL_CAUSE_EXT)
    	UARTprintf("SYSCTL_CAUSE_EXT\r\n");
    if((ulResetCause & SYSCTL_CAUSE_POR) == SYSCTL_CAUSE_POR)
    	UARTprintf("SYSCTL_CAUSE_POR\r\n");
    if((ulResetCause & SYSCTL_CAUSE_BOR) == SYSCTL_CAUSE_BOR)
    	UARTprintf("SYSCTL_CAUSE_BOR\r\n");


	if((ulResetCause & SYSCTL_CAUSE_HIB) == SYSCTL_CAUSE_HIB ||
	(ulResetCause & SYSCTL_CAUSE_SW) == SYSCTL_CAUSE_SW ||
	(ulResetCause & SYSCTL_CAUSE_EXT) == SYSCTL_CAUSE_EXT ||
	(ulResetCause & SYSCTL_CAUSE_BOR) == SYSCTL_CAUSE_BOR)
    {
    	while(UserButtonNotPushed())
			ToggleRedLED(500);	//ms
    }
    else //Power on Reset
    {
		if(HibernateIsActive())
		{
	    	UARTprintf("HibernateIsActive(YES)\r\n");
			ui32Status = HibernateIntStatus(0);
			HibernateIntClear(ui32Status);

			if(ui32Status & HIBERNATE_INT_PIN_WAKE)
			{
		    	UARTprintf("WakeCause(HIBERNATE_INT_PIN_WAKE)\r\n");
		    	while(UserButtonNotPushed())
					Toggle_RB_LED(500);
			}
			else
			{
		    	UARTprintf("WakeCause(Other)\r\n");
		    	while(UserButtonNotPushed())
					Toggle_RB_LED(50);
			}
		}
		else // If PoR from initial connection to power
		{
		    if((ulResetCause & SYSCTL_CAUSE_POR) == SYSCTL_CAUSE_POR)
			{
				while(UserButtonNotPushed())
					Toggle_RGB_LED(500);
		    }
		    else	//Should never get here
		    {
				while(UserButtonNotPushed())
					Toggle_RGB_LED(50);
		    }
		}
    }

	delay_ms(1000);	// Give User Time to Release the Button
	
    HibernateEnableExpClk(SysCtlClockGet());
	HibernateClockConfig(HIBERNATE_OSC_LOWDRIVE);        

    HibernateGPIORetentionEnable();	//Enable VDD3ON

    // Make sure all interrupt states are clear
	ui32Status = HibernateIntStatus(0);
	HibernateIntClear(ui32Status);

    HibernateWakeSet(HIBERNATE_WAKE_PIN);

	while(UserButtonNotPushed())
		ToggleGreenLED(100);

	UARTprintf("Proceeding to Hibernate\r\n");
	delay_ms(200);	//Give Uart time to push characters out

    HibernateRequest();

    delay_ms(1000);	//Give Module time to enable

	// If failed to enter Hibernate, Toggle Forever
    while(1)	
		ToggleBlueLED(1000);