Difference between revisions of "ARM Embedded Tutorial - Simple Timer/de"

From Free Pascal wiki
Jump to navigationJump to search
(Created page with "{{Translate}} =Einfache Timer Funktion= In diesem Beispiel wird ein einfacher Timer verwendet. ==Programm Kopf== <syntaxhighlight> program Timer_Blink; uses cortexm3; <...")
 
m (→‎Siehe auch: Bypass redirect)
 
(7 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{Translate}}
+
{{LanguageBar}}
  
 
=Einfache Timer Funktion=
 
=Einfache Timer Funktion=
  
In diesem Beispiel wird ein einfacher Timer verwendet.
+
In diesem Beispiel wird ein einfacher Timer von einem STM32F103C verwendet.
 +
Dieser Controller besitzt 4 Timer, wovon man man Timer 2-4 sehr einfach verwenden kann.
 +
Timer1 besitzt mehrere Möglichkeiten, daher ist er komplizierter in der Verwendung.
  
 
==Programm Kopf==
 
==Programm Kopf==
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang="pascal">
 
program Timer_Blink;
 
program Timer_Blink;
  
Line 15: Line 18:
  
 
==Konstanten und Bezeichner==
 
==Konstanten und Bezeichner==
<syntaxhighlight>
+
 
 +
<syntaxhighlight lang="pascal">
 
const
 
const
   TIM_CR1_CEN: uInt16 = $0001;           // Counter enable
+
   TIM_CR1_CEN: uInt16       =     $0001; // Counter enable
 
   RCC_APB1ENR_TIM2EN: uInt32 = $00000001; // TIM2 clock enabled
 
   RCC_APB1ENR_TIM2EN: uInt32 = $00000001; // TIM2 clock enabled
  
   TIM_DIER_CC1IE: uInt16 = $0002;         // Capture/Compare 1 interrupt enable
+
   TIM_DIER_CC1IE: uInt16     =     $0002; // Capture/Compare 1 interrupt enable
   TIM_SR_CC1IF: uInt16 = $0002;           // Capture/Compare 1 interrupt Flag
+
   TIM_SR_CC1IF: uInt16       =     $0002; // Capture/Compare 1 interrupt Flag
   TIM2_IRQn = 28;                         // TIM2 global Interrupt
+
   TIM2_IRQn                 =       28; // TIM2 global Interrupt
  
 +
// Für einen einfachen Zugriff auf die LED PC13.
 
type
 
type
 
   TLed = bitpacked array[0..15] of boolean;
 
   TLed = bitpacked array[0..15] of boolean;
 
 
var
 
var
 
   LedC: TLed absolute GPIOC.ODR;
 
   LedC: TLed absolute GPIOC.ODR;
Line 32: Line 36:
  
 
==Interrupt Funktion==
 
==Interrupt Funktion==
<syntaxhighlight>
+
 
procedure Timer2_Interrupt; public Name 'TIM2_interrupt'; interrupt;
+
<syntaxhighlight lang="pascal">
 +
procedure Timer2_Interrupt; public Name 'TIM2_global_interrupt'; interrupt;
 
begin
 
begin
 
   TIM2.SR  := TIM2.SR and not TIM_SR_CC1IF; // clear CC1IF
 
   TIM2.SR  := TIM2.SR and not TIM_SR_CC1IF; // clear CC1IF
Line 41: Line 46:
  
 
==Hauptprogramm und Inizialisierungen==
 
==Hauptprogramm und Inizialisierungen==
<syntaxhighlight>
+
 
 +
Mit '''TIM2.PSC''' und '''TIM2.ARR''' kann man die Geschwindigkeit des Timers einstellen, je kleiner die Werte, desto schneller.
 +
 
 +
<syntaxhighlight lang="pascal">
 
begin
 
begin
 
   // Ports einschalten
 
   // Ports einschalten
Line 55: Line 63:
  
 
   // Various settings in default
 
   // Various settings in default
   TIM2.CR1 := $0000;   // Control register 1; Wait with timer enable until settings complete
+
   TIM2.CR1   := $0000; // Control register 1; Wait with timer enable until settings complete
   TIM2.CR2 := $0000;   // Control register 2
+
   TIM2.CR2   := $0000; // Control register 2
 
   TIM2.CCMR1 := $0000; // Capture/compare mode register
 
   TIM2.CCMR1 := $0000; // Capture/compare mode register
   TIM2.CCER := $0000; // Capture/compare enable register
+
   TIM2.CCER := $0000; // Capture/compare enable register
  
 
   // Prescaler
 
   // Prescaler
 
   TIM2.PSC := 1000;
 
   TIM2.PSC := 1000;
 
   // AutoReload value
 
   // AutoReload value
   TIM2.Arr := 1000;
+
   TIM2.ARR := 1000;
  
 
   // DMA and Interrupt control register
 
   // DMA and Interrupt control register
