Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
RTC na STM32 za baterijski rad
#12
(05-02-2019, 10:10 AM)Macola Wrote: 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

super, puno hvala

tako sam i složio sada
postavljen mi je od početka na maksimalni interval pa nemam problema, a ako se sada zaglavi nešto morao bi resetirati.
Budem probao simulirati zaglavljivanje pa vidjeti da li se trigerira.

Zaglavit nije tako teško, ako se ne pokrene clock koji vozi neku periferiju onda će kod zaglaviti kod njene inicijalizacije...

Inače u novom cubeMX-u se za svaku periferiju može odabrati da li se želi LL ili HAL - ne znam da li je toga bilo u starim verzijama, pa se to lako može kombinirati ...
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 Goran.Mahovlic - 05-02-2019, 10:25 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: 3 Guest(s)