STM3FF407 a RTC

Jan Waclawek konfera na efton.sk
Středa Červen 17 09:59:13 CEST 2015


RCC_BDCR    0b 0000 0000 0000 0000 1000 0001 0000 0000

To znamena, ze mate vybraty LSE ako zdroj hodin RTC, nie? Ak ten LSE nejde,
potom RTC nema hodiny, a ten init v RTC neprebehne, na to sa upozornuje v
datasheete.

Tipujem, ze ste si niekedy predtym skusili nastavit ten bit 8, a zmenit to
nie je trivialne, precitajte si co sa pise v RM okolo RCC_BDCR.RTCSEL
(vyzaduje si to reset backup domain, toggle RCC_BDCR.BDRST).


Dalsich par poznamok:

Tie definicie bitfieldov mate odkial/ako? Mate ich volatile (ako celok
alebo polozka po polozke)? Neprehadze prekladac pristup k nim? Volatile
nema presnu definiciu, a nie kazdy prekladac je v takychto marginalnych
zalezitostiach dostatocne konzervativny.

Mimochodom, uvedomujete si, ze pristup k polozkam v bitfieldoch (ako aj
pristup cez bit-bandovu oblast) vedie k RMW, co moze mat u niektorych
hardwarovych registrov vedlajsie efekty (netvrdim ze je to v tomto
pripade, len je dobre to mat na pamati). Aj ked pouzivate bitfieldy,
niekedy (casto) je lepsie priame priradenie; v pripade bitfieldov je to
mozne realizovat pomocou compound literals (C99 6.5.2.5, vyzera to ako
preypovany inicializator).

Skusali ste toto vsetko robit v debuggeri rucne? Nie vzdy sa tak da odhalit
problem, ale niekedy ano, najma ak mate vizualny debugger ktory spatne
zobrazi vycitanu hodnotu (u holeho gdb to musite robit "rucne"); to vie
odhalit rozne chyby typu "ak zabudnem povolit toto tak sa mi nepodari
nastavit hento". Neodhali to vsak problemy suvisiace s casovanim v SoC
ktorym tieto armoidy su.

Inak za PWR_CR.DBP = 1 doporucujem dat spatne citanie stavu PWR_CR (staci
precitat cely register, netreba skumat jednotlive bity), pretoze PWR je na
APB1 zbernici ktora u 'F4xx typicky bezi na AHBCLK/4 takze je za
buffrom/synchronizatorom v AHB/APB bridge, kdezto RCC je priamo na AHB1,
takze sa mi stavalo, ze ked kompilator dal tie dva pristupy hned za seba,
tak sa do RCC_BDCR registra nezapisalo (*). Ale to by nemal byt Vas
problem, lebo Vy po nastaveni PWR_CR.DBP mate zapis do RCC_CSR co nie je v
backup domene, takze by malo byt dost casu po ten zapis do BDCR (naviac
ten zapis podla vsetkeho aj prebehol).

wek


(*)
https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2FEnabling%20LSE&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B&currentviews=401





----- Original Message ---------------

Subject: Re: STM3FF407 a RTC
   From: Roman Vostřel <vostrel at lit.cz>
   Date: Tue, 16 Jun 2015 19:24:33 +0200
     To: HW-news <hw-list at list.hw.cz>

>Nastavil jsem breakpoint  na smyčku s podmínkou INITF a v RTC_ISR je 0b 
>0000 0000 0000 0000 0000 0000 0000 0111, RCC_BDCR    0b 0000 0000 0000 
>0000 1000 0001 0000 0000 ,RCC_CSR    0b 0001 1110 0000 0000 0000 0000 
>0000 0011
>
>Nevím proč tam není nastaven bit7 RTC_ISR.INIT na 1?.
>
>
>Dne 16.6.2015 v 18:28 Jan Waclawek napsal(a):
>> A ten LSI bezi? Nebolo by treba pockat najprv kym sa rozbehne, t.j. po
>> nastaveni RCC_CSR.LSION pockat kym sa nastavi RCC_CSR.LSIRDY?
>>
>> wek
>>
>>
>> ----- Original Message ---------------
>>
>>> Nedaří se mi zprovoznit RTC u STM32F407 z LSI hodin. Nedočkám se 1 v
>>> RTC_ISR.INITF.  Můµete mi poradit na co jsem při inicializaci hodin
>>> zapomněl?
>>>
>>>
>>> void RTCInit(){
>>> // Init power and clock for RTC
>>>
>>> RCC_APB1ENR.PWREN = 1;         // Power interface clock enable
>>> PWR_CR.DBP = 1;
>>>
>>> RCC_CSR. LSION=1;                //povolit interní osclilátor
>>>
>>> RCC_BDCR.RTCSEL0 = 0;        //nastavit na interní oscilátor
>>> RCC_BDCR.RTCSEL1 = 1;
>>>
>>> RCC_BDCR.RTCEN = 1;
>>>
>>>
>>> RTC_WPR = 0xCA;   //unlock write protection
>>> RTC_WPR = 0x53;   //unlock write protection
>>>
>>> RTC_ISR.INIT = 1;
>>>
>>> while(RTC_ISR.INITF == 0)
>>> { }
>>>
>>> RTC_PRER = 0x7f00ff;  //  set   SynchPrediv to FF and AsynchPrediv to 7F
>>> RTC_PRER = 0x7f00ff;  //  set   SynchPrediv to FF and AsynchPrediv to 7F
>>>
>>> RTC_TR = 0x103500; //setting time to 12.35.00
>>> RTC_DR = 0x150718;  // set date to  2012-07-18
>>>
>>> RTC_ISR.INIT = 0;
>>>
>>> RTC_WPR = 0xFF;
>>> }
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz
>> Hw-list at list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>
>_______________________________________________
>HW-list mailing list  -  sponsored by www.HW.cz
>Hw-list at list.hw.cz
>http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list