Grundlegendes zu Timern, Zählern und Prescaler-Registern auf dem STM32

Also versuche ich, einen sehr einfachen periodischen Interrupt auf meinem STM32VL-Discovery-Board mit den libopencm3-Bibliotheken unter Linux einzurichten. Ich habe mir die Dokumentation angesehen und möchte mich nur mit jemandem vergewissern, dass ich verstehe, was vor sich geht.

Mein Verständnis ist, dass das Prescaler-Register die interne Uhr auf eine andere Frequenz / Uhr skaliert, die der Timer tatsächlich sieht. dh Sie stellen das Timer-Prescaler-Register auf 24 MHz/DesiredHz ein, damit der Timer mit der gewünschten Frequenz arbeitet. Ist das richtig?

Angenommen, das ist richtig, sagen wir, ich möchte bei jedem Timer-Taktzyklus einen Interrupt generieren. Ich habe in den Dokumenten nichts gesehen, was mir dies ermöglichen würde, außer das Periodenregister auf 1 zu setzen. Dies würde bei jeder Uhr einen Überlauf-Interrupt erzeugen, richtig?

Das klingt ungefähr richtig, aber die Schwierigkeit liegt immer im Detail, einschließlich der Erinnerung daran, zuerst alles einzuschalten und die Uhr zu aktivieren. Die Peripheriebibliotheken der STM32-Serie enthalten viele Beispiele, Sie könnten zuerst nach einem Timer-Interrupt-Beispiel suchen. Wenn nicht, können Sie an anderer Stelle in der STM32-Serie nachsehen, da die Gesamtmethoden in der Regel vergleichbar sind, obwohl die spezifischen Register, Aufrufe und Peripheriebuszuweisungen zwischen den Familien unterschiedlich sind.
Siehe (etwas) verwandt zum Einstellen der Uhren im STM32: electronic.stackexchange.com/questions/58863/…
Danke Leute. Was ich getan habe, hat funktioniert. Ich wollte es nur besser verstehen und Sie beide haben mir das ermöglicht.

Antworten (1)

Wenn Sie das Periodenregister einfach auf 1 setzen, wird die Interrupt-Generierung nicht automatisch aktiviert. Sie müssen 2 zusätzliche Schritte ausführen:

  1. Aktivieren Sie den 'Update'-Interrupt für Ihren Timer mit der Funktion TIM_ITConfig().
  2. Aktivieren Sie die Timer-Interrupt-Quelle im Interrupt-Controller durch Aufrufen von NVIC_Init() mit geeigneten Parametern.

Natürlich sollten Sie nicht vergessen, die Taktung Ihrer Timer-Peripherie mit APB1PeriphClockCmd() zu aktivieren.

Hier finden Sie ein detailliertes Beispiel zum Konfigurieren von Timern auf STM32F4-Discovery: http://visualgdb.com/tutorials/arm/stm32/timers/

STM32VL-Discovery ist etwas anders, aber die Hauptschritte sind die gleichen.