Forum: Mikrocontroller und Digitale Elektronik Cortex M3: komisches Phänomen


von Tobias P. (hubertus)


Lesenswert?

Hallo Leute,
Ich habe bei meinem STM32 Discovery ein sonderbares Phänomen bemerkt. 
Ich habe in einem simplen popligen Testprogramm den Systick-Timer 
initialisiert und den entsprechenden Vektor im VIC programmiert - und 
sofort ist der Timer los gelaufen und der Interrupt hat getriggert, 
obwohl ich ihn gar nicht explizit enabled habe. Sonst muss man doch noch 
mit SETENA den Interrupt aktivieren bevors funktioniert! Warum beim 
Systick nicht?

von MyName (Gast)


Lesenswert?

Code?

von Tobias P. (hubertus)


Lesenswert?

Hab ich leider erst heute Abend zur Hand, sitze im Büro...

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Hast Du die CMSIS Funktion SysTick_Config() verwendet? Die setzt 
hilfreicherweise auch gleich das Enable Flag im CTRL Register.

von Tobias P. (hubertus)


Lesenswert?

Hallo,


also ich verwende folgenden Code:
1
SYSTICKRVR = 10000;
2
SYSTICKCSR = (BIT_00 | BIT_01);

und dann rennt der Timer los. Was ansich auch toll ist, aber eben, ich 
hätte erwartet, dass ich den Interrupt erst mal noch hätte freischalten 
müssen?

von tom (Gast)


Lesenswert?

???

wenn du einen beliebigen timer auf einem beliebigem uC konfigurierst 
(clock source, etc.) und startest läuft er NATÜRLICH los.
OB er dann bei overflow einen interrupt zieht ist dann eine zweite 
sache.
beim cortex-m3 musst du dann den nvic konfigurieren und natürlich auch 
die entsprechende isr im xxxit.c file implementieren bzw. mit deinem 
code befüllen.

gutt lack

von Tobias P. (hubertus)


Lesenswert?

Ja, mit "der Timer läuft los", meinte ich, dass der Interruptvektor 
angesprungen wird. Ich habe mit
1
#pragma align 1204
2
uint32_t vector_table[] =
3
{
4
  /* ... */
5
  (uint32_t)systick_irq,
6
  /* .. */
7
};
8
9
void systick_irq(void)
10
{
11
  /* ... */
12
}

und mit
1
VTOR = (uint32_t)vector_table;

eine Vektortabelle erstellt. Weitere initialisierungen beim NVIC nehme 
ich nicht vor, und trotzdem wird systick_irq() aufgerufen -- und das 
verstehe ich nicht. Nach meinem Dafürhalten müsste ich ja erst noch, wie 
du selber ja auch sagst, den entsprechenden Interrupt im NVIC überhaupt 
aktivieren.

von Roland H. (batchman)


Lesenswert?

> und dann rennt der Timer los. Was ansich auch toll ist, aber eben, ich
> hätte erwartet, dass ich den Interrupt erst mal noch hätte freischalten
> müssen?

Es ist ungewohnt, dass er das so macht.

Allerdings ist es so dokumentiert:

Aus dem "tech ref manual"

Bit

[1] TICKINT 1 = counting down to 0 pends the SysTick handler.
            0 = counting down to 0 does not pend the SysTick handler. 
Software can use the COUNTFLAG
            to determine if ever counted to 0.

Bin ich auch drüber gestolpert, denn als ich den NVIC in der "gewohnten" 
Art für den Systick konfiguriert hatte, dann ging gar nix mehr.

von Turbo J (Gast)


Lesenswert?

>  NVIC in der "gewohnten" Art für den Systick konfiguriert hatte [...]

LOL. Der Systick geht nicht wirklich durch den NVIC, denn er ist kein 
(externer) Interrupt sondern eine Prozessor-Exception. Das ist IMO 
bereits im ARM ARM für ARMv7-M so spezifiziert. Deshalb gibt es für ihn 
gar kein Enable- Bit im NVIC, genausowenig wie für die anderen 
Exceptions (PendSV bis NMI).

von (prx) A. K. (prx)


Lesenswert?

Der Systick erzeugt keinen normalen Interrupt, sondern eine System 
Exception.

Man muss sich hier vor Augen halten, dass der Systick ein Teil des 
Cortex Cores ist, nicht der vom Integrator (ST, NXP, ...) hinzugefügten 
Peripherie. Der NVIC ist das zwar auch, aber dessen Interrupt-Eingänge 
und Steuerregister stehen sämtlich dem Integrator zur Verfügung. Der 
Systick erzeugt keinen Interrupt, sondern eine Exception analog zu den 
Bus- und Memory Faults.

