Cortex M3: komisches Phänomen

OP #2797604
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?
Gast #2799101
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
OP #2799114
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.
#2800213
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.
Gast #2800224
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).
#2800239
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.
#2800334
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?
Gast #2800341
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.
#2800344
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.
#2800655
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.
#2808470
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.

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