Co ja robiłem
Korzystam z mikrokontrolera STM32 i do mojego projektu muszę mieć możliwość wysyłania danych o określonych porach dnia (powiedzmy o 11 rano i 2 po południu). Mikrokontroler musi wiedzieć, która jest godzina, zanim będę mógł to osiągnąć. Niestety mam tylko komunikację jednokierunkową i dlatego nie mogę żądać aktualnego czasu z sieci.
Dlatego chcę ustawić bieżący czas, bezpośrednio po zakończeniu programowania. Wiedziałem, że jestem w stanie zapisać dane do pamięci flash za pomocą interfejsu wiersza poleceń ST-LINK Utility (ST-LINK_CLI) przy użyciu następującego polecenia:
ST-LINK_CLI.exe -w32 <Address> <data> -Rst
Napisałem prosty skrypt testowy, który zapisuje uniksowy znacznik czasu na adres, który nie jest obecnie używany przez kod.
Właśnie miałem napisać funkcję do odczytu znacznika czasu i użyć go do ustawienia czasu RTC. Dopóki nie przeczytam poniższych instrukcji w Podręczniku użytkownika narzędzia ST-LINK :
-w32 obsługuje zapis do pamięci Flash, rejestrów OTP, SRAM i R / W.
Kiedy instrukcja mówi, że obsługuje zapis do rejestrów R / W, czy oznacza to, że mogę bezpośrednio uzyskać dostęp do rejestrów RTC i je ustawić? Próbowałem, ale nie mogę pisać do tych rejestrów.
Jeśli tak, wolałbym użyć tej metody, ponieważ nie musiałbym już pisać konkretnej funkcji do obsługi mikrokontrolera. Oznacza to, że mogę ustawić czas RTC dowolnego aktualnie używanego mikrokontrolera, zamiast konieczności aktualizacji jego kodu.
Co zamierzałem zrobić
Aby ustawić rejestry RTC, próbowałem wykonać następujące kroki, jak opisano w Podręczniku referencyjnym STM :
- ustaw bit DPB w rejestrze PWR_CR
- zapisz 0xCA do rejestru RTC_WPR
- zapisz 0x53 do rejestru RTC_WPR
- zatrzymać RTC, ustawiając bit INIT w rejestrze RTC_ISR
- wybierz zegar 1Hz, pisząc do rejestru RTC_PRER
- wczytaj aktualny czas, pisząc do rejestru RTC_TR
- załaduj bieżącą datę, pisząc do rejestru RTC_DR
- uruchomić RTC, resetując bit INIT w rejestrze RTC_ISR
Aby uzyskać dostęp do rejestrów, użyłem następujących adresów:
- PWR_CR: 0x4000 7000
- RTC_WPR: 0x4000 2824
- RTC_ISR: 0x4000 280C
- RTC_PRER: 0x4000 2810
- RTC_TR: 0x4000 2800
- RTC_DR: 0x4000 2804
Co poszło nie tak
Nie mogę pisać do żadnego z tych rejestrów. Dzięki narzędziu ST-LINK pojawia się następujący komunikat:
Wystąpił błąd podczas zapisywania pamięci!
Za pomocą ST-LINK_CLI:
Zapis 0x00000100 w 0x40007000 ... Błąd!
Czytanie tych rejestrów nie stanowi problemu, ale nie mogę do nich pisać za pomocą narzędzia ST-LINK ani interfejsu wiersza poleceń.
Pytanie
Jak zapisywać do rejestrów R / W za pomocą Narzędzia ST-LINK?
Czy istnieje jakiś rodzaj ochrony przed zapisem umożliwiający zapis do rejestrów RTC, które przeoczyłem?