41-RTC-Library (STM32F4)

Mit dieser Library kann die interne RealTimeClock (RTC) der STM32F4 CPU benutzt werden.

Zum Betrieb muss an den Pins PC14 und PC15 ein externer Quarz (32,768 kHz) und zwei Kondensatoren (6,8pF) angeschlossen werden. (beim Discovery-Modul C16, C27 und X3)

Wenn die RTC auch weiterlaufen soll wenn keine Spannungsversorgung mehr da ist, muss der Pin 6 der CPU (VBAT) an eine externe Batterie angeschlossen werden.
Vorsicht !! Beim Discovery-Modul ist Pin6 über einen 0 Ohm Widerstand (R26) mit VDD verbunden. Dieser R26 muss dann ausgelötet werden, sonnst versorgt die Batterie das ganze Board.

Ich habe eine Backup-RAM-Adresse benutzt um den Status der RTC zu speichern. Um zu erkennen ob sie schon initialisiert war und ob der User schon die Uhrzeit gestellt hat. Falls die RTC noch nicht initialisiert war, wird die Uhr auf 0:00:00 und das Datum auf 1.1.00 gesetzt.

Für die Uhr/Datum habe ich eine Struktur angelegt. Zum stellen der RTC auf eine bestimmte Zeit muss die Struktur gefüllt werden und einmal die “SET-Funktion” aufgerufen werden. Zum auslesen der aktuellen Zeit gibt es eine “GET-Funktion”.

Als Daten-Format der RTC kann entweder “normal” in Dezimaldarstellung benutzt werden. Dann zählt z.B. der Sekundenwert [0,1,2,3,4,5,6,7,8,9,10,11,12…59] oder mann benutzt die Hexadezimal Variante, dann zählt der Sekundenwert [0,1,2,3,4,5,6,7,8,9,16,17,18,19 usw) diese BCD-Darstellung ist dann sinnvoll, wenn die Ziffern der Zehner- und Einerstelle einzeln angezeigt werden sollen.

Wer will, kann im H-File den WakeUp-Interrupt aktivieren, und diesen auf eine Zeit stellen (z.B. 500ms). Dann wird die RTC alle 500ms ein Interrupt-Event auslösen.

VORSICHT : BUG Hinweis !! (RTC lässt sich nicht einstellen)
Die RTC-Library schaltet bei der Initialisierung den Clock vom PWR-Modul ein

1
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

damit es zu keinem Fehler kommt darf an keiner anderen Stelle vom Projekt dieser Clock nochmal aktiviert werden. Das betrift im Moment die Librarys :
[31=USB-CDC, 48=USB-HID-Device, 58=Backup-RAM]
Wenn ihr eine von diesen Librarys zusammen mit der RTC benutzen wollt, müsst ihr nach der Codezeile mit “RCC_APB1Periph_PWR” suchen und diese löschen.
Sonst kann die RTC nicht auf eine andere Zeit eingestellt werden !!
Zusätzlich muss der Init der RTC als erstes im Main gemacht werden, also vor der USB-Init-Funktion.
(Danke an “Tueddel” und “Hosentraeger” die den BUG gesehen haben)

Umbau :

rtc

Benutzte Pins :

1
PC14 und PC15 für den Quarz

Voraussetzungen :

1
2
Benutzte Module der CooCox-IDE : RTC, PWR, (EXTI, MISC)
Benutzte Librarys : keine

Enumerationen :

1
2
3
4
5
6
7
8
9
10
typedef enum {
  RTC_WAKEUP_STOP =0, // Wakeup Interrupt disable
  RTC_WAKEUP_30s,     // Timer auf 30sec intervall
  RTC_WAKEUP_10s,     // Timer auf 10sec intervall
  RTC_WAKEUP_5s,      // Timer auf 5sec intervall
  RTC_WAKEUP_1s,      // Timer auf 1sec intervall
  RTC_WAKEUP_500ms,   // Timer auf 500msec intervall
  RTC_WAKEUP_250ms,   // Timer auf 250msec intervall
  RTC_WAKEUP_125ms    // Timer auf 125msec intervall
}RTC_WAKEUP_t;

:

