mirror of
https://github.com/arduino-libraries/ArduinoLowPower.git
synced 2025-04-19 11:42:14 +03:00
Remove support for ArduinoCore-Primo. (#55)
The board is retired and the corresponding core (https://github.com/arduino/ArduinoCore-primo) has been archived. Considering that no one is going to maintain the low power code for nRF52/Primo its better to get rid of it alltogether (and no longer advertise compatibility to 'nrf52' which - imho rightfully - seems to confuse a lot of people.
This commit is contained in:
parent
7fc3c446da
commit
b615a89714
5
.github/workflows/compile-examples.yml
vendored
5
.github/workflows/compile-examples.yml
vendored
@ -69,11 +69,6 @@ jobs:
|
||||
- name: arduino:samd
|
||||
sketch-paths: |
|
||||
- examples/TianStandby
|
||||
- fqbn: arduino:nrf52:primo
|
||||
platforms: |
|
||||
- name: arduino:nrf52
|
||||
sketch-paths: |
|
||||
- examples/PrimoDeepSleep
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
|
@ -1,92 +0,0 @@
|
||||
/*
|
||||
PrimoDeepSleep.ino
|
||||
|
||||
Written by Chiara Ruggeri (chiara@arduino.org)
|
||||
|
||||
This example for the Arduino Primo board shows how to use
|
||||
Arduino Low Power library to enter in power off mode and save power.
|
||||
This mode ensures the deepest power saving mode. If you need
|
||||
a faster response from the board use standby function instead.
|
||||
|
||||
Please note that once exited from the deepest sleep mode the
|
||||
board will reset (so setup will be run again).
|
||||
|
||||
The functions enableWakeupFrom set the peripheral that will wake up
|
||||
the board. By calling it more than once you can choose multiple
|
||||
wakeup sources.
|
||||
The board will be reset when it wakes up from power off.
|
||||
You can use wakeUpCause() function to find out what signals woke up
|
||||
the board if you use more than one wakeUpBy.. function.
|
||||
|
||||
This example code is in the public domain.
|
||||
*/
|
||||
|
||||
#include "ArduinoLowPower.h"
|
||||
|
||||
|
||||
// Pin used to wakeup the board
|
||||
const int digitalPin = 10;
|
||||
|
||||
// Pin used in Comparator module to wake up the board
|
||||
const int analogPin = A0;
|
||||
|
||||
|
||||
void StmEspPM(bool sleep){
|
||||
// enable USER1_BUTTON to turn STM32 off and on when pressed.
|
||||
// note that when STM32 is off you cannot load any new sketch.
|
||||
pinMode(USER1_BUTTON, STM32_IT);
|
||||
|
||||
// turn ESP8266 off or on
|
||||
digitalWrite(GPIO_ESP_PW, sleep ? LOW: HIGH);
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
pinMode(LED_BUILTIN, OUTPUT);
|
||||
digitalWrite(LED_BUILTIN, HIGH);
|
||||
delay(500);
|
||||
digitalWrite(LED_BUILTIN, LOW);
|
||||
delay(500);
|
||||
|
||||
//look for what peripheral woke up the board
|
||||
//reason is 0 at the first execution
|
||||
wakeup_reason reason=LowPower.wakeupReason();
|
||||
if(reason==GPIO_WAKEUP) //GPIO caused the wake up
|
||||
doMyStuff();
|
||||
else
|
||||
if(reason==NFC_WAKEUP) //NFC caused the wake up
|
||||
doMyStuffWithNFC();
|
||||
else
|
||||
if(reason==ANALOG_COMPARATOR_WAKEUP) //Comparator caused the wake up
|
||||
doOtherStuff();
|
||||
|
||||
Serial.println("Hi all, I return to sleep");
|
||||
|
||||
LowPower.companionLowPowerCallback(StmEspPM);
|
||||
// Send sleep command to ESP and enable USER1_BUTTON to turn STM off
|
||||
LowPower.companionSleep();
|
||||
|
||||
//set digital pin 10 to wake up the board when LOW level is detected
|
||||
LowPower.enableWakeupFrom(GPIO_WAKEUP, digitalPin, LOW);
|
||||
//let the board be woken up by any NFC field
|
||||
LowPower.enableWakeupFrom(NFC_WAKEUP);
|
||||
//wake up the board when the voltage on pin A0 goes below the voltage on pin AREF
|
||||
LowPower.enableWakeupFrom(ANALOG_COMPARATOR_WAKEUP, analogPin, AREF, UP);
|
||||
//go in low power mode. Note that the board will reset once it is woken up
|
||||
LowPower.deepSleep();
|
||||
}
|
||||
|
||||
|
||||
void loop() {}
|
||||
|
||||
void doMyStuff(){
|
||||
//insert your code here
|
||||
}
|
||||
|
||||
void doMyStuffWithNFC(){
|
||||
//insert your code here
|
||||
}
|
||||
|
||||
void doOtherStuff(){
|
||||
//insert your code here
|
||||
}
|
@ -6,5 +6,5 @@ sentence=Power save primitives features for SAMD and nRF52 32bit boards
|
||||
paragraph=With this library you can manage the low power states of newer Arduino boards
|
||||
category=Device Control
|
||||
url=https://www.arduino.cc/libraries/ArduinoLowPower
|
||||
architectures=samd,nrf52
|
||||
architectures=samd
|
||||
depends=RTCZero
|
||||
|
@ -1,178 +0,0 @@
|
||||
/*
|
||||
ArduinoLowPower class for nRF52.
|
||||
|
||||
Written by Chiara Ruggeri (chiara@arduino.org)
|
||||
|
||||
Copyright (c) 2017 Arduino AG. All right reserved.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#if defined(ARDUINO_ARCH_NRF52)
|
||||
|
||||
#include "ArduinoLowPower.h"
|
||||
#include "WInterrupts.h"
|
||||
#include "nrf_rtc.h"
|
||||
|
||||
volatile bool event = false;
|
||||
void (*functionPointer)(void);
|
||||
nrf_lpcomp_input_t aPin[]={NRF_LPCOMP_INPUT_1, NRF_LPCOMP_INPUT_2, NRF_LPCOMP_INPUT_4, NRF_LPCOMP_INPUT_5, NRF_LPCOMP_INPUT_6, NRF_LPCOMP_INPUT_7};
|
||||
|
||||
void wakeUpGpio(){
|
||||
event = true;
|
||||
if(functionPointer)
|
||||
functionPointer();
|
||||
}
|
||||
|
||||
void ArduinoLowPowerClass::idle() {
|
||||
// nRF52 has just two low power modes. Call sleep if idle is called.
|
||||
sleep();
|
||||
}
|
||||
|
||||
void ArduinoLowPowerClass::idle(uint32_t millis) {
|
||||
setAlarmIn(millis);
|
||||
idle();
|
||||
}
|
||||
|
||||
void ArduinoLowPowerClass::sleep() {
|
||||
sd_power_mode_set(NRF_POWER_MODE_LOWPWR);
|
||||
event=false;
|
||||
while(!event){
|
||||
sd_app_evt_wait();
|
||||
}
|
||||
}
|
||||
|
||||
void ArduinoLowPowerClass::sleep(uint32_t millis) {
|
||||
setAlarmIn(millis);
|
||||
sleep();
|
||||
}
|
||||
|
||||
void ArduinoLowPowerClass::deepSleep() {
|
||||
//Enter in systemOff mode only when no EasyDMA transfer is active
|
||||
//this is achieved by disabling all peripheral that use it
|
||||
NRF_UARTE0->ENABLE = UARTE_ENABLE_ENABLE_Disabled; //disable UART
|
||||
NRF_SAADC ->ENABLE = (SAADC_ENABLE_ENABLE_Disabled << SAADC_ENABLE_ENABLE_Pos); //disable ADC
|
||||
NRF_PWM0 ->ENABLE = (PWM_ENABLE_ENABLE_Disabled << PWM_ENABLE_ENABLE_Pos); //disable all PWM instances
|
||||
NRF_PWM1 ->ENABLE = (PWM_ENABLE_ENABLE_Disabled << PWM_ENABLE_ENABLE_Pos);
|
||||
NRF_PWM2 ->ENABLE = (PWM_ENABLE_ENABLE_Disabled << PWM_ENABLE_ENABLE_Pos);
|
||||
NRF_TWIM1 ->ENABLE = (TWIM_ENABLE_ENABLE_Disabled << TWIM_ENABLE_ENABLE_Pos); //disable TWI Master
|
||||
NRF_TWIS1 ->ENABLE = (TWIS_ENABLE_ENABLE_Disabled << TWIS_ENABLE_ENABLE_Pos); //disable TWI Slave
|
||||
|
||||
//Enter in System OFF mode
|
||||
sd_power_system_off();
|
||||
|
||||
/*Only for debugging purpose, will not be reached without connected debugger*/
|
||||
while(1);
|
||||
}
|
||||
|
||||
void ArduinoLowPowerClass::setAlarmIn(uint32_t millis) {
|
||||
nrf_rtc_prescaler_set(NRF_RTC1, 32);
|
||||
//enable interrupt
|
||||
NVIC_SetPriority(RTC1_IRQn, 2); //high priority
|
||||
NVIC_ClearPendingIRQ(RTC1_IRQn);
|
||||
NVIC_EnableIRQ(RTC1_IRQn);
|
||||
nrf_rtc_event_clear(NRF_RTC1, NRF_RTC_EVENT_COMPARE_0);
|
||||
nrf_rtc_int_enable(NRF_RTC1, NRF_RTC_INT_COMPARE0_MASK);
|
||||
//Tick every 1 ms
|
||||
nrf_rtc_cc_set(NRF_RTC1, 0, millis);
|
||||
|
||||
//start RTC
|
||||
nrf_rtc_task_trigger(NRF_RTC1, NRF_RTC_TASK_START);
|
||||
}
|
||||
|
||||
void ArduinoLowPowerClass::attachInterruptWakeup(uint32_t pin, voidFuncPtr callback, uint32_t mode) {
|
||||
functionPointer = callback;
|
||||
|
||||
if(pin == RTC_ALARM_WAKEUP)
|
||||
return;
|
||||
|
||||
pinMode(pin, INPUT_PULLUP);
|
||||
attachInterrupt(pin, wakeUpGpio, mode);
|
||||
}
|
||||
|
||||
void ArduinoLowPowerClass::enableWakeupFrom(wakeup_reason peripheral, uint32_t pin, uint32_t event, uint32_t option){
|
||||
if(peripheral == NFC_WAKEUP){
|
||||
NRF_NFCT->TASKS_SENSE=1;
|
||||
return;
|
||||
}
|
||||
if(peripheral == ANALOG_COMPARATOR_WAKEUP){
|
||||
detect_mode mode;
|
||||
if(option == DOWN)
|
||||
mode = DOWN;
|
||||
else if(option == UP)
|
||||
mode = UP;
|
||||
else
|
||||
mode = CROSS;
|
||||
nrf_lpcomp_config_t config={(nrf_lpcomp_ref_t)event, (nrf_lpcomp_detect_t)mode};
|
||||
nrf_lpcomp_configure(&config);
|
||||
if(pin<14 && pin>19)
|
||||
return; //no analog pin was chosen
|
||||
nrf_lpcomp_input_select(aPin[pin-14]);
|
||||
nrf_lpcomp_enable();
|
||||
nrf_lpcomp_task_trigger(NRF_LPCOMP_TASK_START);
|
||||
while(!nrf_lpcomp_event_check(NRF_LPCOMP_EVENT_READY));
|
||||
return;
|
||||
}
|
||||
if(peripheral == GPIO_WAKEUP){
|
||||
if(pin > 20)// allow wake up only from digital and analog pins
|
||||
return;
|
||||
if(event==LOW)
|
||||
nrf_gpio_cfg_sense_input(g_APinDescription[pin].ulPin, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_LOW);
|
||||
else
|
||||
nrf_gpio_cfg_sense_input(g_APinDescription[pin].ulPin, NRF_GPIO_PIN_PULLDOWN, NRF_GPIO_PIN_SENSE_HIGH);
|
||||
}
|
||||
}
|
||||
|
||||
wakeup_reason ArduinoLowPowerClass::wakeupReason(){
|
||||
uint32_t guilty;
|
||||
sd_power_reset_reason_get(&guilty);
|
||||
if(guilty & 0x10000){ // GPIO
|
||||
//RESETREAS is a cumulative register. We need to clear it by writing 1 in the relative field
|
||||
sd_power_reset_reason_clr(1 << 16);
|
||||
return GPIO_WAKEUP;
|
||||
}
|
||||
if(guilty & 0x80000){ //NFC
|
||||
sd_power_reset_reason_clr(1 << 19);
|
||||
return NFC_WAKEUP;
|
||||
}
|
||||
if(guilty & 0x20000){ //COMP
|
||||
sd_power_reset_reason_clr(1 << 17);
|
||||
return ANALOG_COMPARATOR_WAKEUP;
|
||||
}
|
||||
return OTHER_WAKEUP;
|
||||
}
|
||||
|
||||
|
||||
ArduinoLowPowerClass LowPower;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"{
|
||||
#endif
|
||||
|
||||
void RTC1_IRQHandler(void)
|
||||
{
|
||||
event=true;
|
||||
nrf_rtc_event_clear(NRF_RTC1, NRF_RTC_EVENT_COMPARE_0);
|
||||
nrf_rtc_task_trigger(NRF_RTC1, NRF_RTC_TASK_CLEAR);
|
||||
nrf_rtc_task_trigger(NRF_RTC1, NRF_RTC_TASK_STOP);
|
||||
if(functionPointer)
|
||||
functionPointer();
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // ARDUINO_ARCH_NRF52
|
Loading…
x
Reference in New Issue
Block a user