235 lines
6.8 KiB
C
235 lines
6.8 KiB
C
|
|
//*****************************************************************************
|
||
|
|
//
|
||
|
|
//! @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);
|
||
|
|
}
|
||
|
|
}
|