2024-10-02 11:08 PM
Using STM32G0 with zephyr on a board that has motion sensor, flow sensor, Quectel BG770 modem and Quectel FC41D modem. Modem power is controlled by the switch which is being turned off for sleep and various other peripherals are also being disabled but the power consumption won't fall below 950uA. This is my first project using SMT32 on zephyr so I am no expert and need help!
void enterLowPowerMode(void)
{
int err = 0;
//TODO - implement low power mode
// modem_disconnect();
modem_onOff(false);
wifi_powerOnOff(false);
GXHT3x_LowPower();
// err = pm_device_action_run(motionI2c, PM_DEVICE_ACTION_SUSPEND);
// err = pm_device_action_run(tempI2c, PM_DEVICE_ACTION_SUSPEND);
//I2C pins have external 47K pull ups
err = gpio_pin_configure(wifi_gpioa_dev, 10, GPIO_DISCONNECTED); //i2c sda
err = gpio_pin_configure(wifi_gpioa_dev, 9, GPIO_DISCONNECTED); //i2c scl
// err = gpio_pin_configure(wifi_gpioa_dev, 10, GPIO_INPUT | GPIO_PULL_UP); //i2c sda
// err = gpio_pin_configure(wifi_gpioa_dev, 9, GPIO_INPUT | GPIO_PULL_UP); //i2c scl
err = gpio_pin_configure(wifi_gpioa_dev, 6, GPIO_DISCONNECTED); //spi miso
err = gpio_pin_configure(wifi_gpioa_dev, 5, GPIO_DISCONNECTED); //spi sclk
err = gpio_pin_configure(modem_gpiob_dev, 5, GPIO_DISCONNECTED); //spi mosi
err = gpio_pin_configure(modem_gpiob_dev, 4, GPIO_DISCONNECTED); //spi ce
//When these blank pins are configured as PULL_DOWN, the current consumption increases to 1.6mA
//setting them to PULL_UP reduces the current to 0.950 uA
err = gpio_pin_configure(modem_gpiob_dev, 1, GPIO_INPUT | GPIO_PULL_UP); //blank
err = gpio_pin_configure(modem_gpiob_dev, 3, GPIO_INPUT | GPIO_PULL_UP); //blank
err = gpio_pin_configure(modem_gpiob_dev, 8, GPIO_INPUT | GPIO_PULL_UP); //blank
err = gpio_pin_configure(modem_gpiob_dev, 9, GPIO_INPUT | GPIO_PULL_UP); //blank
err = gpio_pin_configure(modem_gpiob_dev, 10, GPIO_INPUT | GPIO_PULL_UP); //blank
err = gpio_pin_configure(modem_gpiob_dev, 15, GPIO_INPUT | GPIO_PULL_UP); //blank
err = gpio_pin_configure(wifi_gpioa_dev, 4, GPIO_INPUT | GPIO_PULL_UP); //blank
err = gpio_pin_configure(gpioc_dev, 6, GPIO_INPUT | GPIO_PULL_UP); //blank
err = gpio_pin_configure(gpioc_dev, 7, GPIO_INPUT | GPIO_PULL_UP); //blank
err = gpio_pin_configure(gpioc_dev, 13, GPIO_INPUT | GPIO_PULL_UP); //blank
// GPIO_InitTypeDef GPIO_InitStruct = {0};
// GPIO_InitStruct.Pin = B1_Pin;
// GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
// GPIO_InitStruct.Pull = GPIO_NOPULL;
adc_sleep();
// sensorI2C_sleep();
err = gpio_pin_configure(modem_gpiob_dev, 11, GPIO_DISCONNECTED); //red led
// err = gpio_pin_configure(gpiod_dev, 0, GPIO_INPUT | GPIO_PULL_UP); //acc int 2
modem_uartSleep();
wifi_uartSleep();
user_uartSleep();
err = gpio_pin_configure(wifi_gpioa_dev, 3, GPIO_DISCONNECTED); //user uart tx
err = gpio_pin_configure(wifi_gpioa_dev, 2, GPIO_DISCONNECTED); //user uart rx
err = gpio_pin_configure(modem_gpiob_dev, 6, GPIO_DISCONNECTED); //modem tx
err = gpio_pin_configure(modem_gpiob_dev, 7, GPIO_DISCONNECTED); //modem Rx
err = gpio_pin_configure(modem_gpiob_dev, 13, GPIO_DISCONNECTED); //lte pwrkey
err = gpio_pin_configure(modem_gpiob_dev, 14, GPIO_DISCONNECTED); //lte reset
err = gpio_pin_configure(wifi_gpioa_dev, 12, GPIO_DISCONNECTED); //modem rts
err = gpio_pin_configure(wifi_gpioa_dev, 11, GPIO_DISCONNECTED); //modem cts
err = gpio_pin_configure(modem_gpiob_dev, 0, GPIO_DISCONNECTED); //wifi rx
err = gpio_pin_configure(modem_gpiob_dev, 2, GPIO_DISCONNECTED); //wifi tx
err = gpio_pin_configure(gpiod_dev, 3, GPIO_DISCONNECTED); //wifi wakeup
//using PULL DOWN on these pins increases the power consumption
err = gpio_pin_configure(gpiod_dev, wifiPinReset, GPIO_DISCONNECTED); //wifi rst
err = gpio_pin_configure(gpiod_dev, wifiPinOnOff, GPIO_DISCONNECTED); //wifi on/off
// err = pm_device_action_run(modem_gpiob_dev, PM_DEVICE_ACTION_SUSPEND);
// err = pm_device_action_run(gpiod_dev, PM_DEVICE_ACTION_SUSPEND);
// err = pm_device_action_run(gpioc_dev, PM_DEVICE_ACTION_SUSPEND);
// HAL_RTCEx_BKUPWrite(Get_RtcHandle(), RTC_BKP_DR1, 0);
// __HAL_RCC_PWR_CLK_ENABLE();
// HAL_SuspendTick();
// HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI);
// HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
// __HAL_RCC_PLL_DISABLE();
// HAL_RCC_GPIOB_CLK_DISABLE();
// HAL_RCC_GPIOC_CLK_DISABLE();
// HAL_RCC_GPIOD_CLK_DISABLE();
}
int main(void)
{
// Initialize the storage subsystem
myStorageInit();
checkAndUpdateDeviceConfig();
bg770_ioInit();
terminalUartInit();
uart1LteInit();
uarWifieInit();
msa311_init();
temp_init();
adcInit();
printDeviceConfig();
// adcInit();
enterLowPowerMode();
// pm_state_set(PM_STATE_SUSPEND_TO_IDLE,1);
/* indefinitely wait for input from the user */
while (1) {
k_sleep(K_MINUTES(15));
}
}
Here is the code and the device tree and proj.conf files are attached.
Regards
2024-10-03 07:40 AM
Btw,
I can share the schematic privately if you let me know how.
Regards
2024-10-11 02:46 AM - edited 2024-10-11 02:47 AM
Hello @Stratosphere,
I see many peripherals with status = "okay"; in your dts file (adc1, lptim1, i2c1, lse, gpioa, gpiod, gppioc, gpiob, usart1, usart2, usart3, tim3, tim1).
Make sure to enable only peripherals that are required for your application to save power.
Also, GPIOs can cause increased power consumption if left floating, you're enabling GPIO A,B,C,D, determine which ones are not used, these should be set to input mode with pull-up or pull-down resistors.
Try to review that and see if there is any decrease!
To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.