
This reduces current consumption from 500-1000µA to very low (<10µA) current consumption. This change is important for battery powered devices, especially devices that may be running for long periods of time.
40 строки
1,1 КиБ
Go
40 строки
1,1 КиБ
Go
// +build nrf,softdevice
|
|
|
|
package runtime
|
|
|
|
import (
|
|
"device/arm"
|
|
"device/nrf"
|
|
)
|
|
|
|
//export sd_app_evt_wait
|
|
func sd_app_evt_wait()
|
|
|
|
func waitForEvents() {
|
|
// Call into the SoftDevice to sleep. This is necessary here because a
|
|
// normal wfe will not put the chip in low power mode (it still consumes
|
|
// 500µA-1mA). It is really needed to call sd_app_evt_wait for low power
|
|
// consumption.
|
|
|
|
// First check whether the SoftDevice is enabled. Unfortunately,
|
|
// sd_app_evt_wait cannot be called when the SoftDevice is not enabled.
|
|
var enabled uint8
|
|
arm.SVCall1(0x12, &enabled) // sd_softdevice_is_enabled
|
|
|
|
if enabled != 0 {
|
|
// Now pick the appropriate SVCall number. Hopefully they won't change
|
|
// in the future with a different SoftDevice version.
|
|
if nrf.DEVICE == "nrf51" {
|
|
// sd_app_evt_wait: SOC_SVC_BASE_NOT_AVAILABLE + 29
|
|
arm.SVCall0(0x2B + 29)
|
|
} else if nrf.DEVICE == "nrf52" || nrf.DEVICE == "nrf52840" {
|
|
// sd_app_evt_wait: SOC_SVC_BASE_NOT_AVAILABLE + 21
|
|
arm.SVCall0(0x2C + 21)
|
|
} else {
|
|
sd_app_evt_wait()
|
|
}
|
|
} else {
|
|
// SoftDevice is disabled so we can sleep normally.
|
|
arm.Asm("wfe")
|
|
}
|
|
}
|