Wake-up function using RTC1. This revision, current consumption is around 80uA at deep sleep mode and this is not enough!! I cannot reduce it until today. This is a temporary revision which I need your help.
Dependents: BLE_LoopbackUART_low_pwr_w_RTC1 BLE_Uart_Server
Please refer following notebook.
/users/kenjiArai/notebook/ty51822r3-current-consumption-using-nrf51_wakeup-l/#
nRF51_WakeUp.cpp@1:cc54cd1df555, 2016-06-11 (annotated)
- Committer:
- kenjiArai
- Date:
- Sat Jun 11 00:52:47 2016 +0000
- Revision:
- 1:cc54cd1df555
- Parent:
- 0:f50677171f2d
added power off for peripheral functions
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 0:f50677171f2d | 1 | /* |
kenjiArai | 0:f50677171f2d | 2 | * mbed library program |
kenjiArai | 0:f50677171f2d | 3 | * Wake-Up function only at Sleep mode |
kenjiArai | 0:f50677171f2d | 4 | * |
kenjiArai | 0:f50677171f2d | 5 | * Copyright (c) 2016 Kenji Arai / JH1PJL |
kenjiArai | 0:f50677171f2d | 6 | * http://www.page.sannet.ne.jp/kenjia/index.html |
kenjiArai | 0:f50677171f2d | 7 | * http://mbed.org/users/kenjiArai/ |
kenjiArai | 0:f50677171f2d | 8 | * Created: March 24th, 2016 |
kenjiArai | 1:cc54cd1df555 | 9 | * Revised: June 11th, 2016 |
kenjiArai | 0:f50677171f2d | 10 | * |
kenjiArai | 0:f50677171f2d | 11 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, |
kenjiArai | 0:f50677171f2d | 12 | * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE |
kenjiArai | 0:f50677171f2d | 13 | * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
kenjiArai | 0:f50677171f2d | 14 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
kenjiArai | 0:f50677171f2d | 15 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
kenjiArai | 0:f50677171f2d | 16 | */ |
kenjiArai | 0:f50677171f2d | 17 | |
kenjiArai | 0:f50677171f2d | 18 | #include "nRF51_WakeUp.h" |
kenjiArai | 0:f50677171f2d | 19 | |
kenjiArai | 0:f50677171f2d | 20 | #define MAX_RTC_TASKS_DELAY 47 // Maximum delay until an RTC task is executed |
kenjiArai | 0:f50677171f2d | 21 | |
kenjiArai | 0:f50677171f2d | 22 | nRF51_WakeUp::nRF51_WakeUp(PinName p_trigger, PinName p_interrupt): |
kenjiArai | 0:f50677171f2d | 23 | _pin0(p_trigger), _pin1(p_interrupt), _pin2(p_interrupt) |
kenjiArai | 0:f50677171f2d | 24 | { |
kenjiArai | 0:f50677171f2d | 25 | _pin0 = 0; // Trigger output |
kenjiArai | 0:f50677171f2d | 26 | _pin2.mode(PullDown); // Interrupt |
kenjiArai | 0:f50677171f2d | 27 | p_name_trgr = p_trigger; // keep pin name(number) |
kenjiArai | 0:f50677171f2d | 28 | } |
kenjiArai | 0:f50677171f2d | 29 | |
kenjiArai | 0:f50677171f2d | 30 | void nRF51_WakeUp::set_and_wait(uint32_t t_sec){ |
kenjiArai | 0:f50677171f2d | 31 | //----- Set interrupt condition and calling routine --- |
kenjiArai | 0:f50677171f2d | 32 | _pin1.rise(this, &nRF51_WakeUp::action4restart); |
kenjiArai | 0:f50677171f2d | 33 | //----- Set wakeup timer using RTC1 ------------------- |
kenjiArai | 0:f50677171f2d | 34 | NVIC_ClearPendingIRQ(RTC1_IRQn); |
kenjiArai | 0:f50677171f2d | 35 | NVIC_DisableIRQ(RTC1_IRQn); |
kenjiArai | 0:f50677171f2d | 36 | NRF_RTC1->TASKS_STOP = 1; |
kenjiArai | 0:f50677171f2d | 37 | nrf_delay_us(MAX_RTC_TASKS_DELAY); |
kenjiArai | 0:f50677171f2d | 38 | NRF_RTC1->TASKS_CLEAR = 1; |
kenjiArai | 0:f50677171f2d | 39 | nrf_delay_us(MAX_RTC_TASKS_DELAY); |
kenjiArai | 0:f50677171f2d | 40 | NRF_RTC1->INTENCLR = RTC_INTENSET_COMPARE0_Msk; |
kenjiArai | 0:f50677171f2d | 41 | NRF_RTC1->EVTENCLR = RTC_EVTEN_COMPARE0_Msk; |
kenjiArai | 0:f50677171f2d | 42 | NRF_RTC1->INTENCLR = RTC_INTENSET_OVRFLW_Msk; |
kenjiArai | 0:f50677171f2d | 43 | NRF_RTC1->EVTENCLR = RTC_EVTEN_OVRFLW_Msk; |
kenjiArai | 0:f50677171f2d | 44 | NRF_RTC1->EVENTS_COMPARE[0] = 0; |
kenjiArai | 0:f50677171f2d | 45 | NRF_RTC1->EVTENCLR = 0x000f0003; // all clear |
kenjiArai | 0:f50677171f2d | 46 | NRF_RTC1->EVTENSET = RTC_EVTEN_COMPARE0_Msk; |
kenjiArai | 0:f50677171f2d | 47 | do { |
kenjiArai | 0:f50677171f2d | 48 | NRF_RTC1->PRESCALER = 4095; |
kenjiArai | 0:f50677171f2d | 49 | } while (NRF_RTC1->PRESCALER != 4095); |
kenjiArai | 0:f50677171f2d | 50 | // Set wake-up time |
kenjiArai | 0:f50677171f2d | 51 | NRF_RTC1->CC[0] = t_sec * 8; // 125mS clock -> seconds (1Sec/125mS = 8) |
kenjiArai | 0:f50677171f2d | 52 | //----- Connection RTC1 trigger to Interrupt pin ------ |
kenjiArai | 0:f50677171f2d | 53 | // GPIOE |
kenjiArai | 0:f50677171f2d | 54 | NRF_GPIOTE->CONFIG[0] = |
kenjiArai | 0:f50677171f2d | 55 | (GPIOTE_CONFIG_POLARITY_LoToHi << GPIOTE_CONFIG_POLARITY_Pos) |
kenjiArai | 0:f50677171f2d | 56 | | (p_name_trgr << GPIOTE_CONFIG_PSEL_Pos) |
kenjiArai | 0:f50677171f2d | 57 | | (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos); |
kenjiArai | 0:f50677171f2d | 58 | // Set PPI |
kenjiArai | 0:f50677171f2d | 59 | NRF_PPI->CH[0].EEP = (uint32_t)&NRF_RTC1->EVENTS_COMPARE[0]; |
kenjiArai | 0:f50677171f2d | 60 | NRF_PPI->CH[0].TEP = (uint32_t)&NRF_GPIOTE->TASKS_OUT[0]; |
kenjiArai | 0:f50677171f2d | 61 | // Enable only PPI channels 0 |
kenjiArai | 0:f50677171f2d | 62 | NRF_PPI->CHEN = PPI_CHEN_CH0_Enabled << PPI_CHEN_CH0_Pos; |
kenjiArai | 0:f50677171f2d | 63 | //----- Start RTC1 for next wake-up ------------------- |
kenjiArai | 0:f50677171f2d | 64 | NRF_RTC1->TASKS_START = 1; |
kenjiArai | 0:f50677171f2d | 65 | nrf_delay_us(MAX_RTC_TASKS_DELAY); |
kenjiArai | 0:f50677171f2d | 66 | //----- Goto Deep Sleep mode -------------------------- |
kenjiArai | 1:cc54cd1df555 | 67 | // RADIO |
kenjiArai | 1:cc54cd1df555 | 68 | NRF_RADIO->POWER = 0; |
kenjiArai | 1:cc54cd1df555 | 69 | nrf_delay_us(5); |
kenjiArai | 1:cc54cd1df555 | 70 | // UART |
kenjiArai | 1:cc54cd1df555 | 71 | NRF_UART0->POWER = 0; |
kenjiArai | 1:cc54cd1df555 | 72 | nrf_delay_us(5); |
kenjiArai | 1:cc54cd1df555 | 73 | // I2C |
kenjiArai | 1:cc54cd1df555 | 74 | NRF_TWI1->POWER = 0; |
kenjiArai | 1:cc54cd1df555 | 75 | nrf_delay_us(5); |
kenjiArai | 1:cc54cd1df555 | 76 | // SPI |
kenjiArai | 1:cc54cd1df555 | 77 | NRF_SPI0->POWER = 0; |
kenjiArai | 1:cc54cd1df555 | 78 | nrf_delay_us(5); |
kenjiArai | 1:cc54cd1df555 | 79 | NRF_SPI1->POWER = 0; |
kenjiArai | 1:cc54cd1df555 | 80 | nrf_delay_us(5); |
kenjiArai | 1:cc54cd1df555 | 81 | NRF_SPIS1->POWER = 0; |
kenjiArai | 1:cc54cd1df555 | 82 | nrf_delay_us(5); |
kenjiArai | 1:cc54cd1df555 | 83 | // PWM(Timer0,1,2) |
kenjiArai | 1:cc54cd1df555 | 84 | NRF_TIMER0->POWER = 0; |
kenjiArai | 1:cc54cd1df555 | 85 | nrf_delay_us(5); |
kenjiArai | 1:cc54cd1df555 | 86 | NRF_TIMER1->POWER = 0; |
kenjiArai | 1:cc54cd1df555 | 87 | nrf_delay_us(5); |
kenjiArai | 1:cc54cd1df555 | 88 | NRF_TIMER2->POWER = 0; |
kenjiArai | 1:cc54cd1df555 | 89 | nrf_delay_us(5); |
kenjiArai | 1:cc54cd1df555 | 90 | // PPI (use CH[0]) |
kenjiArai | 1:cc54cd1df555 | 91 | NRF_PPI->TASKS_CHG[1].DIS = 1; |
kenjiArai | 1:cc54cd1df555 | 92 | NRF_PPI->TASKS_CHG[2].DIS = 1; |
kenjiArai | 1:cc54cd1df555 | 93 | NRF_PPI->TASKS_CHG[3].DIS = 1; |
kenjiArai | 1:cc54cd1df555 | 94 | for (uint8_t n = 1; n <16 ; n++){ |
kenjiArai | 1:cc54cd1df555 | 95 | NRF_PPI->CH[n].TEP = 0; |
kenjiArai | 1:cc54cd1df555 | 96 | NRF_PPI->CH[n].EEP = 0; |
kenjiArai | 1:cc54cd1df555 | 97 | } |
kenjiArai | 1:cc54cd1df555 | 98 | // ADC |
kenjiArai | 1:cc54cd1df555 | 99 | NRF_ADC->POWER = 0; |
kenjiArai | 1:cc54cd1df555 | 100 | nrf_delay_us(5); |
kenjiArai | 1:cc54cd1df555 | 101 | // Temperature senosr |
kenjiArai | 1:cc54cd1df555 | 102 | NRF_TEMP->TASKS_STOP = 1; |
kenjiArai | 1:cc54cd1df555 | 103 | nrf_delay_us(5); |
kenjiArai | 1:cc54cd1df555 | 104 | // Others |
kenjiArai | 1:cc54cd1df555 | 105 | NRF_RNG->POWER = 0; |
kenjiArai | 1:cc54cd1df555 | 106 | NRF_ECB->POWER = 0; |
kenjiArai | 1:cc54cd1df555 | 107 | NRF_AAR->POWER = 0; |
kenjiArai | 1:cc54cd1df555 | 108 | NRF_CCM->POWER = 0; |
kenjiArai | 1:cc54cd1df555 | 109 | NRF_WDT->POWER = 0; |
kenjiArai | 1:cc54cd1df555 | 110 | NRF_QDEC->POWER = 0; |
kenjiArai | 1:cc54cd1df555 | 111 | NRF_LPCOMP->POWER = 0; |
kenjiArai | 1:cc54cd1df555 | 112 | // Cock & Power |
kenjiArai | 1:cc54cd1df555 | 113 | NRF_CLOCK->TASKS_HFCLKSTOP = 1; |
kenjiArai | 1:cc54cd1df555 | 114 | NRF_POWER->DCDCEN = 0; |
kenjiArai | 1:cc54cd1df555 | 115 | //sd_power_system_off(); |
kenjiArai | 1:cc54cd1df555 | 116 | //NRF_POWER->SYSTEMOFF = POWER_SYSTEMOFF_SYSTEMOFF_Enter; |
kenjiArai | 0:f50677171f2d | 117 | while(true){ |
kenjiArai | 0:f50677171f2d | 118 | deepsleep(); |
kenjiArai | 0:f50677171f2d | 119 | } |
kenjiArai | 0:f50677171f2d | 120 | } |
kenjiArai | 0:f50677171f2d | 121 | |
kenjiArai | 0:f50677171f2d | 122 | void nRF51_WakeUp::action4restart(void){ |
kenjiArai | 0:f50677171f2d | 123 | NVIC_SystemReset(); |
kenjiArai | 0:f50677171f2d | 124 | deepsleep(); // Not come here (Just in case) |
kenjiArai | 0:f50677171f2d | 125 | } |