//***************************************************************************** // //! @file deepsleep.c //! //! @brief Example demonstrating how to enter deepsleep. //! //! This example configures the device to go into a deep sleep mode. Once in //! sleep mode the device has no ability to wake up. This example is merely to //! provide the opportunity to measure deepsleep current without interrupts //! interfering with the measurement. //! //! The example begins by printing out a banner annoucement message through //! the UART, which is then completely disabled for the remainder of execution. //! //! Text is output to the UART at 115,200 BAUD, 8 bit, no parity. //! Please note that text end-of-line is a newline (LF) character only. //! Therefore, the UART terminal must be set to simulate a CR/LF. // //***************************************************************************** //***************************************************************************** // // Copyright (c) 2020, Ambiq Micro // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. Neither the name of the copyright holder nor the names of its // contributors may be used to endorse or promote products derived from this // software without specific prior written permission. // // Third party software included in this distribution is subject to the // additional license terms as defined in the /docs/licenses directory. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // // This is part of revision 2.4.2 of the AmbiqSuite Development Package. // //***************************************************************************** #include "am_mcu_apollo.h" #include "am_bsp.h" #include "am_util.h" //***************************************************************************** // // UART configuration settings. // //***************************************************************************** am_hal_uart_config_t g_sUartConfig = { .ui32BaudRate = 115200, .ui32DataBits = AM_HAL_UART_DATA_BITS_8, .bTwoStopBits = false, .ui32Parity = AM_HAL_UART_PARITY_NONE, .ui32FlowCtrl = AM_HAL_UART_FLOW_CTRL_NONE, }; //***************************************************************************** // // Initialize the UART // //***************************************************************************** void uart_init(uint32_t ui32UartModule) { // // Make sure the UART RX and TX pins are enabled. // am_bsp_pin_enable(COM_UART_TX); am_bsp_pin_enable(COM_UART_RX); // // Power on the selected UART // am_hal_uart_pwrctrl_enable(ui32UartModule); // // Start the UART interface, apply the desired configuration settings, and // enable the FIFOs. // am_hal_uart_clock_enable(ui32UartModule); // // Disable the UART before configuring it. // am_hal_uart_disable(ui32UartModule); // // Configure the UART. // am_hal_uart_config(ui32UartModule, &g_sUartConfig); // // Enable the UART FIFO. // am_hal_uart_fifo_config(ui32UartModule, AM_HAL_UART_TX_FIFO_1_2 | AM_HAL_UART_RX_FIFO_1_2); // // Enable the UART. // am_hal_uart_enable(ui32UartModule); } //***************************************************************************** // // Disable the UART // //***************************************************************************** void uart_disable(uint32_t ui32UartModule) { // // Before disabling the UART, wait a little time to be sure all // printing has completed. // am_util_delay_ms(10); // // Disable and power down the UART. // am_hal_uart_disable(ui32UartModule); am_hal_uart_pwrctrl_disable(ui32UartModule); // // Turn off UART clock. // Note - this is automatically handled in hardware on Apollo2. // am_hal_uart_clock_disable(ui32UartModule); // // Disable the UART pins. // am_bsp_pin_disable(COM_UART_TX); am_bsp_pin_disable(COM_UART_RX); } //***************************************************************************** // // Main function. // //***************************************************************************** int main(void) { // // Set the clock frequency. // am_hal_clkgen_sysclk_select(AM_HAL_CLKGEN_SYSCLK_MAX); // // Set the default cache configuration // am_hal_cachectrl_enable(&am_hal_cachectrl_defaults); // // Configure the board for low power operation. // am_bsp_low_power_init(); // // Initialize the printf interface for UART output. // am_util_stdio_printf_init((am_util_stdio_print_char_t)am_bsp_uart_string_print); // // Initialize the UART // uart_init(AM_BSP_UART_PRINT_INST); // // Print the banner. // am_util_stdio_terminal_clear(); am_util_stdio_printf("Deepsleep Example\n"); // // To minimize power during the run, disable the UART. // uart_disable(AM_BSP_UART_PRINT_INST); // // Configure the board for low power. // am_bsp_low_power_init(); #ifdef AM_PART_APOLLO // // Power down all SRAM banks. // am_hal_mcuctrl_sram_power_set(AM_HAL_MCUCTRL_SRAM_POWER_DOWN_ALL, AM_HAL_MCUCTRL_SRAM_POWER_DOWN_ALL); #endif // AM_PART_APOLLO #ifdef AM_PART_APOLLO2 // // Turn OFF Flash1 // AM_BFW(PWRCTRL, MEMEN, FLASH1, 0); while (AM_BFR(PWRCTRL, PWRONSTATUS, PD_FLAM1) != 0) {} // // Power down SRAM // AM_BFWe(PWRCTRL, SRAMPWDINSLEEP, SRAMSLEEPPOWERDOWN, ALLBUTLOWER8K); #endif // AM_PART_APOLLO2 while (1) { // // Go to Deep Sleep and stay there. // am_hal_sysctrl_sleep(AM_HAL_SYSCTRL_SLEEP_DEEP); } }