Forum: Mikrocontroller und Digitale Elektronik Laufzeit mit RTC STM32


von Ma B. (drumstick)


Lesenswert?

Hallo

Ich arbeite mit dem STM32F103VCT6 und dem uVision von KEIL.

Meine Aufgabe ist es, die Laufzeit unseres Antriebes zu erfassen, bzw. 
auf request an einen anderen Knoten zu senden. Ich habe beschlossen, 
dass die Erfassung der Stunden genügt. Jetzt wollte ich den RTC so 
konfigurieren, dass er alle Stunde einen Interrupt auslöst.
1
RTC_ITConfig(RTC_IT_SEC, ENABLE);
1
   RCC_ClearFlag();
2
   RCC_HSEConfig(RCC_HSE_ON);
3
  while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET)
4
  {
5
  }
6
  RTC_EnterConfigMode();
7
  RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);
8
  RCC_RTCCLKCmd(ENABLE);
9
  RTC_WaitForSynchro();
10
  RTC_WaitForLastTask();
11
  RTC_ITConfig(RTC_IT_SEC, ENABLE);
12
  RTC_WaitForLastTask();  
13
  RTC_SetPrescaler(25000);
14
  RTC_WaitForLastTask();
15
  RTC_SetCounter(0);
16
  RTC_ExitConfigMode();
17
  RTCStat = RTC_GetITStatus(RTC_IT_SEC);
18
  NVIC_EnableIRQ(RTCAlarm_IRQn);

[c]
uint32_t RTC_CNT = 0:
BOOL RTCIRQ = false;
void RTC_IRQHandler(void)
{
  RTC_ClearITPendingBit(RTC_IT_SEC);

  RTC_CNT++;

  if(RTCIRQ == false)
  {
    RTCIRQ = true;
  }
  else
  {
    RTCIRQ = false;
  }
}
[c]

Jetzt finde ich aber nur das RTCAlarm_IRQn  Number Definitionbit, eins 
für RCTSec oder RTCOver siehe ich nicht.

Ich sehe beim RTC noch nicht ganz durch. Oder gibt es eine bessere 
Lösung?

Vielen Dank und Gruss!

M.B.

von Ma B. (drumstick)


Lesenswert?

Ich habe den Code von einem Beispiel.

Den Wert,den ich in der IRQ incrementiere, würde ich dann natürlich noch 
durch 3600 teilen. Es wir aber gar nie ein Interrupt ausgelöst. Ich 
vermute eben, weil es nur für den Alarm einen Interrupt gibt!?

von Daniel K. (daniel_k14)


Lesenswert?

M. B. schrieb:
> Ich habe beschlossen,
> dass die Erfassung der Stunden genügt. Jetzt wollte ich den RTC so
> konfigurieren, dass er alle Stunde einen Interrupt auslöst.

Es geht zwar komplett an deinem Problem vorbei, aber trotzdem...
Eine Zwischenfrage/Denkanstoß:
Wie lange ist das Gerät im Durchschnitt in Betrieb? Kann es z.B. 
passieren, dass das Gerät nach 59 Minuten Betriebsdauer komplett 
ausgeschaltet wird und der Interrupt gar nicht erreicht wird? Dann wäre 
das Stundenraster zu überdenken.

von Ma B. (drumstick)


Lesenswert?

Es sind Beschattungsysteme, die nur bei Stromausfall oder Wartung 
ausgeschaltet werden.

von Max (Gast)


Lesenswert?

Interrupts mit solangen Periodendauer sind in der Regel keine gute Idee. 
Allein der Zeitaufwand zum testen.

Benutze stattdessen den Sekundeninterrupt des RTC und lass darin eine 
Varibabe hochzählen und wenn der Stundenwert erreicht ist führe die 
entsprechende Routine aus.

Ob man dazu überhaupt den RTC braucht? Der Systick könnte das auch.

von Ma B. (drumstick)


Lesenswert?

ja, der SysTick wäre ideal. ich habe auch ein Beispiel von ST. Das 
verstehe ich aber nicht. Vielleicht liegt es daran. dass SysTick nicht 
in der StdLib vorkommt sondern nur im CMSIS.
1
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
2
  SysTick_Config(2500000 / 1000); // = 1ms

Diese Zeile konnte ich entziffern.
1
BOOL systick = false;
2
3
void SysTick_Handler(void)
4
{
5
  systick = true;
6
}

Hier erhalte ich folgende Meldung:

.\Obj\Frontego_OS.axf: Error: L6200E: Symbol SysTick_Handler multiply 
defined (by hal_cm3.o and motor.o).


Ich denke ich muss doch noch den Interrupt des SysTick enabeln, aber wo 
mach ich das?



Danke und Gruss!

M. B.

von Thomas W. (diddl)


Lesenswert?

Ne enabled ist der schon mit der Funktion.

Das Problem ist eine mehrfache definition der Systick Funktion.


Ich nehme an du hast ein Modul motor.c? Es gibt auch noch ein Modul 
"hal_cm3.c" wo der Systick bereits definiert wurde.

Entweder du nimmst die Funktion da raus oder du rufst von da einen 
eigenen Systick (mit anderem Namen!) auf. oder du schreibst deinen 
Systick Code gleich da rein.

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.