STM32F4 Pin mit Timer toggeln!

Gast #3647587
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
}
#3647711
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
Gast #3647771
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren