logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

STM32F070F6 - Jak osiągnąć niskie zużycie energii w trybie STOP?

mad81 22 Wrz 2017 12:20 759 3
REKLAMA
  • #1 16713890
    mad81
    Poziom 12  
    Posty: 96
    Pomógł: 2
    Ocena: 1
    Witam
    Posiadam procesor STM32F070F6, po wprowadzeniu go w stan Standby pobiera 3-4uA jest ok po za tym, że potrzebuję go wybudzać i zbierać dane do pamięci ram więc ten tryb nie odpowiada mi bo RAM jest po każdym wybudzeniu kasowana.

    Przeglądając dokumentację znalazłem tryb który nijako trochę mi pasuję STOP mode, procesor w tym stanie może być wybudzony przez RTC nie traci stanu pamięci i rusza z miejsca gdzie stanął ok SUPER!.

    Ogólne założenie jest takie, że procesor co 10s-60s wybudza się i zbiera dane po UART, potem co 10-30min odpala ESP8266 i wypluwa te dane po MQTT do serwera, pobiera aktualny czas, konfigurację i usypia ESP jak i sam siebie.

    Tylko że dokumentacja mówi o około 6-7uA w tym trybie, tym czasem sexample z STtdPeriph_lib/PWR/.... daje możliwość wprowadzenia w tryby sleep stop itp... wprowadzenie procesora w tryb STOP zmniejsza konsumpcję do 0.5mA to dalej za dużo bo urządzenie ma być bateryjne z założenia działać rok czasu, po za tym nie wybudza się.

    Czy ktoś ma jakiś działający przykład na stm32F0 zatrzymania STOP i wybudzenia po np 10s ? lub sugestię jak to osiągnąć ? ślęczę nad tym trzeci dzień bez większych efektów.

    Oto fragment który wprowadzał w tryb standby, zmieniłem instrukcje na STOP... ale to jak pisałem nie działa jak należy...

    RTC_InitTypeDef RTC_InitStructure;
    RTC_AlarmTypeDef RTC_AlarmStructure;
    RTC_TimeTypeDef RTC_TimeStructure;
    
    /* Allow access to RTC */
    PWR_BackupAccessCmd(ENABLE);
    
    /* The RTC Clock may varies due to LSI frequency dispersion. */ 
    /* Enable the LSI OSC */ 
    RCC_LSICmd(ENABLE);
    
    /* Wait till LSI is ready */ 
    while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
    {
    }
    
    /* Select the RTC Clock Source */
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
    
    /* Enable the RTC Clock */
    RCC_RTCCLKCmd(ENABLE);
    
    /* Wait for RTC APB registers synchronisation */
    RTC_WaitForSynchro();
    
    RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
    RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
    RTC_InitStructure.RTC_SynchPrediv = 0x0138;
    
    RTC_Init(&RTC_InitStructure);
    
    /* Set the alarm X+5s */
    RTC_AlarmStructure.RTC_AlarmTime.RTC_H12 = RTC_H12_AM;
    RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours = 0x01;
    RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes = 0x00;
    RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds = 0x05;
    RTC_AlarmStructure.RTC_AlarmDateWeekDay = 0x31;
    RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date;
    RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay;
    RTC_SetAlarm(RTC_Format_BCD, RTC_Alarm_A, &RTC_AlarmStructure);
    
    /* Enable the alarm */
    RTC_AlarmCmd(RTC_Alarm_A, ENABLE);
    
    /* Set the time to 01h 00mn 00s AM */
    RTC_TimeStructure.RTC_H12 = RTC_H12_AM;
    RTC_TimeStructure.RTC_Hours = 0x01;
    RTC_TimeStructure.RTC_Minutes = 0x00;
    RTC_TimeStructure.RTC_Seconds = 0x00; 
    
    RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure);
    
    /* Disable RTC Alarm A Interrupt */
    RTC_ITConfig(RTC_IT_ALRA, DISABLE); 
    
    /* Clear Power Wake-up (CWUF) flag */
    PWR_ClearFlag(PWR_FLAG_WU); 
    
    /* Enable RTC Alarm A Interrupt */
    RTC_ITConfig(RTC_IT_ALRA, ENABLE); 
    
    RTC_ClearFlag(RTC_FLAG_ALRAF);
    
    /* Request to enter STANDBY mode (Wake Up flag is cleared in PWR_EnterSTANDBYMode function) */
    // PWR_EnterSTANDBYMode();
    PWR_EnterSTOPMode(PWR_CR_LPSDSR, PWR_STOPEntry_WFI);
  • REKLAMA
  • #2 16714314
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    mad81 napisał:
    ten tryb nie odpowiada mi bo RAM jest po każdym wybudzeniu kasowana.

    Istotne jest że pamięć ram nie "jest kasowana" tylko "kasuje ją Twój program". To bardzo znacząca różnica, bo nad tym pierwszym nie miałbyś kontroli, a nad tym drugim masz pełną.
  • REKLAMA
  • #3 16714401
    __Maciek__
    Poziom 21  
    Posty: 366
    Pomógł: 25
    Ocena: 92
    Freddie ... można prosić o więcej szczegółów .... szczególnie w aspekcie zapisu w nocie katalogowej :

    Cytat:
    Standbymode
    The Standby mode is used to achieve the lowest power consumption. The internal voltage regulator is switched off so that the entire 1.8 V domain is powered off. The PLL, the HSI RC and the HSE crystal oscillators are also switched off. After entering Standby mode, SRAM and register contents are lost except for registers in the RTC domain and Standby circuitry.


    Nawet jeśli dopilnujemy żeby zmienne nie były inicjalizowane to nie mamy pewności co w nich rzeczywiście siedzi.

    Nie wiem czy nie należało by się skłonić ku dodatkowej pamięci fram, lub msp430 .. ale ja tam akurat słabo się znam
  • #4 16714425
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    No to używaj prawidłowej terminologii. Jeśli w tym trybie SRAM nie jest podtrzymywany, to nie jest to samo co "jest kasowany". Pewne części RAMu są kasowane przez kod startup, ale masz pełen wpływ na to które to są obszary. Jeśli nie potrzeba Ci dużo tych danych, to zawsze można rozważyć użycie podtrzymywanych bateryjnie rejestrów, ale tych akurat w STM32F0x0 nie ma, więc trzeba by zmienić układ. A jak już zmieniać, to najlepiej na taki który ma BKPSRAM, czyli kilka kB RAMu podtrzymywanego bateryjnie.
REKLAMA