1
2
3
4
typedef enum {
  RTC_DEC = 0,  // Dezimal [8,9,10,11,12 usw]
  RTC_HEX,      // Hex     [0x08,0x09,0x10,0x11,0x12 usw]
}RTC_FORMAT_t;

:

1
2
3
4
5
typedef enum {
  RTC_UNDEFINED =0, // RTC war noch nicht initialisiert
  RTC_INIT_OK,      // RTC war schon initialisiert
  RTC_TIME_OK       // RTC war schon eingestellt
}RTC_STATUS_t;

Struktur

1
2
3
4
5
6
7
8
9
10
11
typedef struct {
  RTC_STATUS_t status;
  uint8_t std;     // studen   [0...23]
  uint8_t min;     // minuten  [0...59]
  uint8_t sek;     // sekunden [0...59]
  uint8_t tag;     // tag      [1...31]
  uint8_t monat;   // monat    [1...12]
  uint8_t jahr;    // jahr     [0...99]
  uint8_t wotag;   // wochentag [1...7] 1=Montag
}RTC_t;
RTC_t UB_RTC;

Funktionen :

1
2
3
4
RTC_STATUS_t UB_RTC_Init(void);                      // zum init der RTC-Funktion 
void UB_RTC_SetClock(RTC_FORMAT_t format);           // zum stellen der RTC-Zeit
void UB_RTC_GetClock(RTC_FORMAT_t format);           // zum auslesen der aktuellen RTC-Zeit
void UB_RTC_SetWakeUpInterrupt(RTC_WAKEUP_t wakeup); // zum einstellen des WakeUp-Timers

Beispiel :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//--------------------------------------------------------------
// File     : main.c
// Datum    : 23.05.2013
// Version  : 1.0
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F4
// IDE      : CooCox CoIDE 1.7.0
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo der RTC-Library
// Hinweis  : Diese zwei Files muessen auf 8MHz stehen
//              "cmsis_boot/stm32f4xx.h"
//              "cmsis_boot/system_stm32f4xx.c"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_led.h"
#include "stm32_ub_rtc.h"
 
int main(void)
{
  RTC_STATUS_t check;
  uint8_t old_sek=0;
 
  SystemInit(); // Quarz Einstellungen aktivieren
 
  // Init der LEDs
  UB_Led_Init();
 
  // Init und start der RTC
  check=UB_RTC_Init();
 
  if(check==RTC_UNDEFINED) {
    // RTC war noch nie initialisiert
    UB_Led_On(LED_RED);
  }
  else {
    // RTC war schon initialisiert
    UB_Led_On(LED_GREEN);
  }
 
  while(1)
  {
    // aktuelle RTC-Zeit auslesen
    UB_RTC_GetClock(RTC_DEC);
    if(UB_RTC.sek!=old_sek) {
      // wenn eine Sekunde um ist
      old_sek=UB_RTC.sek;
      UB_Led_Toggle(LED_BLUE);
    }
  }
}

Hier die Library zum Download :

ub_stm32f4_rtc_v101

Hier der komplette CooCox-Projektordner zum Download :

Demo_41_RTC

