/** **************************************************************************************** * @brief Check application whether to enter sleep mode * @return sleep allowed status **************************************************************************************** */ int usr_sleep(void) { int32_t rt; rt = sleep_get_pm(); // If the BLE timer queue is not NULL, prevent entering into DEEPSLEEP mode if(rt == PM_DEEP_SLEEP && !ke_timer_empty()) { rt = PM_SLEEP; } // Check Device status if((rt >= PM_SLEEP) && dev_get_bf()) { // If any devices are still working, the chip cann't enter into SLEEP/DEEPSLEEP mode. rt = PM_IDLE; } if ((rt >= PM_SLEEP) && (!gpio_sleep_allowed())) { return PM_ACTIVE; // If CLOCK OFF & POWER DOWN is disabled, return immediately } #if QN_DBG_PRINT int uart_tx_st = uart_check_tx_free(QN_DEBUG_UART); if((rt >= PM_SLEEP) && (uart_tx_st == UART_TX_BUF_BUSY)) { rt = PM_IDLE; } else if(uart_tx_st == UART_LAST_BYTE_ONGOING) { return PM_ACTIVE; // If CLOCK OFF & POWER DOWN is disabled, return immediately } #endif #if QN_EACI if((GPIO_LOW == gpio_read_pin(QN_EACI_GPIO_WAKEUP_QN_MCU)) // Check external wakeup source || (eaci_env.tx_state!=EACI_STATE_TX_IDLE) // Check EACI UART TX status || (eaci_env.rx_state!=EACI_STATE_RX_START)) // Check EACI UART RX status { rt = PM_IDLE; } int tx_st = uart_check_tx_free(QN_HCI_UART); if((rt >= PM_SLEEP) && (tx_st == UART_TX_BUF_BUSY)) { rt = PM_IDLE; } else if(tx_st == UART_LAST_BYTE_ONGOING) { return PM_ACTIVE; // If CLOCK OFF & POWER DOWN is disabled, return immediately } #endif #if QN_COM if((GPIO_LOW == gpio_read_pin(QN_EACI_GPIO_WAKEUP_QN_MCU)) // Check external wakeup source || (eaci_env.tx_state!=EACI_STATE_TX_IDLE) // Check EACI UART TX status || (eaci_env.rx_state!=EACI_STATE_RX_START)) // Check EACI UART RX status { rt = PM_IDLE; } int tx_st = uart_check_tx_free(QN_COM_UART); if((rt >= PM_SLEEP) && (tx_st == UART_TX_BUF_BUSY)) { rt = PM_IDLE; } else if(tx_st == UART_LAST_BYTE_ONGOING) { return PM_ACTIVE; // If CLOCK OFF & POWER DOWN is disabled, return immediately } #endif return rt; }
int main (void) { SystemInit(); #if 0 if (0x00000004 & inp32(0x40000038)) { outp32(0x40000038, 0x80000000); } else { Led_flash(); while(1); } #endif /* Initialize GPIO */ gpio_init(cb_gpio); #if TEST_SLEEP_NORMAL == TRUE // -------------------------------------------- // sleep wakeup // -------------------------------------------- //set all pin to gpio syscon_SetPMCR0(QN_SYSCON, 0x00000000); syscon_SetPMCR1(QN_SYSCON, 0x00000000); //set all gpio input gpio_set_direction_field(GPIO_PIN_ALL, GPIO_INPUT); gpio_write_pin_field(GPIO_PIN_ALL, (uint32_t)GPIO_HIGH); // pin pull ( 00 : High-Z, 01 : Pull-down, 10 : Pull-up, 11 : Reserved ) syscon_SetPPCR0(QN_SYSCON, 0xAAAA5AAA); // SWD pull-down save 20uA syscon_SetPPCR1(QN_SYSCON, 0x2AAAAAAA); // power down BUCK needed syscon_SetIvrefX32WithMask(QN_SYSCON, SYSCON_MASK_BUCK_BYPASS|SYSCON_MASK_BUCK_DPD, MASK_ENABLE); // power down Flash syscon_SetPGCR2WithMask(QN_SYSCON, SYSCON_MASK_FLASH_VCC_EN, MASK_DISABLE); // enable dbg power down syscon_SetPGCR2WithMask(QN_SYSCON, SYSCON_MASK_DBGPMUENABLE, MASK_ENABLE); // dis sar adc buffer syscon_SetPGCR1WithMask(QN_SYSCON, SYSCON_MASK_DIS_SAR_BUF, MASK_ENABLE); Led_flash(); do { delay(10); } while (gpio_read_pin(GPIO_P14) == GPIO_HIGH); sleep_init(); wakeup_by_sleep_timer(__32K_TYPE); wakeup_by_gpio(GPIO_P15, GPIO_WKUP_BY_LOW); do { gpio_set_direction(GPIO_P01, GPIO_INPUT); //enter_sleep(SLEEP_NORMAL, WAKEUP_BY_GPIO, Led_flash); if (wakeup_from_sleeptimer) { sleep_timer_set(32000); wakeup_from_sleeptimer = 0; #if QN_32K_RCO == TRUE clock_32k_correction_enable(clock_32k_correction_cb); #endif } #if QN_32K_RCO == TRUE if (gpio_sleep_allowed() && !dev_get_bf()) #else if (gpio_sleep_allowed()) #endif enter_sleep(SLEEP_NORMAL, WAKEUP_BY_OSC_EN|WAKEUP_BY_GPIO, Led_flash); } while(1); #endif #if TEST_SLEEP_DEEP == TRUE // -------------------------------------------- // deep sleep wakeup // -------------------------------------------- //set all pin to gpio syscon_SetPMCR0(QN_SYSCON, 0x00000000); syscon_SetPMCR1(QN_SYSCON, 0x00000000); //set all gpio input gpio_set_direction_field(GPIO_PIN_ALL, (uint32_t)GPIO_INPUT); gpio_write_pin_field(GPIO_PIN_ALL, (uint32_t)GPIO_HIGH); // pin pull ( 00 : High-Z, 01 : Pull-down, 10 : Pull-up, 11 : Reserved ) syscon_SetPPCR0(QN_SYSCON, 0xAAAA5AAA); // SWD pull-down save 20uA syscon_SetPPCR1(QN_SYSCON, 0x2AAAAAAA); // power down BUCK needed syscon_SetIvrefX32WithMask(QN_SYSCON, SYSCON_MASK_BUCK_BYPASS|SYSCON_MASK_BUCK_DPD, MASK_ENABLE); // power down Flash syscon_SetPGCR2WithMask(QN_SYSCON, SYSCON_MASK_FLASH_VCC_EN, MASK_DISABLE); // enable dbg power down syscon_SetPGCR2WithMask(QN_SYSCON, SYSCON_MASK_DBGPMUENABLE, MASK_ENABLE); // dis sar adc buffer syscon_SetPGCR1WithMask(QN_SYSCON, SYSCON_MASK_DIS_SAR_BUF, MASK_ENABLE); Led_flash(); do { delay(10); } while (gpio_read_pin(GPIO_P14) == GPIO_HIGH); sleep_init(); do { gpio_set_direction(GPIO_P01, GPIO_INPUT); wakeup_by_gpio(GPIO_P15, GPIO_WKUP_BY_CHANGE); enter_sleep(SLEEP_DEEP, WAKEUP_BY_GPIO, Led_flash); } while(1); #endif #if TEST_SLEEP_CPU_CLK_OFF == TRUE // -------------------------------------------- // clock gating // -------------------------------------------- // Set timer 0 wakeup timer_init(QN_TIMER0, NULL); timer_config(QN_TIMER0, TIMER_PSCAL_DIV, TIMER_COUNT_MS(1000, TIMER_PSCAL_DIV)); timer_enable(QN_TIMER0, MASK_ENABLE); sleep_init(); do { enter_sleep(SLEEP_CPU_CLK_OFF, WAKEUP_BY_TIMER0, NULL); Led_flash(); } while(1); #endif }