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?
Hast Du die CMSIS Funktion SysTick_Config() verwendet? Die setzt hilfreicherweise auch gleich das Enable Flag im CTRL Register.
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?
??? 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
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.
> 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.
> 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).
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.
> 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?
Vermutlich weils so billiger ist als ein 32-Bit Counter und 16 Bits für sowas zu wenig wären.
>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.
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.
>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.
> 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.
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.
>> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.