LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

Oszczędzanie energii w mikrokontrolerach STM32

Standby mode

Użycie tego trybu pozwala na najbardziej drastyczne obniżenie poboru energii. Podobnie do trybu zatrzymania, także tryb standby korzysta z głębokiego uśpienia rdzenia (deep-sleep), jednak stabilizator 1,8 V jest wyłączany bez dodatkowej interwencji użytkownika. Wejście w tryb czuwania powoduje utratę danych zawartych w pamięci RAM inaczej, niż w poprzednich trybach. Nienaruszone zostają natomiast dane zawarte w rejestrach chronionych przed utratą oraz nadal pracują wolne oscylatory (backup domain), pod takim warunkiem, że do mikrokontrolera doprowadzono zasilanie awaryjne bateryjne Vbatt. Pracę kontynuuje układ niezależnego watchdoga (o ile został wcześniej włączony) i układy wybudzania.
Czas, jaki jest potrzebny na powrót do pracy z trybu czuwania wynosi minimum 50 s, dla startu systemu z wewnętrznym oscylatorem HSI. Jeśli układ będzie się wybudzał do pracy z zewnętrznym oscylatorem HSE, a do uzyskania użytecznego sygnału zegarowego będzie wykorzystywał układ PLL, to czas potrzebny na wybudzanie będzie wielokrotnie dłuższy.
Pobór prądu, gdy włączone są: wolny oscylator i układ zegara czasu rzeczywistego, waha się od 3…3,5 mA, zależnie od wartości napięcia zasilającego.
Mikrokontroler wybudza się, pojawi się sygnał zerowania (Reset), po przepełnieniu niezależnego watchdoga (IWDG), przy narastającym zboczu sygnału na linii Wakeup, lub po alarmie zegara RTC. Układ rozpoczyna normalną pracę w taki sam sposób, jak po wystąpieniu sprzętowego sygnału Reset. Z tego powodu czas potrzebny na osiągnięcie normalnej pracy systemu jest najdłuższy. Oznaką tego, że uruchomienie następuje po wybudzeniu z trybu czuwania jest ustawiona flaga SBF w rejestrze PWR_CSR. W bibliotece funkcji API nazywa się ona PWR_FLAG_SB.

List. 4. Fragment programu ilustrującego wykorzystanie trybu czuwania

int main(void)
{
      RCC_Conf();
      GPIO_Conf();

    // W razie debugowania nie zostanie zerwane polaczenie
    DBGMCU_Config(DBGMCU_STANDBY, ENABLE);

      // Wlacz obsluge wyprowadzenia Wakeup (PA0)
      PWR_WakeUpPinCmd(ENABLE);

      // Zezwolenie na dostep do "Backup domain"
      PWR_BackupAccessCmd(ENABLE);

      // Czy flaga trybu czuwania ustawiona?
      if(PWR_GetFlagStatus(PWR_FLAG_SB) != RESET)
      {
    // Jesli tak, to system budzi sie z trybu standby
        GPIO_SetBits(GPIOC, GPIO_Pin_7); 
        
        // Wyczysc flage PWR_FLAG_SB
        PWR_ClearFlag(PWR_FLAG_SB);
        
        // Czekaj na synchronizacje z APB1
        RTC_WaitForSynchro();
    }
    else
    {
    //System startuje normalnie, wiec nalezy skonfigurowac RTC    

        BKP_DeInit();
          
        // Wlacz wolny zewnetrzny oscylator
        RCC_LSEConfig(RCC_LSE_ON);
        // Czekaj na poprawny sygnal
        while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
        
        // LSE bedzie zrodlem sygnalu zegarowego dla RTC
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
        
        // Wlacz taktowanie RTC
        RCC_RTCCLKCmd(ENABLE);

        // Czekaj na synchronizacje z APB1
        RTC_WaitForSynchro();
        RTC_WaitForLastTask();
        
        // RTC bedzie zliczal pojedyncze sekundy
        RTC_SetPrescaler(32768);
        // Czekaj na wykonanie polecenia  
        RTC_WaitForLastTask();
    }

    NVIC_Conf();

    GPIO_SetBits(GPIOC, GPIO_Pin_6);

     while (1)
      {
        if(!GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9))
        {
            GPIO_ResetBits(GPIOC, GPIO_Pin_6);

            // Wlacz tryb czuwania (standby mode)
            PWR_EnterSTANDBYMode();
        }
    }
}

Na list. 4 przedstawiono fragment programu wykorzystującego tryb czuwania. Aplikacja o stanie pracy mikrokontrolera informuje za pomocą diody LD1. Jej świecenie sygnalizuje normalną pracę, natomiast zgaszenie tryb czuwania. Układ powraca do normalnego stanu po naciśnięciu przycisku RESET lub WAKEUP.
Poza wymienionymi funkcjami, konfigurowany jest również układ zegara czasu rzeczywistego. Dzięki temu podczas debugowania można zaobserwować aktualny stan mikrokontrolera. Ponowne wprowadzenie trybu standby następuje po naciśnięciu przycisku (PB9).
Zadaniem głównej, nieskończonej pętli programu jest nieustanne sprawdzanie stanu linii PB9. Gdy pojawi się na niej stan niski, to system jest przygotowywany do wejścia w tryb czuwania. Ostatecznie, wywołanie funkcji PWR_EnterSTANDBYMode() powoduje włączenie trybu standby.
Na początku programu, po standardowym skonfigurowaniu systemu do pracy, włączana jest możliwość debugowania mikrokontrolera po wprowadzeniu do trybu czuwania oraz obsługa Wakeup i dostęp do rejestrów chronionych przed utratą. Kolejną, istotną czynnością, jest sprawdzenie, czy mikrokontroler rozpoczyna pracę po wybudzeniu, czy też nie. Jeżeli flaga PWR_FLAG_SB jest ustawiona, to zaświecana jest diody LD2, a wywołanie funkcji PWR_ClearFlag() powoduje wyzerowanie flagi trybu czuwania. Na koniec funkcja RTC_WaitForSynchro() sprawia, że mikrokontroler czeka na synchronizację z układem zegara czasu rzeczywistego. Jest ona niezbędna, ponieważ układ ten podłączony jest do wewnętrznej magistrali APB1, a w czasie czuwania jej taktowanie zostało wyłączone.
W przypadku, gdy flaga PWR_FLAG_SB była wyzerowana, konfigurowany jest układ zegara czasu rzeczywistego i jego sygnał zegarowy.