Laufzeit mit RTC STM32

OP #2880334
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.
#2880352
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.
Gast #2880623
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.
OP #2881364
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.
#2881848
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren