mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-05 03:27:48 +00:00
9d625a1ccb
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.
41 lines
1.1 KiB
Go
41 lines
1.1 KiB
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")
|
|
}
|
|
}
|