Status und Steuerung von Exceptions erfolgt deshalb nicht über die 
Interrupt Register, sondern über die System Handler Register. Und da ist 
kein Register für Enable Bits vorgesehen - weils für die anderen 
Exceptions keinen Sinn ergibt. Das Enable Bit der Systick Exception ist 
also das in dessen Control Register und wenn man das setzt - wie oben 
getan - dann gehts eben ab.

von Roland H. (batchman)


Lesenswert?

> Der Systick erzeugt keinen normalen Interrupt, sondern eine System
> Exception.

Jetzt kommt Licht ins Dunkel. Das erklärt einiges. Auf den ersten Blick 
verwirrt es, weil der NVIC auch Teil des Cores ist.

Wo wir schon beim Systick sind: Weiß jemand, warum es unbedingt ein 
24-Bit-Counter sein musste?

von (prx) A. K. (prx)


Lesenswert?

Vermutlich weils so billiger ist als ein 32-Bit Counter und 16 Bits für 
sowas zu wenig wären.

von holger (Gast)


Lesenswert?

>Wo wir schon beim Systick sind: Weiß jemand, warum es unbedingt ein
>24-Bit-Counter sein musste?

Das hab ich mich auch schon gefragt.
32 Bit Maschine und nur ein 24Bit Systick.
Und warum nicht gleich 64Bit? Bei 1ms Ticks dürfte
keiner von uns mehr einen Timerüberlauf erleben;)

>Vermutlich weils so billiger ist als ein 32-Bit Counter

Die paar Flipflops mehr machen den Bock auch nicht mehr fett.

von (prx) A. K. (prx)


Lesenswert?

holger schrieb:
> Die paar Flipflops mehr machen den Bock auch nicht mehr fett.

Fällt dir ein überzeugenderes Argument ein?

> Und warum nicht gleich 64Bit? Bei 1ms Ticks dürfte
> keiner von uns mehr einen Timerüberlauf erleben;)

Dann bräuchte man aber zwei Register. Eines kleines um den 1ms Tick zu 
erzeugen, und ein zweites grosses um diese Ticks zu zählen.

von holger (Gast)


Lesenswert?

>holger schrieb:
>> Die paar Flipflops mehr machen den Bock auch nicht mehr fett.
>
>Fällt dir ein überzeugenderes Argument ein?

Nein, sollte ja auch keine Kritik sein. Nur ne Anmerkung.

von Roland H. (batchman)


Lesenswert?

> Vermutlich weils so billiger ist als ein 32-Bit Counter und 16 Bits für
> sowas zu wenig wären.

Dann hätten sie auch auf das SysTick Calibration Value Register 
verzichten sollen.

Denn leider kann man f = 1 Hz mit dem Systick meistens nur umständlich 
realisieren.

von (prx) A. K. (prx)


Lesenswert?

Roland H. schrieb:
> Denn leider kann man f = 1 Hz mit dem Systick meistens nur umständlich
> realisieren.

Wobei 1Hz für einen solchen Timer aussergewöhnlich lang ist. 
Üblicherweise bewegen sich solche Tick im Bereich 1-10ms. Für 
Sekundentakt ist bei solchen Prozessoren eine Echtzeituhr zuständig. Ode 
ein Zähler, der im schnellen Systick Handler hochgezählt wird.

von Roland H. (batchman)


Lesenswert?

>> Denn leider kann man f = 1 Hz mit dem Systick meistens nur umständlich
>> realisieren.
>
> Wobei 1Hz für einen solchen Timer aussergewöhnlich lang ist.
> Üblicherweise bewegen sich solche Tick im Bereich 1-10ms. Für
> Sekundentakt ist bei solchen Prozessoren eine Echtzeituhr zuständig.

Nun, beim msp430 nimmt man den "watchdog timer". Ob der dem Namen nach 
zuständig ist :-) ?

Die Echtzeituhr ist leider nicht Teil des Cores.

> Oder ein Zähler, der im schnellen Systick Handler hochgezählt wird.

So habe ich es letztlich auch realisiert. Das meinte ich mit 
"umständlich" :-)

Bis auf das "Power control register" in der jeweiligen Variante ist dann 
der Code für den (einfachsten) "sleep mode" zusammen mit dem Systick 
zwischen den CM3/CM4 portabel.

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.