Hallo zusammen,
ich habe ein Softwareprojekt zum steuern meines E-Autos.
(https://github.com/jsphuebner/stm32-car/tree/touran-meb). Es läuft auf
einem STM32F103RBT6.
Da ich einen neuen Akku verbaut habe läuft das jetzt mit dem BMS etwas
anders, ich muss viele Sachen selbst machen die vorher ein OEM BMS
gemacht hat.
Eines davon ist die SoC Berechnung anhand der entnommenen Ladung. Das
klappt soweit alles, nun möchte ich aber den SoC speichern und wenn ich
das Auto wieder benutze den alten Wert wieder laden.
Ich will vermeiden das interne Flash zu nutzen, weil z.B. beim Löschen
einer Page der Prozessor kurz Pause macht - beim Fahren eher schlecht.
Nun dachte ich, ich kann das Alarm-Register der RTC quasi als
gepuffertes SRAM zweckentfremden. Klappt aber nicht, nach einem Neustart
(egal ob Soft Reset oder Power on Reset) ist der wert wieder auf -1.
Direkt nach dem Reinschreiben ist der Wert gespeichert, nur eben nach
dem Neustart nicht.
Beim booten nutze ich von libopencm3 die Funktion
rtc_awake_from_standby() und probeweise auch rtc_auto_awake(RCC_LSE,
32767) (einmal muss die Clock-Config ja gemacht werden).
Die Funktion macht eigentlich nichts verdächtiges:
1 | void rtc_awake_from_standby(void)
|
2 | {
|
3 | uint32_t reg32;
|
4 |
|
5 | /* Enable power and backup interface clocks. */
|
6 | rcc_periph_clock_enable(RCC_PWR);
|
7 | rcc_periph_clock_enable(RCC_BKP);
|
8 |
|
9 | /* Enable access to the backup registers and the RTC. */
|
10 | pwr_disable_backup_domain_write_protect();
|
11 |
|
12 | /* Wait for the RSF bit in RTC_CRL to be set by hardware. */
|
13 | RTC_CRL &= ~RTC_CRL_RSF;
|
14 | while ((reg32 = (RTC_CRL & RTC_CRL_RSF)) == 0);
|
15 |
|
16 | /* Wait for the last write operation to finish. */
|
17 | /* TODO: Necessary? */
|
18 | while ((reg32 = (RTC_CRL & RTC_CRL_RTOFF)) == 0);
|
19 | }
|
Die Zeit an sich verhält sich auch wie geplant, sprich die Sekunden
laufen auch weiter wenn ich die Spannung wegnehme (3V Batterie hängt an
VBAT, Takt über 32 kHz Quartz). Nur der Alarm-Wert ist weg. Was mache
ich falsch?