Forum: Mikrocontroller und Digitale Elektronik RTC Inbetriebnahme STM32F4


von RTC (Gast)


Lesenswert?

Hallo, ich benötige ein wachsames Auge, welches mir einen eventuellen 
Fehler bei der Inbetriebnahme der RTC bei einem STM32F4 aufzeigt.

Init der RTC
1
void rtc_init(void){
2
  RTC_InitTypeDef  RTC_InitStructure;
3
4
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
5
6
  PWR_BackupAccessCmd(ENABLE);
7
8
  RCC_BackupResetCmd(ENABLE);
9
  RCC_BackupResetCmd(DISABLE);
10
11
  RCC_LSICmd(ENABLE);
12
13
  while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)  { }
14
15
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
16
17
  RCC_RTCCLKCmd(ENABLE);
18
19
  RTC_WaitForSynchro();
20
21
  RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
22
  RTC_InitStructure.RTC_SynchPrediv  = 0xFF;
23
  RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;
24
  RTC_Init(&RTC_InitStructure);
25
26
}

Einstellen der Uhrzeit:
1
ur_sh_set_rtc(20,15,12);
2
3
void set_rtc(int Hour,int Min,int Sec){
4
  RTC_TimeTypeDef  RTC_TimeStructure;
5
6
  RTC_TimeStructure.RTC_Hours   = Hour;
7
  RTC_TimeStructure.RTC_Minutes = Min;
8
  RTC_TimeStructure.RTC_Seconds = Sec;
9
  RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure);

Auslesen der Uhrzeit:
1
int TimeStamp[3]={0,0,0};
2
3
int get_rtc(){
4
  RTC_TimeTypeDef RTC_TimeStructure;
5
  
6
  TimeStamp[0] = RTC_TimeStructure.RTC_Hours;
7
  TimeStamp[1] = RTC_TimeStructure.RTC_Minutes;
8
  TimeStamp[2] = RTC_TimeStructure.RTC_Seconds;
9
10
  return *TimeStamp;
11
}

Leider wird beim Auslesen unter TimeStamp[0] nur der Wert 0x0000001
hinterlegt, alle anderen Werte sind 0x0000000

Weiss momentan nicht weiter und hoffe auf einen Tipp Eurerseits.
Danke!

von ./. (Gast)


Lesenswert?

Beim F10x musste man noch der Backupdomain die Spannungsversorgung 
einschalten. Das sehe ich nicht.

von ./. (Gast)


Lesenswert?

P.S.: Ich habs jetzt doch in Deinem Code gesehn.

Ich wuerds aber im Debugger mal kontrollieren.

von holger (Gast)


Lesenswert?

Wie wärs mit RTC_GetTime()?

von RTC (Gast)


Lesenswert?

Danke Holger, das hatte ich vergessen.
Die RTC läuft nun allerdings mit unplausiblen werten :(
Start war um 14:30 Uhr
Ein auslesen um 14:36 Uhr brachte eine Uhrzeit von 14:19 Uhr

von RTC (Gast)


Lesenswert?

Nun verzweifel ich eher an der Rückgabe der Werte die per CAN versendet 
werden sollen....
da ich mit Pointern arbeiten muss ist mir das alles noch nicht so ganz 
klar.

Aufrufendes C File:
1
extern int *TimeStamp[3]={0,0,0};
2
3
  if (RxMessage.StdId == ID && d[0] == 0x54 && d[1] == 0x47){ //Anfrage mit ID und TG im Datenfeld Ruft Zeitstempel ab
4
    
5
      CanTxMsg TxMessage;
6
    
7
      ur_sh_get_rtc();
8
    
9
    
10
      TxMessage.StdId = ID;            //Standart Identifier
11
      TxMessage.RTR = CAN_RTR_DATA;       //Data frame
12
      TxMessage.IDE = CAN_ID_STD;         //Standart Identifier
13
      TxMessage.DLC = 3;                  //length of the frame
14
        
15
      TxMessage.Data[0] = *TimeStamp[0];
16
      TxMessage.Data[1] = *TimeStamp[1];
17
      TxMessage.Data[2] = *TimeStamp[2];
18
    
19
      CAN_Transmit(CAN2, &TxMessage);
20
  }

Aufgerufenes C File:
1
int* TimeStamp[3]={0,0,0};
2
3
void ur_sh_get_rtc(){
4
  RTC_TimeTypeDef RTC_TimeStructure;
5
  
6
  RTC_GetTime(RTC_Format_BCD, &RTC_TimeStructure);
7
  *TimeStamp[0] = RTC_TimeStructure.RTC_Hours;
8
  *TimeStamp[1] = RTC_TimeStructure.RTC_Minutes;
9
  *TimeStamp[2] = RTC_TimeStructure.RTC_Seconds;
10
11
  //RTC_GetTime(RTC_Format_BCD,);
12
13
  }

Leider weigert sich der Compiler mit der Antwort das "TimeStamp" doppelt 
deklariert sei.
Aber das ist es doch normalerweise durch "extern" nicht oder habe ich da 
was falsch verstanden?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.