20.7.1.2.2 Workflow

  1. Check if the RESET is caused by external wakeup pin.
    #if SAML21
        /* Check if the RESET is caused by external wakeup pin */
        if (system_get_reset_cause() == SYSTEM_RESET_CAUSE_BACKUP
            && system_get_backup_exit_source() == SYSTEM_RESET_BACKKUP_EXIT_EXTWAKE
            && (system_get_pin_wakeup_cause() & (1 << CONF_EXT_WAKEUP_PIN))
            ) {
            system_init();
            delay_init();
            config_clock_output_and_extwake_pin();
            /* Now GCLK0/GCLK1 are running at 4MHz , using LED0 ON/OFF as an indication */
            led_toggle_indication(4);
            port_pin_set_output_level(LED_0_PIN, LED_0_ACTIVE);
            while(1);
        }
    #endif
    
  2. Check the standby mode and the backup sleep mode.
    
        /* Disable I/O retention*/
        system_io_retension_disable();
    
        system_init();
        delay_init();
    
        port_pin_set_output_level(LED_0_PIN, LED_0_ACTIVE);
    
        /* Config GCLK0/GCLK1 output pin and extwakeup pin */
        config_clock_output_and_extwake_pin();
    
        /* Config external interrupt for wakeup system from standby mode*/
        configure_extint_channel();
        delay_s(1);
    
        /* Turn off LED0 before enter standby mode */
        port_pin_set_output_level(LED_0_PIN, LED_0_INACTIVE);
    
        /* Set and enter standby mode, using default stanby config */
        system_set_sleepmode(SYSTEM_SLEEPMODE_STANDBY);
        system_sleep();
    
        /* Detect BUTTON pressed and system  wakeup from standby mode,
            turn on led */
        port_pin_set_output_level(LED_0_PIN, LED_0_ACTIVE);
    
        /* Disable external interrupt to avoid any impact */
        extint_chan_disable_callback(BUTTON_0_EIC_LINE,
                    EXTINT_CALLBACK_TYPE_DETECT);
        extint_chan_clear_detected(BUTTON_0_EIC_LINE);
    
        /* Switch GCLK0 to 48MHz */
        performance_level_switch_test();
    
        /* GCLK0 is runing at 48MHz and GCLK1 is running at 4MHz ,
            use led ON/OFF as an indication */
        led_toggle_indication(2);
    
    #if SAML21
        /* Set external wakeup pin polarity */
        system_set_pin_wakeup_polarity_low(1<<CONF_EXT_WAKEUP_PIN);
    
        /* Set external wakeup detector */
        system_enable_pin_wakeup(1<<CONF_EXT_WAKEUP_PIN);
        system_set_pin_wakeup_debounce_counter(SYSTEM_WAKEUP_DEBOUNCE_2CK32);
    
        /* Enter BACKUP mode */
        system_set_sleepmode(SYSTEM_SLEEPMODE_BACKUP);
        system_sleep();
    
        /* Now system is in BACKUP mode and wait for extwakeup pin to low */
    #endif