Line 75: Line 83:
 
   NVIC.ISER[TIM2_IRQn shr 5] := 1 shl (TIM2_IRQn and $1F); // Enable Interrupt
 
   NVIC.ISER[TIM2_IRQn shr 5] := 1 shl (TIM2_IRQn and $1F); // Enable Interrupt
  
 +
  // --- Hauptschleife ---
 
   while True do begin
 
   while True do begin
 +
    // Mache irgend etwas.
 
   end;
 
   end;
end.</syntaxhighlight>
+
end.
 +
</syntaxhighlight>
 +
 
 +
==Mehrere Timer==
 +
 
 +
Man kann 3 einfacher Timer parallel verwenden. Das sind dir Timer2 bis Timer4. Timer1 wird anders verwendet.
 +
Will man die Timer 3 & 4 verwenden, muss man einfach TIM2 durch TIM3 und/oder TIM4 ersetzen.
  
 
== Siehe auch ==
 
== Siehe auch ==
* Übersichtseite [[ARM Embedded Tutorial/de]]
+
 
 +
* Übersichtseite [[ARM Embedded Tutorials/de]]
  
 
Autor: [[User:Mathias|Mathias]]
 
Autor: [[User:Mathias|Mathias]]
Line 87: Line 104:
 
[[Category:ARM]]
 
[[Category:ARM]]
 
[[Category:Arduino]]
 
[[Category:Arduino]]
 +
{{AutoCategory}}

Latest revision as of 02:51, 1 February 2021

Deutsch (de) English (en)

Einfache Timer Funktion

In diesem Beispiel wird ein einfacher Timer von einem STM32F103C verwendet. Dieser Controller besitzt 4 Timer, wovon man man Timer 2-4 sehr einfach verwenden kann. Timer1 besitzt mehrere Möglichkeiten, daher ist er komplizierter in der Verwendung.

Programm Kopf

program Timer_Blink;

uses
  cortexm3;


Konstanten und Bezeichner

const
  TIM_CR1_CEN: uInt16        =     $0001; // Counter enable
  RCC_APB1ENR_TIM2EN: uInt32 = $00000001; // TIM2 clock enabled

  TIM_DIER_CC1IE: uInt16     =     $0002; // Capture/Compare 1 interrupt enable
  TIM_SR_CC1IF: uInt16       =     $0002; // Capture/Compare 1 interrupt Flag
  TIM2_IRQn                  =        28; // TIM2 global Interrupt

// Für einen einfachen Zugriff auf die LED PC13.
type
  TLed = bitpacked array[0..15] of boolean;
var
  LedC: TLed absolute GPIOC.ODR;

Interrupt Funktion

procedure Timer2_Interrupt; public Name 'TIM2_global_interrupt'; interrupt;
begin
  TIM2.SR  := TIM2.SR and not TIM_SR_CC1IF; // clear CC1IF
  LedC[13] := not LedC[13];                 // LED PC13 umschalten
end;

Hauptprogramm und Inizialisierungen

Mit TIM2.PSC und TIM2.ARR kann man die Geschwindigkeit des Timers einstellen, je kleiner die Werte, desto schneller.

begin
  // Ports einschalten
  RCC.APB2ENR := RCC.APB2ENR or (%111 shl 2);

  // Ports auf Ausgabe schalten
  GPIOC.CRL := $33333333;
  GPIOC.CRH := $33333333;

  // --- Timer ---
  // RCC enable for Timer2
  RCC.APB1ENR := RCC.APB1ENR or RCC_APB1ENR_TIM2EN;

  // Various settings in default
  TIM2.CR1   := $0000; // Control register 1; Wait with timer enable until settings complete
  TIM2.CR2   := $0000; // Control register 2
  TIM2.CCMR1 := $0000; // Capture/compare mode register
  TIM2.CCER  := $0000; // Capture/compare enable register

  // Prescaler
  TIM2.PSC := 1000;
  // AutoReload value
  TIM2.ARR := 1000;

  // DMA and Interrupt control register
  TIM2.DIER := TIM_DIER_CC1IE; // Compare 1 interrupt enable

  // Enable Counter
  TIM2.CR1 := TIM2.CR1 or TIM_CR1_CEN;

  // NVIC configuration
  NVIC.IP[TIM2_IRQn] := $20;   // IRQ-Priority, right 4bits always to be zero
  NVIC.ISER[TIM2_IRQn shr 5] := 1 shl (TIM2_IRQn and $1F); // Enable Interrupt

  // --- Hauptschleife ---
  while True do begin
    // Mache irgend etwas.
  end;
end.

Mehrere Timer

Man kann 3 einfacher Timer parallel verwenden. Das sind dir Timer2 bis Timer4. Timer1 wird anders verwendet. Will man die Timer 3 & 4 verwenden, muss man einfach TIM2 durch TIM3 und/oder TIM4 ersetzen.

Siehe auch

Autor: Mathias