STM32F4 Pin mit Timer toggeln!

Gast #3647587
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
}
Gast #3647621
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!
#3647711
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
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.