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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.