57 Antworten auf 41-RTC-Library (STM32F4)

  1. Eric sagt:

    Moin,

    hatte mich schon mal mit dem RTC des STM32 auseinander gesetzt, ohne Erfolg.
    Dein Code lief sofort.
    Danke!
    Gruß Eric

    • admin_ub sagt:

      Kein Problem…genau so soll es sein. kopieren, einfügen, läuft :-)

      • Christian Julius sagt:

        Hallo,

        ja, läuft prima. Die RTC ist aber durch die StdPeriph Libs sehr gut abgedeckt und diese Lib hier moppelt einiges doppelt. Die RTC ist fast so einfach wie die der LPC23xx damals, das würde sogar auf Registerebene beim F4 gehen. Eine höhere Granularität der RTC Bedienung ist mit den StdLibs möglich. Da nahezu alle billigen 32khz Quarze falsch gehen (besser: sie müssen auf die Geometrie der Platine und ihrer Kapaizitäten kalibriert werden) und es keinen Dreho zum trimmen gibt ist es für eine genaue Uhr auf jeden Fall erforderlich sich mit dem Smooth Trimmen zu befassen und auf dem Oszi dann über den Pin abzugleichen. Es gibt eine sehr gute AppNote bei St für die RTC, die liest sich wie ein gutes Buch auf dem Balkon.

  2. Joerg sagt:

    Ich habe den zur CPU zeigenden Kontakt des Widerstandes R26 mit dem NC Pin (neben der Kopfhörerbuchse) mit einem Fädeldraht verbunden. Die Batterie kann dann sauber auf die Platine / Rasterplatine gelötet werden.

    Einen passenden SMD Quarz gibt es bei Reichelt, leider keine Kondensatoren 0603 in 6,8p ich habe 10p genommen. Funktioniert auch bei mir ohne Probleme.

    Jörg

  3. Marc Rupprath sagt:

    Hallo;
    Verständnissfrage:
    “Wenn die RTC auch weiterlaufen soll wenn keine Spannungsversorgung mehr da ist, muss der Pin 6 der CPU (VBAT) an eine externe Batterie angeschlossen werden.”

    Ich habe deine Bibliothek noch nicht getestet, (anderes Beispiel genommen)aber eine grundsätzliche Verständnisfrage:

    Wenn ich die Uhr am Beginn meines Programmes nicht stelle, beginnt diese mit der
    Zeit : 00:00:00 , so weit so gut.

    Es ist eine Batterie angeschlossen. Nach einiger Zeit (Beispiel bei: 00:20:15) schalte ich die Spannungsversorgung aus.
    Beim Wiedereinschalten müsste die Uhr weitergelaufen sein, beginnt jedoch bei 00:00:00.

    Was habe ich vermutlich falsch konfiguriert ?
    Muß ich nach dem Wiedereinschalten das Backup register laden und hiermit die Uhr neu stellen ??

    Danke

    • admin_ub sagt:

      Wenn die Batterie am VBAT-Pin angeschlossen ist, sollte die Uhr “im Hintergrund” weiterlaufen. Nach dem neustart darf sie also nicht wieder bei “00″ anfangen sondern bei der alten Zeit + die Zeit die vergangen ist. Ich kann das hier z.B. durch drücken vom Reset simulieren…hab keine Batterie. Aber event. ist da auch noch ein BUG drinn.

      • Joerg sagt:

        er arbeitet ja nicht mit deiner Lib

        • admin_ub sagt:

          dann nehm ich alles zurück und sage :
          Der Fehler liegt in Zeile 42

  4. Joerg sagt:

    Dann schau dir doch einmal das Lib an, Uwe hat sich nun wirklich die Mühe gemacht alles genau in deutsch zu kommentieren.

    • admin_ub sagt:

      Danke für die “Verteidigung” aber es können nicht alle fremden Quellcode lesen und zum fragen gibt es den Blog ja. Zumal ich mir nicht sicher bin ob es nicht doch noch ein BUG ist ;-)

  5. tueddel sagt:

    Hallo,

    danke für das teilen des Codes, RTC-Initialisierung und RTC-Zeit auslesen klappt auch prima. Der RTC läuft auch klaglos mit der Backupbatterie weiter, wenn ich die Stromversorgung kappe. Allerdings schaffe ich es nicht, während des Betriebs dann die Uhrzeit neu zu setzen. Mein RTC setzt einfach nicht das INITF Flag, dadurch ist:

    RTC_EnterInitMode() == ERROR

    Hatte schonmal wer das Problem und hat vielleicht die Lösung? Ich weiß mir gerade nicht mehr zu helfen. Ich gehe schwer davon aus, aber hat mal jemand die hier bereitgestellte Funktion UB_RTC_SetClock außerhalb der UB_RTC_Init getestet?

    • admin_ub sagt:

      UB_RTC_SetClock ist eine eigene Funktion, die MUSS funktionieren.
      Benutzt du die gleiche Hardware und die gleiche Software ?
      Ansonsten : Fehler in Zeile 42

      • tueddel sagt:

        Als Hardware nutze ich eine Eigenentwicklung mit einem STM32F405RG. Kann mir aber nicht vorstellen das es an meiner Hardware liegt, der RTC läuft soweit gut mit dem LSE. Ich bekomme nur nach dem initialisieren keinen Schreibzugriff mehr auf das RTC->ISR Register.

        Software nutze ich Deine hier, habs aber auch schon mit anderen Codebeispielen versucht die man so im Netz findet.

        Im Endeffekt machen aber auch alle Beispiele das Gleiche (wen wunderts…) und immer hab ich das gleiche Problem. Wenn ich versuche im RTC->ISR das INIT Flag zu setzen, damit ich Zeit/Datum setzen kann, rührt sich nichts im RTC->ISR Register. Dabei macht die Standard-Funktion der STM Library meiner Ansicht nach alles wie es im Datenblatt steht.

      • tueddel sagt:

        Nochmal zu meinem Problem.
        Minimalbeispiel:

        int main(void) {
        SystemInit(); // Quarz Einstellungen aktivieren
        UB_RTC_Init();
        for (;;) {
        rtc_getClock(RTC_DEC);
        sprintf (&bufTrx[charIdx], “\nGET RTC Time: %2d.%2d.%4d %2d:%2d:%2d”, (int)rtc.tag, (int)rtc.monat, (int)rtc.jahr, (int)rtc.std, (int)rtc.min, (int)rtc.sek);
        // Ausgabe über Virtuellen COM-Port (USB)
        }
        }

        void rtc_setNewTimeDate(void) {
        RTC_WriteProtectionCmd(DISABLE);
        PWR_BackupAccessCmd(ENABLE);
        RCC_BackupResetCmd(ENABLE);

        UB_RTC.std = 11;
        UB_RTC.min = 11;
        UB_RTC.sek = 11;
        UB_RTC.tag = 11;
        UB_RTC.monat = 11;
        UB_RTC.jahr = 11;
        UB_RTC_SetClock(RTC_DEC);
        }

        Die Funktion rtc_setNewTimeDate() wird 30s nach dem Start ausgeführt und soll testhalber die Zeit umstellen. Die Zeit wird aber nicht verändert, der RTC läuft Stur weiter. Wenn ich den Code per Debug Step-by-Step nachverfolge, komme ich zur Funktion RTC_EnterInitMode() und in dieser soll das INIT Bit im Register RTC->ISR gesetzt werden. Wenn ich das Register im Debug Mode auslese ist es vorher 0×55 und nach:

        #define RTC_INIT_MASK ((uint32_t)0xFFFFFFFF)
        RTC->ISR = (uint32_t)RTC_INIT_MASK;

        ist es immernoch 0×55.

        Mit RTC_SetTime() und RTC_SetDate() geht das bei mir nur, wenn der RTC noch nie initialisiert war. Kann mir bitte wer einen Code geben, der die Uhrzeit eines schon initialisierten RTC verändert?

        • admin_ub sagt:

          lass mal die 3 Zeilen die du da selber reingefummelt hast weg, dann funktioniert das ganze auch.

          void rtc_setNewTimeDate(void) {
          UB_RTC.std = 11;
          UB_RTC.min = 11;
          UB_RTC.sek = 11;
          UB_RTC.tag = 11;
          UB_RTC.monat = 11;
          UB_RTC.jahr = 11;
          UB_RTC_SetClock(RTC_DEC);
          }

          • tueddel sagt:

            Theoretisch, ja. Geht das bei Dir so? Bei mir geht das praktisch nämlich nicht!

  6. admin_ub sagt:

    ui…live chat :-) … hab es hier gerade getestet, geht wunderbar.

  7. admin_ub sagt:

    sende mir mal per mail dein ganzes projekt, wenn das bei mir läuft liegt es doch an deiner hardware.

  8. tueddel sagt:

    Email ist raus, vielleicht siehst Du ja meinen Fehler.

    Danke für Deine Mühen!

  9. tueddel sagt:

    Hab mein Problem beseitigt! Es lag am HS USB Interface, das ich als VCP konfigurtiert hab. Ohne Quellcode für USB konnte ich nämlich den RTC stellen – verifiziert mit LED. ;-)

    Hab meine etwas betagten STM USB Bibliotheken von Version 1.0.0 auf jetzt 1.1.0 aktualisiert. Nun funktioniert alles wie es im Datenblatt steht. Woran es jetzt genau lag, hab ich leider nicht rausgefunden.

    Egal, nun gehts!

    • Hosentraeger sagt:

      ich habe das gleiche Problem, wenn der RTC bereits läuft, kann die Zeit nicht mehr gestellt werden.
      Wo hast du die USB 1.1.0 Libs her?

  10. Joerg sagt:

    Hallo Uwe,
    hast du für dieses Projekt system files angepasst?

    Grüße

    Jörh

    • admin_ub sagt:

      Nur die zwei Files (wie immer) damit der Clock stimmt.
      “stm32f4xx.h” und “system_stm32f4xx.c”

      • Joerg sagt:

        komisch ich hatte nur die fehlenden files in ein anderes Projekt übertragen und da hing sich das Programm beim Init immer auf. Erst als ich die CMSYS Ordner überschrieben hatte lief es. Kann das jetzt aber auch nicht mehr reproduzieren.

  11. Joerg sagt:

    Hast du Funktionen um Zeit und Datum in strings zu wandeln?
    Man muss das Rad ja nicht neu erfinden ;)

    Jörg

    • admin_ub sagt:

      am einfachsten mit “sprintf()”

      #include "stdio.h"
      char time_str[30];
      char date_str[30];
      sprintf(time_str,"Time=%d:%d:%d",UB_RTC.std, UB_RTC.min, UB_RTC.sek);
      sprintf(date_str,"Date=%d.%d.%d",UB_RTC.tag, UB_RTC.monat, UB_RTC.jahr);

      • Joerg sagt:

        Wenn ich sprintf ausführe bekomme ich einen Fehler.

        [cc] c:/program files/gnu tools arm embedded/4.7 2013q2/bin/../lib/gcc/arm-none-eabi/4.7.4/../../../../arm-none-eabi/lib/armv7e-m\libg.a(lib_a-sbrkr.o): In function `_sbrk_r’:
        [cc] sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk’
        [cc] collect2.exe: error: ld returned 1 exit status

        Vielleicht ein bug in der Toolchain? (letztze Version 4.7 2013q2)

        • admin_ub sagt:

          Hast du in der CoIDE die “Retarget printf” componente aktiviert ? die brauchst du dazu.

          • Joerg sagt:

            Hatte ich nicht, ok das war es.

            Danke

  12. Joerg sagt:

    Wo stelle ich den Intervall ein für den Wakeup Interrupt?

    • ManiB sagt:

      Hi Jörg,

      wenn du im Projektcode nach “RTC_WAKEUP_t” suchst, dann wirst du im H-File “stm32_ub_rtc.h” folgende Hinweise finden:


      void UB_RTC_SetWakeUpInterrupt(RTC_WAKEUP_t wakeup);

      Die Funktion “UB_RTC_SetWakeUpInterrupt”, welche du aufrufen musst, ist im C-File “stm32_ub_rtc.c” definiert.

      Ciao,
      ManiB

  13. Joerg sagt:

    hmmm also im main so:

    UB_RTC_SetWakeUpInterrupt(RTC_WAKEUP_1s);

    jetzt wird das was ich in

    #if RTC_USE_WAKEUP_ISR==1
    void P_RTC_WAKEUP_ISR(void)
    {
    Time_Display();
    }
    #endif

    aber nur einmal aufgerufen.

    Normal müsste die Uhrzeit jetzt ja im Sekundentakt angezeigt werden.

    • admin_ub sagt:

      ist die Versorgungs-Spannung eingeschaltet ? wird in der Funktion “Time_Display()” die aktuelle Uhrzeit neu eingelesen “UB_RTC_GetClock” ? versuch mal den Debugger zu nutzen…dafür ist er da.

  14. Frederik sagt:

    Hallo vielen Dank für die tolle Arbeit. Hab nach ein bisschen probieren die Zeit auf meiner 7Segmentanzeige anzeigen können. Gibt es denn auch eine Funktion für den Wochentag oder eine Idee wie man das am einfachsten Realisieren kann ?

    • admin_ub sagt:

      Oh, den Wochentag hab ich vergessen…warte kurz

    • admin_ub sagt:

      Version 1.1 ist jetzt mit Wochentag

      • Frederik sagt:

        Vielen vielen vielen Dank =) hab garnicht mit einer so schnellen und tollen Antwort gerechnet. Eine Frage habe ich allerdings noch aber zu den Interrups wie kann ich es bewerkstelligen das der STM merkt wenn ich ne Taste länger gedrückt halte, also er nicht auf flanken reagiert.

        • admin_ub sagt:

          du kannst in der Interrupt-Routine eine Variable hochzählen lassen, und diese abfragen, wenn die Taste wieder losgelassen wurde. Je höher die Zahl, desto länger war die Taste gedrückt.

  15. Robert sagt:

    Hi,

    ich möchte gern ein WakeUp alle 10ms generieren, aber das geht ja mit dem Uhren-Quarz und den Teilern nicht…

    Was muss ich alles umstellen, um den 8 MHz Quarz zu benutzen?

    Und sehe ich das richtig, dass man das Board einmal vom Saft nehmen muss, um die Einstellungen zu übernehmen? Denn P_RTC_Config wird ja nur aufgerufen, wenn die RTC noch nie initialisiert wurde. Und da reicht flashen allein nicht, sondern nur Spannung weg, korrekt?

    Vielen Dank!

    • admin_ub sagt:

      Nach dem flashen muss die CPU ja irgendwann gestartet werden. Ob per PowerOff oder Reset müsste dann egal sein.

  16. Robert sagt:

    Wenn ich das im Reference Manual richtig sehe, bekommt die 8MHz gar nicht ausreichend herunter geteilt :/

    Habe mir jetzt mit dem Uhren-Quarz einen WakeUp von 10,009765625 ms gebastelt. Hoffe, dass ich damit zurecht komme :)

    • admin_ub sagt:

      wenn du genau 10ms brauchst, kannst du auch den HSE als Clock-Eingang benutzen (allerdings darf der dann nicht größer als 4MHz sein)
      HSE = 4MHZ => Prescaler = 16 => Counter = 2499 => 10,00 ms Wakeup

  17. Michael sagt:

    Hi,

    wenn ich aus deiner Lib das USB-CDC und RTC Beispiel zusammen benutze, kann ich das Datum und die Uhrzeit nicht stellen. Wenn ich UB_USB_CDC_Init(); in der main.c auskommentiere geht es ohne Probleme. Was mache ich da falsch????
    Benutze: ub_stm32f4_rtc_v101 + ub_stm32f4_usb_cdc_v104
    das ganze mit einem STM32F4-Discovery Board.

    • admin_ub sagt:

      die Init-Funktion vom RTC muss als allererstes im Programm gemacht werden. Veschieb die mal bei dir direkt unter den “SystemInit-Aufruf” und mach danach erst die Init vom USB. Dann sollte es auch gehen.

  18. Michael sagt:

    habe es schon so gehabt

    int main(void)
    {
    char buf[APP_TX_BUF_SIZE]; // puffer fuer Datenempfang
    USB_CDC_RXSTATUS_t usb_check=RX_EMPTY;

    SystemInit(); // Quarz Einstellungen aktivieren

    // Init und start der RTC
    UB_RTC_Init();

    // Init vom USB-OTG-Port als CDC-Device
    // (Virtueller-ComPort)
    UB_USB_CDC_Init();
    …….

    geht aber leider nicht

  19. Joerg sagt:

    Warum hast du eigentlich eine eigene structur für die daten angelegt? Bringt das Vorteile? Es gibt doch schon die Structur in der STM32F4xx_RTC

    • admin_ub sagt:

      bin mir nicht mehr sicher warum ich das so gemacht habe. Vielleicht damit es nur “eine” Struktur ist und nicht zwei, wie bei ST “RTC_TimeTypeDef” , “RTC_DateTypeDef”.

  20. Hosentraeger sagt:

    Hi,
    ich möchte noch mal auf das Problem zurückkommen, das tueddel hier in diesem Thread beschrieben hatte.

    Wenn die USB Library als virtueller COM-Port initialisiert ist, funktioniert das Stellen der RTC nicht mehr. Um das zu verdeutlichen, habe ich ein Beispielprojekt gemacht:
    https://github.com/hosentraeger/STM32-RTC-USB
    Das Beispiel liest Datum und Uhrzeit aus und schreibt es in den virtuellen COM-Port.
    Wird der blaue Knopf auf dem Discovery gedrückt, soll das Datum zurückgesetzt werden. Das funktioniert aber nicht!
    Wenn man allerdings das Init der USB-Schnittstelle auskommentiert, funktioniert es tadellos.
    Tueddels Problem war gelöst, nachdem er seine USB-Libraries aktualisiert hatte.
    Das habe ich auch gemacht, und zwar auf die Files aus dem STM32F4-Discovery_FW_V1.1.0.
    Leider hat es nicht geholfen.
    Weiss jemand Rat?

    (Folgende Dateien aus den USB-Libs habe ich getauscht:
    usbd_cdc_core.c
    usbd_cdc_core.h
    usbd_core.c
    usbd_core.h
    usbd_def.h
    usbd_ioreq.c
    usbd_ioreq.h
    usbd_req.c
    usbd_req.h
    usbd_usr.h
    usb_bsp.h
    usb_core.c
    usb_core.h
    usb_dcd.c
    usb_dcd.h
    usb_dcd_int.c
    usb_dcd_int.h
    usb_defines.h
    usb_regs.h)

    • admin_ub sagt:

      Hi, dein Beispiel liefert viele “Errors”, aber ich hab mit deiner Main selbst ein Projekt aufgesetzt und da ist ein übler BUG drin !!
      1. Die RTC-Lib schaltet den Clock vom “RCC_APB1Periph_PWR” auf enable
      2. Die USB-Lib schaltet auch den Clock von “RCC_APB1Periph_PWR” enable

      einzeln funktionieren beide Librarys, aber in Kombination nicht mehr !!
      Um den Fehler bei dir zu beseitigen : öffne das File “usb_bsp.c” und lösche in der Funktion “USB_OTG_BSP_Init” die letzte Zeile “RCC_APB1PeriphResetCmd(RCC_APB1Periph_PWR, ENABLE);”

      in der Library selbst kann ich das nicht fixen…ich muß das als Hinweis aufschreiben

      • Hosentraeger sagt:

        damit läuft es!!!! Super, vielen Dank!

  21. Emilia sagt:

    Hi, hat schon jemanden mit dem DS 3234 oder DS 3132 versucht?.
    Ich möchte DS mit DCF77 signal synchronisieren aber leider ich schaffe es bis jetzt nicht weißt jemand ob schon ein Bibliothek für DCF77 bzw. für DS in STM32F4 gibt.
    danke

    • Joerg B. sagt:

      Warum ein extra RTC Chip? Ist doch im STM32F4 integriert.

      Wo mit empfängst du denn das DCF Signal?

    • admin_ub sagt:

      ist dein Problem das “syncronisieren” von DCF77 und RTC oder hast du allgemeine Probleme beide zum laufen zu bekommen ? Der DS3234 ist sehr einfach zu benutzen so wie ich das Datenblatt überflogen habe einfach per SPI-Mode3 anschließen und die Adress-Map von Seite 12 benutzen. z.B. Um die Minuten auszulesen : SPI_Read auf Adresse 0×01 und um die Minuten zu schreiben SPI_Write auf Adresse 0×81. Falls ich dir da was “vorbereiten” soll, schreib einfach nochmal.

  22. Emilia sagt:

    Hallo , danke Joerg B und admin_ub für die Antwort,
    eigentlich mein Problem ist das synchronisieren und DS zum laufen bringen.ich habe die DCF Signal schon dekodiert jetzt arbeite ich an DS 3234 .Dank der fertigen Bibliotheken hier könnte ich viele kleine Probleme selbst lösen.aber wie es scheint ich brauche für die beiden auch eigene library was mir momentan noch kompliziert ist .Ich bin Anfängerin im Bereich des Mikrocontroller und fehlt mir noch viele Wissen dafür :-( .
    Ich empfänge das Signale mit DCF77 antenne von Conrad. DS3234 ist sehr genauer als STM32F4 RTC falls für lange zeit keine Signal empfangen wurde. Ich werde jetzt mit SPI-Mode3 versuchen.

  23. Christian Julius sagt:

    Hallo,

    diese Geschichte mit dem Bug ist nicht ganz klar. Ich aktiviere das BKRAm bereits im Startup Code. Und wieso kann man ein register nicht 2 Mal setzen? Das macht doch dem Bit da drin nichts aus.

    • admin_ub sagt:

      ich habe den Fehler jetzt nicht mehr genau im Kopf. Aber einige Konfigurationen kann man nur einmal nach dem PowerOn machen. Ließ das RefManual wenn du genaueres wissen willst.


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert