mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Mon Jul 06 09:15:09 2015 +0100
Revision:
583:967d0d8b7aed
Parent:
536:c48d7048ab6e
Synchronized with git revision 0a7df4e114501712e80882fb66c8a1e1ffca2dcb

Full URL: https://github.com/mbedmicro/mbed/commit/0a7df4e114501712e80882fb66c8a1e1ffca2dcb/

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 507:d4fc7603a669 1 /*******************************************************************************
mbed_official 507:d4fc7603a669 2 * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved.
mbed_official 507:d4fc7603a669 3 *
mbed_official 507:d4fc7603a669 4 * Permission is hereby granted, free of charge, to any person obtaining a
mbed_official 507:d4fc7603a669 5 * copy of this software and associated documentation files (the "Software"),
mbed_official 507:d4fc7603a669 6 * to deal in the Software without restriction, including without limitation
mbed_official 507:d4fc7603a669 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
mbed_official 507:d4fc7603a669 8 * and/or sell copies of the Software, and to permit persons to whom the
mbed_official 507:d4fc7603a669 9 * Software is furnished to do so, subject to the following conditions:
mbed_official 507:d4fc7603a669 10 *
mbed_official 507:d4fc7603a669 11 * The above copyright notice and this permission notice shall be included
mbed_official 507:d4fc7603a669 12 * in all copies or substantial portions of the Software.
mbed_official 507:d4fc7603a669 13 *
mbed_official 507:d4fc7603a669 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
mbed_official 507:d4fc7603a669 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
mbed_official 507:d4fc7603a669 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
mbed_official 507:d4fc7603a669 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
mbed_official 507:d4fc7603a669 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
mbed_official 507:d4fc7603a669 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
mbed_official 507:d4fc7603a669 20 * OTHER DEALINGS IN THE SOFTWARE.
mbed_official 507:d4fc7603a669 21 *
mbed_official 507:d4fc7603a669 22 * Except as contained in this notice, the name of Maxim Integrated
mbed_official 507:d4fc7603a669 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
mbed_official 507:d4fc7603a669 24 * Products, Inc. Branding Policy.
mbed_official 507:d4fc7603a669 25 *
mbed_official 507:d4fc7603a669 26 * The mere transfer of this software does not imply any licenses
mbed_official 507:d4fc7603a669 27 * of trade secrets, proprietary technology, copyrights, patents,
mbed_official 507:d4fc7603a669 28 * trademarks, maskwork rights, or any other form of intellectual
mbed_official 507:d4fc7603a669 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
mbed_official 507:d4fc7603a669 30 * ownership rights.
mbed_official 507:d4fc7603a669 31 *******************************************************************************
mbed_official 507:d4fc7603a669 32 */
mbed_official 536:c48d7048ab6e 33
mbed_official 507:d4fc7603a669 34 #include "sleep_api.h"
mbed_official 507:d4fc7603a669 35 #include "cmsis.h"
mbed_official 507:d4fc7603a669 36 #include "pwrman_regs.h"
mbed_official 507:d4fc7603a669 37 #include "pwrseq_regs.h"
mbed_official 507:d4fc7603a669 38 #include "ioman_regs.h"
mbed_official 507:d4fc7603a669 39 #include "rtc_regs.h"
mbed_official 507:d4fc7603a669 40
mbed_official 507:d4fc7603a669 41 static mxc_uart_regs_t *stdio_uart = (mxc_uart_regs_t*)STDIO_UART;
mbed_official 507:d4fc7603a669 42
mbed_official 507:d4fc7603a669 43 // Normal wait mode
mbed_official 507:d4fc7603a669 44 void sleep(void)
mbed_official 507:d4fc7603a669 45 {
mbed_official 507:d4fc7603a669 46 // Normal sleep mode for ARM core
mbed_official 507:d4fc7603a669 47 SCB->SCR = 0;
mbed_official 507:d4fc7603a669 48
mbed_official 507:d4fc7603a669 49 __DSB();
mbed_official 507:d4fc7603a669 50 __WFI();
mbed_official 507:d4fc7603a669 51 }
mbed_official 507:d4fc7603a669 52
mbed_official 507:d4fc7603a669 53 // Work-around for issue of clearing power sequencer I/O flag
mbed_official 507:d4fc7603a669 54 static void clearAllGPIOWUD(void)
mbed_official 507:d4fc7603a669 55 {
mbed_official 507:d4fc7603a669 56 uint32_t wud_req0 = MXC_IOMAN->wud_req0;
mbed_official 507:d4fc7603a669 57 uint32_t wud_req1 = MXC_IOMAN->wud_req1;
mbed_official 507:d4fc7603a669 58
mbed_official 507:d4fc7603a669 59 // I/O must be a wakeup detect to clear
mbed_official 507:d4fc7603a669 60 MXC_IOMAN->wud_req0 = 0xffffffff;
mbed_official 507:d4fc7603a669 61 MXC_IOMAN->wud_req1 = 0xffffffff;
mbed_official 507:d4fc7603a669 62
mbed_official 507:d4fc7603a669 63 // Clear all WUDs
mbed_official 507:d4fc7603a669 64 MXC_PWRMAN->wud_ctrl = (MXC_E_PWRMAN_PAD_MODE_CLEAR_SET << MXC_F_PWRMAN_WUD_CTRL_PAD_MODE_POS) | MXC_F_PWRMAN_WUD_CTRL_CLEAR_ALL;
mbed_official 507:d4fc7603a669 65 MXC_PWRMAN->wud_pulse0 = 1;
mbed_official 507:d4fc7603a669 66
mbed_official 507:d4fc7603a669 67 // Restore WUD requests
mbed_official 507:d4fc7603a669 68 MXC_IOMAN->wud_req0 = wud_req0;
mbed_official 507:d4fc7603a669 69 MXC_IOMAN->wud_req1 = wud_req1;
mbed_official 507:d4fc7603a669 70 }
mbed_official 507:d4fc7603a669 71
mbed_official 507:d4fc7603a669 72 // Low-power stop mode
mbed_official 507:d4fc7603a669 73 void deepsleep(void)
mbed_official 507:d4fc7603a669 74 {
mbed_official 507:d4fc7603a669 75 __disable_irq();
mbed_official 507:d4fc7603a669 76
mbed_official 507:d4fc7603a669 77 // Wait for all STDIO characters to be sent. The UART clock will stop.
mbed_official 507:d4fc7603a669 78 while (stdio_uart->status & MXC_F_UART_STATUS_TX_BUSY);
mbed_official 507:d4fc7603a669 79
mbed_official 507:d4fc7603a669 80 // Prepare for LP1
mbed_official 507:d4fc7603a669 81 uint32_t reg0 = MXC_PWRSEQ->reg0;
mbed_official 507:d4fc7603a669 82 reg0 &= ~MXC_F_PWRSEQ_REG0_PWR_SVM3EN_SLP; // disable VDD3 SVM during sleep mode
mbed_official 507:d4fc7603a669 83 reg0 &= ~MXC_F_PWRSEQ_REG0_PWR_SVM1EN_SLP; // disable VREG18 SVM during sleep mode
mbed_official 507:d4fc7603a669 84 if (reg0 & MXC_F_PWRSEQ_REG0_PWR_RTCEN_RUN) { // if real-time clock enabled during run
mbed_official 507:d4fc7603a669 85 reg0 |= MXC_F_PWRSEQ_REG0_PWR_RTCEN_SLP; // enable real-time clock during sleep mode
mbed_official 507:d4fc7603a669 86 } else {
mbed_official 507:d4fc7603a669 87 reg0 &= ~MXC_F_PWRSEQ_REG0_PWR_RTCEN_SLP; // disable real-time clock during sleep mode
mbed_official 507:d4fc7603a669 88 }
mbed_official 507:d4fc7603a669 89 reg0 |= MXC_F_PWRSEQ_REG0_PWR_CHZYEN_SLP; // enable CHZY regulator during sleep mode
mbed_official 507:d4fc7603a669 90 reg0 |= MXC_F_PWRSEQ_REG0_PWR_LP1; // go into LP1
mbed_official 507:d4fc7603a669 91 reg0 &= ~MXC_F_PWRSEQ_REG0_PWR_FIRST_BOOT; // clear first boot flag
mbed_official 507:d4fc7603a669 92 MXC_PWRSEQ->reg0 = reg0;
mbed_official 507:d4fc7603a669 93
mbed_official 507:d4fc7603a669 94 MXC_PWRSEQ->reg3 = (MXC_PWRSEQ->reg3 & ~MXC_F_PWRSEQ_REG3_PWR_ROSEL_QUICK) | (3 << MXC_F_PWRSEQ_REG3_PWR_ROSEL_QUICK_POS);
mbed_official 507:d4fc7603a669 95
mbed_official 507:d4fc7603a669 96 // Deep sleep for ARM core
mbed_official 507:d4fc7603a669 97 SCB->SCR = SCB_SCR_SLEEPDEEP_Msk;
mbed_official 507:d4fc7603a669 98
mbed_official 507:d4fc7603a669 99 // clear latches for wakeup detect
mbed_official 507:d4fc7603a669 100 MXC_PWRSEQ->flags = MXC_PWRSEQ->flags;
mbed_official 507:d4fc7603a669 101 if (MXC_PWRSEQ->flags & MXC_F_PWRSEQ_FLAGS_PWR_IO_WAKEUP) {
mbed_official 507:d4fc7603a669 102 // attempt work-around for I/O flag clearing issue
mbed_official 507:d4fc7603a669 103 clearAllGPIOWUD();
mbed_official 507:d4fc7603a669 104 MXC_PWRSEQ->flags = MXC_F_PWRSEQ_FLAGS_PWR_IO_WAKEUP;
mbed_official 507:d4fc7603a669 105 }
mbed_official 507:d4fc7603a669 106
mbed_official 507:d4fc7603a669 107 // Wait for pending RTC transaction
mbed_official 507:d4fc7603a669 108 while (MXC_RTCTMR->ctrl & MXC_F_RTC_CTRL_PENDING);
mbed_official 507:d4fc7603a669 109
mbed_official 507:d4fc7603a669 110 // Ensure that the event register is clear
mbed_official 507:d4fc7603a669 111 __SEV(); // set event
mbed_official 507:d4fc7603a669 112 __WFE(); // clear event
mbed_official 507:d4fc7603a669 113
mbed_official 507:d4fc7603a669 114 // Enter LP1
mbed_official 507:d4fc7603a669 115 __WFE();
mbed_official 507:d4fc7603a669 116 // Woke up from LP1
mbed_official 507:d4fc7603a669 117
mbed_official 507:d4fc7603a669 118 // The RTC timer does not update until the next tick
mbed_official 536:c48d7048ab6e 119 uint32_t temp = MXC_RTCTMR->timer;
mbed_official 536:c48d7048ab6e 120 while (MXC_RTCTMR->timer == temp);
mbed_official 507:d4fc7603a669 121
mbed_official 507:d4fc7603a669 122 __enable_irq();
mbed_official 507:d4fc7603a669 123 }