Forum: Mikrocontroller und Digitale Elektronik STM32F4 Pin mit Timer toggeln!


von thomas d. (Gast)


Lesenswert?

Hallo,

ich würde gerne einen Pin mittels Timer toggeln. Leider funktioniert 
dies nicht. An Pin A0 passiert nichts! Kann mir jemand helfen? Was mache 
ich falsch?

1
GPIO_InitTypeDef  GPIO_InitStruct;
2
TIM_TimeBaseInitTypeDef    TIM_InitStruct;
3
4
int main(void)
5
{
6
  SystemInit(); // initaler Zustand für MC + Clock-Einstellungen
7
8
  //Konfiguration Pin A0
9
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
10
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
11
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
12
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
13
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
14
15
  // CLK PortA einschalten
16
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
17
  // Port A konfigurieren
18
  GPIO_Init(GPIOA,&GPIO_InitStruct);
19
  // Alternate Funktion für A0
20
  GPIO_PinAFConfig(GPIOA,GPIO_Pin_0,GPIO_AF_TIM2);
21
  
22
  // Timer 2 konfigurieren
23
  TIM_InitStruct.TIM_Prescaler = 1;
24
  TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
25
  TIM_InitStruct.TIM_Period = 100-1;
26
  TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
27
  TIM_InitStruct.TIM_RepetitionCounter = 0;
28
  
29
  // CLK für Timer einschalten
30
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
31
  // Timer 2 konfigurieren
32
  TIM_TimeBaseInit(TIM2,&TIM_InitStruct);
33
  // Timer 2 einschalten
34
  TIM_Cmd(TIM2,ENABLE);
35
36
    while(1) // Endlos SChleife
37
    {
38
    }
39
}

von Jan B. (berge)


Lesenswert?

Hi, nur damit ich das richtig verstehe, willst eine PWM mit dem Timer 
auf PA0 generieren oder im bei Interrupt (Overcount) des Timer2 dann den 
Pin togglen?

von thomas d. (Gast)


Lesenswert?

Hi,

ich möchte keine PWM, ich möchte einfach ein Rechteck mit einer festen 
Frequenz erzeugen! Der Pin soll einfach bei jedem Überlauf seinen 
Zustand wechseln!

von ♪Geist (Gast)


Lesenswert?

thomas d. schrieb:
> ich möchte keine PWM, ich möchte einfach ein Rechteck mit einer festen
> Frequenz erzeugen!

Initialisiere den Timer im PWM Modus mit 50% Duty cycle.

von Jan B. (berge)


Lesenswert?

Die feste Frequenz kannst du auf beide Arten erzeugen. Per PWM oder 
Interrupt (IRQ).

Falls du die PWM willst, fehlt auf jeden Fall die Initialisierung des 
Capture Compare Registers, sonst weiß der uC nicht, bei welchem 
Timerstand was am Pin passieren soll.

Falls du den IRQ willst, musst du den Pin nicht auf Alternate Function 
(AF) konfigurieren sondern normal als GPIO Out, aktivieren dass der 
Timer einen Overcount IRQ rausgibt und im IRQ Controller (NVIC) 
aktivieren, dass dieser IRQ verarbeitet werden soll und mit welcher 
Priorität etc. und noch eine Interrupt Routine schreiben in der der IRQ 
behandelt wird. Ein gutes Beispiel dazu gibt es hier: 
http://mikrocontroller.bplaced.net/wordpress/?page_id=2251

Liebe Grüße, Jan

von IWAK (Gast)


Lesenswert?

Es fehlt die ISR (Interrupt Service Routine). Diese wird aufgerufen, 
wenn ein Timer Interrupt auftritt. Damit die aufgerufen werden kann 
musst du für Deinen Timer den Interrupt (TIM2_IRQ) aktivieren. Die 
Routine heisst TIM_IRQHandler.

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
Noch kein Account? Hier anmelden.