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/#

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?

UserRevisionLine numberNew 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 }