Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
RTC na STM32 za baterijski rad
#11
Gorane,

Brojač od IWDG startuje onog momenta kad se u registar KR upiše 0xCCCC.
Ukoliko do tog momenta nemaš spremnu i formiranu ISR rutinu koja će refrešovati taj brojač, IWDT će oboriti sistem.

Dosta često razne inicijalizacije zahtevaju neke blokirajuće delays i nisu vremenski precizno kontrolisane.
Ukoliko se ranije inicijalizuje IWDG i ako je u pitanju neki kratak interval njegovog mogućeg overflow, onda će isteći u toku neke inicijalizacije.

Ne koristim HAL, ali mogu da pretpostavim da je to o čemu sam malopre pisao razlog smestanja na poslednje mesto u inicijalizacijama.

Naravno, imaš pravo miksovati i bare metal sa HAL. To ti omogućava da ne zahtevaš od Cube MX da aktivira IWDG a ti ga onda možeš pokrenuti bilo gde.

Na primer, inicijalizuješ ga sa najdužim vremenom od 26 sekundi ili slično kako tebi odgovara, pokriješ tim inicijalizacije ostalih stvari, potom kad ti bude spremna ritmična rutina za čišćenje IWDG, reinicijalizuješ ga na neko kratko vreme koje je tebi optimalno i potom preuzmeš periodično čišćenje njegovog brojača.

Evo napisaću ponovo inicijalizaciju sa dopunskim komentarima oko potrebnih stvari:

Code:
void iwdg_setup(void)
{
  //  RCC->CSR |= (1<<0);                 // LSI enable (aktiviranje LSI ukoliko negde vec prethodno nije aktiviran)
  //  while ((RCC->CSR & (1<<1)) == 0);   // wait till LSI is ready (ne ides dalje dok oscilator stvarno ne proradi)

  IWDG->KR  = 0x5555;    /* enable write to PR, RLR, kljuc koji omogucava pristup promeni preskalera i RLR,
                                        moze se i kasnije u hodu promeniti stanje PR i RLR po potrebi */

  IWDG->PR  = 64;            // Init prescaler, /64,  (moguce od 4 do 256, 40KHz/PR)
  IWDG->RLR = 0xFFF;     /* Init RLR, trajanje intervala, realno od 5 TC do 0xFFF, trenutno 4095 x 40KHz/64 tj.
                                          6552 mS ako je LSI kalibrisan na 40KHz, max. oko 8720 mS ako je 30KHz LSI */  

  IWDG->KR  = 0xAAAA;  /* upis restartuje down count od vrednosti RLR ka nuli, ovim se inace kasnije restartuje counter pre nego sto istekne, inace se dogodi reset MCU */

IWDG->KR  = 0xCCCC;                 // Start the watchdog, start naprave prvi put
}

Reference su ti u dokumentu RM0008
Reply


Messages In This Thread
RTC na STM32 za baterijski rad - by prasimix - 05-01-2019, 09:22 AM
RE: RTC na STM32 za baterijski rad - by Macola - 05-01-2019, 11:05 AM
RE: RTC na STM32 za baterijski rad - by prasimix - 05-01-2019, 11:10 AM
RE: RTC na STM32 za baterijski rad - by Macola - 05-01-2019, 11:16 AM
RE: RTC na STM32 za baterijski rad - by prasimix - 05-01-2019, 11:20 AM
RE: RTC na STM32 za baterijski rad - by Macola - 05-01-2019, 11:24 AM
RE: RTC na STM32 za baterijski rad - by mikikg - 05-01-2019, 11:42 AM
RE: RTC na STM32 za baterijski rad - by Macola - 05-01-2019, 11:46 AM
RE: RTC na STM32 za baterijski rad - by mikikg - 05-01-2019, 12:01 PM
RE: RTC na STM32 za baterijski rad - by Macola - 05-02-2019, 10:10 AM
RE: RTC na STM32 za baterijski rad - by Macola - 05-02-2019, 10:59 AM
RE: RTC na STM32 za baterijski rad - by Macola - 05-02-2019, 12:12 PM

Forum Jump:


Users browsing this thread: 1 Guest(s)