Dtynin
Dtynin
DIIDevHeads IoT Integration Server
Created by Dtynin on 7/30/2024 in #pcb-and-analog
Need assistance implementing a low-power mode to extend battery life for the ATmega2560
Hi friends, I need assistance implementing a low-power mode to extend battery life for the ATmega2560 with Zephyr OS, and resolve the issue of failing to wake up from low-power mode? I have been able to configure low-power mode in Zephyr and set up a wake-up source via an external interrupt, yet I still encounter the issue of the microcontroller failing to wake up from low-power mode. Here's the code:
#include <zephyr.h>
#include <device.h>
#include <drivers/gpio.h>
#include <power/power.h>
#include <logging/log.h>

LOG_MODULE_REGISTER(main);

#define WAKEUP_PIN DT_GPIO_PIN(DT_NODELABEL(gpio0), wakeup_pin)

void main(void)
{
const struct device *gpio_dev = device_get_binding(DT_LABEL(DT_NODELABEL(gpio0)));

gpio_pin_configure(gpio_dev, WAKEUP_PIN, GPIO_INPUT | GPIO_INT_EDGE_TO_ACTIVE);
gpio_pin_interrupt_configure(gpio_dev, WAKEUP_PIN, GPIO_INT_EDGE_TO_ACTIVE);

while (1) {
k_sleep(K_SECONDS(10));
sys_pm_force_power_state(SYS_POWER_STATE_DEEP_SLEEP_1);
}
}
#include <zephyr.h>
#include <device.h>
#include <drivers/gpio.h>
#include <power/power.h>
#include <logging/log.h>

LOG_MODULE_REGISTER(main);

#define WAKEUP_PIN DT_GPIO_PIN(DT_NODELABEL(gpio0), wakeup_pin)

void main(void)
{
const struct device *gpio_dev = device_get_binding(DT_LABEL(DT_NODELABEL(gpio0)));

gpio_pin_configure(gpio_dev, WAKEUP_PIN, GPIO_INPUT | GPIO_INT_EDGE_TO_ACTIVE);
gpio_pin_interrupt_configure(gpio_dev, WAKEUP_PIN, GPIO_INT_EDGE_TO_ACTIVE);

while (1) {
k_sleep(K_SECONDS(10));
sys_pm_force_power_state(SYS_POWER_STATE_DEEP_SLEEP_1);
}
}
If the implementation is successful, the microcontroller should wake up from low power mode when an external interrupt is triggered, and log messages before and after sleep to indicate proper functioning.
3 replies