[Link].
at
Mikrocomputer
STM32 NUCLEO-F334R8
- Timer und Interrupt
WS2021
Dipl.-Ing. Thomas Leopold, Dipl.-Ing. Daniel Hauer
TU Wien
Institute of
1
Computer Technology
[Link]
Institute of
[Link]@[Link] 2
Computer Technology
[Link]
1. Welche GPIO-Port Konfigurationsmöglichkeiten gibt es?
2. Was bedeutet „Alternate function“?
3. Welche Schritte sind nötig, um eine LED zum Leuchten zu bringen?
Institute of
[Link]@[Link] 3
Computer Technology
[Link]
GPIO
▪ 5 Ports mit insgesamt 51 General-Purpose I/O Pins
▪ Konfiguration via: MODER, OTYPER, OSPEEDR, PUPDR
▪ Datentransfer via: IDR, ODR (und BSRR)
▪ Alternate function zur direkten Verbindung mit Peripherie-Einheiten
Institute of
[Link]@[Link] 4
Computer Technology
[Link]
GPIO Pin Konfigurationsmöglichkeiten (1)
▪ Mode (Register MODER)
• Input
• Output
• Alternate Function
• Analog
▪ Output Type (Register OTYPER)
• Open Drain (nur N-MOS)
• Push Pull (P- und N-MOS)
Institute of
[Link]@[Link] 5
Computer Technology
[Link]
GPIO Pin Konfigurationsmöglichkeiten (2)
▪ Output Speed (Register OSPEEDR)
• Low speed
• Medium speed
• High speed
▪ Pull-up/Pull-down (Register PUPDR)
• Pull-up Widerstand
• Pull-down Widerstand
• Kein Pull-up oder Pull-down
Institute of
[Link]@[Link] 6
Computer Technology
[Link]
LED Variante 1A: Registeradressen beschreiben
int main () {
// 1. Schritt: Aktivierung des GPIO Port über den AHB
*((unsigned long *) 0x40021014) |= 1<<17;
// 2. Schritt: Pin A.5 muss als Push-Pull Ausgang konfiguriert werden
*((unsigned long *) 0x48000000) |= 1<<10;
// 3. Schritt: Pin auf '1' setzen, um die LED zum Leuchten zu bringen
*((unsigned long *) 0x48000014) |= 1<<5;
// endlose while-Schleife
while(1);
Institute of
[Link]@[Link] 7
Computer Technology
[Link]
LED Variante 1B: „Registernamen“ beschreiben
#include "stm32f3xx.h“
int main () {
// 1. Schritt: Aktivierung des GPIO Port über den AHB
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
// 2. Schritt: Pin A.5 muss als Push-Pull Ausgang konfiguriert werden
GPIOA->MODER |= GPIO_MODER_MODER5_0;
// 3. Schritt: Pin auf '1' setzen, um die LED zum Leuchten zu bringen
GPIOA->ODR |= GPIO_ODR_5;
while(1);
}
▪ Kein Unterschied im Maschinencode zu Variante 1A
Institute of
[Link]@[Link] 8
Computer Technology
[Link]
Vergleich Variante 1A und 1B
Variante 1A Variante 1B
▪ Assembler-Code:
▪ Code-Size:
→exakt der gleiche Assemblercode
Institute of
[Link]@[Link] 9
Computer Technology
[Link]
Firmware Library
▪ Ansammlung an Variablen, Funktionen und Dateien, die das direkte
Beschreiben der Register übernehmen
▪ Vereinfacht das Lesen, Erzeugen und Warten von Code
▪ Der erzeugte Maschinencode ist nicht mehr unmittelbar ersichtlich
▪ Ein gutes Verständnis des Grundkonzepts der Mikrocontroller-
Programmierung ist essentielle Voraussetzung für die Verwendung
von Code-Generatoren oder Firmware Libraries
▪ → Die semantische Lücke wird größer!
Institute of
[Link]@[Link] 10
Computer Technology
[Link]
LED Variante 1C: Firmware Library
...
// 1. Schritt: Aktivierung des GPIO Port über den AHB
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
// 2. Schritt: Pin A.5 muss als Push-Pull Ausgang konfiguriert werden
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 3. Schritt: Pin auf '1' setzen, um die LED zum Leuchten zu bringen
GPIO_SetBits(GPIOA, GPIO_Pin_5);
while(1);
...
Institute of
[Link]@[Link] 11
Computer Technology
[Link]
... und heute …
▪ Timer
▪ NVIC
▪ Beispiel: Die LED blinkt (mit Interrupt)
Institute of
[Link]@[Link] 12
Computer Technology
[Link]
Timer
Institute of
13
Computer Technology
[Link]
Timer – Grundfunktionen
▪ Counting
• Timer zählt mit einem definierten Takt in einem Counter-Register
• Zähltakt lässt sich über einen Prescaler einstellen (Quelle: Bustakt)
• Verschiedene Zählrichtungen: Up, Down, Up-Down
• Timer löst ein Event aus, wenn Overflow bzw. ein Zielwert erreicht ist
• Zielwert wird über das Auto-Reload-Register (ARR) eingestellt
• Beispiel:
− Periodischer Aufruf eines Algorithmus (mittels Interrupt)
Institute of
[Link]@[Link] 14
Computer Technology
[Link]
Timer – Grundfunktionen
▪ Capture/Compare Channels
• Interagieren direkt mit Eingangs- bzw. Ausgangspins
• Input Capture:
− Bei einem Eingangsevent wird der aktuelle Zählstand gespeichert
− Beispiel: Messen der Signalfrequenz an einem Pin durch Abspeichern des
Zählstandes bei steigenden Flanken ( = Eingangsevent) am Pin
• Output Compare:
− Zählstand wird mit einem Compare-Wert verglichen (unabhängig von ARR)
− Ausgangspin kann dadurch gesteuert werden
− Beispiel: PWM Ausgabe
– Periodendauer via Auto-Reload-Wert, Duty-Cylce via Compare-Wert
Institute of
[Link]@[Link] 15
Computer Technology
[Link]
Timer
▪ Der STM32F334R8 besitzt verschiedene Timer:
• Advanced control Timer – TIM 1
• General purpose Timer – TIM 2/3/15/16/17
• High resolution Timer – HRTIM
• Basic Timer – TIM 6/7
• Nicht jeder Timer unterstützt alle Funktionen, jeder ist für bestimmte
Aufgaben optimiert (z.B. Basic Timer für einfaches Zählen)
▪ Die Timer erhalten ihren Takt von den APB-Bussen
• Wenn APB Prescaler = 1, dann ist der Timertakt (fCK_PSC) gleich dem APB Takt
• Wenn APB Prescaler ≠ 1, dann ist der Timertakt (fCK_PSC) der APB Takt x 2
• Ihr Zähltakt wird intern durch einen Prescaler reduziert
Institute of
[Link]@[Link] 16
Computer Technology
[Link]
Timer 2 – General Purpose Timer
▪ Up-counting, Down-counting, Up/Down-counting
▪ Input Capture, Output Compare (PWM)
▪ Basisregister:
• Counter Register (TIMx_CNT)
• Prescaler Register (TIMx_PSC)
• Auto-Reload Register (TIMx_ARR)
▪ Prescaler dividiert die Taktfrequenz vom Bus durch einen 16 Bit Wert
• Division durch 1-65536
Institute of
[Link]@[Link] 17
Computer Technology
[Link]
Timer 2 – Counting Update Event bei
Gleichheit
Mit diesem Register
Auto-reload
wird verglichen
Timer-Enable
Prescaler Counter In diesem Register
wird gezählt
fCK_PSC Timer-Takt
▪ Prescaler (PSC): 16 Bit
▪ Timer-Takt = fCK_PSC / (PSC[15:0] + 1)
▪ Institute of 18
[Link]@[Link]
Computer Technology
[Link]
Timer 2 – Prescaler und Auto-reload Register
▪ Beide Register wirken sich nicht direkt/sofort auf die Funktion des
Timer aus
▪ Ein neuer Prescaler Wert wird erst nach einem Update-Event
übernommen
▪ Das Auto-reload Register besitzt ein „Shadow Register“, welches vom
Timer verwendet wird, aber nicht direkt beschrieben werden kann
▪ Abhängig von dem ARPE Bit im TIM_xCR1 Register wird
• Der neue Auto-reload Wert erst nach dem nächsten Update-Event in das
„Shadow Register“ übernommen (ARPE = 1)
• Der neue Auto-reload Wert sofort in das „Shadow Register“ übernommen
(ARPE = 0)
Institute of
[Link]@[Link] 19
Computer Technology
[Link]
Timer 2 – Auto-reload Update: ARPE=0
Institute of
[Link]@[Link] 20
Computer Technology
[Link]
Timer 2 – Auto-reload Update: ARPE=1
Institute of
[Link]@[Link] 21
Computer Technology
[Link]
Timer 2 – Prescaler Update
Institute of
[Link]@[Link] 22
Computer Technology
[Link]
Timer 2 – Upcounting
▪ Timer zählt von 0 bis zum Auto-reload Wert
▪ Beim Erreichen wird ein Update Event ausgelöst und das Update
Interrupt Flag UIF im Status Register TIMx_SR gesetzt
Institute of
[Link]@[Link] 23
Computer Technology
[Link]
Timer 2 – Downcounting
▪ Timer zählt vom Autoreload Wert bis 0 hinunter
▪ Beim Erreichen von 0 wird ein Update Event ausgelöst und das
Update Interrupt Flag UIF im Status Register TIMx_SR gesetzt
Institute of
[Link]@[Link] 24
Computer Technology
[Link]
Timer 2 – Up/Downcounting
▪ Timer zählt vom 0 bis zum Autoreload Register und löst einen
Counter Overflow aus
▪ Dann zählt er bis 0 herunter und löst einen Counter Underflow aus
Institute of
[Link]@[Link] 25
Computer Technology
[Link]
Nested Vectored Interrupt Controler
(NVIC)
Institute of
26
Computer Technology
[Link]
NVIC
▪ Der NVIC des STM32F334R8 besitzt 73 Interrupt Channels
▪ Jeder Channel hat eine Priorität (4 Bit) die unterteilt ist in
• Gruppen Priorität (Group Priority)
• Sub-Gruppen Priorität (Subgroup Priority)
• Interrupts mit höherer Gruppenpriorität können niedrigere unterbrechen
• Sub-Gruppen dienen der Reihung der nächsten auszuführenden Interrupts
• Reset-Wert: 16 Gruppen, 0 Sub-Gruppen
▪ Jedem Channel ist ein Interrupt Handler (eine Interrupt Funktion)
zugeordnet, der aufgerufen wird, wenn der Interrupt ausgelöst wird
▪ Name der Interrupt Funktion ist vorgegeben (case-sensitiv)
Institute of
[Link]@[Link] 27
Computer Technology
[Link]
Interrupt
CHx Interrupt Handler
NVIC
Interrupt Channels CH1 CH2 CHx
Clear Pending Bit
Update Cap./Comp.
Peripherie Interrupt
(Pending Bit wird gesetzt)
TIM2 Peripherie X
Institute of
[Link]@[Link] 28
Computer Technology
[Link]
Interrupts verwenden
▪ Interruptquelle in der jeweiligen Peripherie aktivieren
• Im „… interrupt enable register“ (z.B. Update Interrupt von TIM2)
• Nur dann wird aus einem Event auch ein Interrupt Request
▪ Zugehörigen Interrupt Channel in dem NVIC konfigurieren
• Aktivieren und Priorität vergeben
▪ Interrupt Handler programmieren
• Name des Channels ist in den Startup-Files definiert (z.B. „TIM2_IRQHandler“)
• Aktuelle Interrupt Quelle kann aus Interrupt Flags ausgelesen werden
(mehrere Quellen können sich ja einen Channel teilen)
• Das Pending Bit (Interrupt Flag) der Peripherie muss „händisch“ rücksetzen
werden, sonst wird der Interrupt immer wieder ausgelöst
Institute of
[Link]@[Link] 29
Computer Technology