Forum: Mikrocontroller und Digitale Elektronik STM32 FW_LIB wozu dient RCC_APB2PeriphClockCmd?


von Thomas B. (escamoteur)


Lesenswert?

Hi,

ich mache gerade die ersten Schritte mit meinem STM32 und versuche die 
Beispiele in der Standard Peripheral Library zu verstehen. Im Moment 
einfach mal die GPIO:
1
00061   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
2
00062                          RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
3
00063                          RCC_APB2Periph_GPIOE, ENABLE);
4
00064 
5
00065   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
6
00066   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
7
00067   GPIO_Init(GPIOA, &GPIO_InitStructure);
8
00068   GPIO_Init(GPIOB, &GPIO_InitStructure);
9
00069   GPIO_Init(GPIOC, &GPIO_InitStructure);
10
00070   GPIO_Init(GPIOD, &GPIO_InitStructure);
11
00071   GPIO_Init(GPIOE, &GPIO_InitStructure);
12
00072 
13
00073   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
14
00074                          RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
15
00075                          RCC_APB2Periph_GPIOE, DISABLE);

Dabei verstehe ich nicht wozu das APB2PeriphClockCmd da ist, bzw. wieso 
dies notwendig ist bevor man die GPIOs konfigurieren kann.

Gruß
Tom

von (prx) A. K. (prx)


Lesenswert?

Beim STM32 ist ab Reset der Takt der Peripheriemodule abgeschaltet. Ohne 
Takt kann man die nicht verwenden und nicht konfigurieren.

von Thomas B. (escamoteur)


Lesenswert?

Ah, jetzt hab ichs verstanden, nachdem ich mire den Code von InitLED 
noch angeschaut habe.

Zuerst Schalten die die Clock für alle GPIOs an, konfigurieren sie, dann 
schalten sie die Clocks für alle wieder aus, um dann nur die Clocks für 
die IOs wieder anzuschalten an denen auch eine LED hängt.

Vielen Dank, das war genau der Hinweis, der mir gefehlt hat.

Gruß
Tom

von X. A. (wilhem)


Angehängte Dateien:

Lesenswert?

Ich rufe diesen alten Thread wieder ins Leben, da ich eine Frage habe, 
die die von Thomas ergänzen könnte. Also passt es ganz genau zu diesem 
Thread.

Ich habe nicht so ganz kapiert, wie man den RCC_APBxPeriph... richtig 
einstellt. Internet liefert unzählige Tutorial, in dem wiederholt wird, 
dass GPIO, SPI, UART usw. mit einem Clock initialisiert werden.

Ok, wie kann ich das Diagramm im Anhang (aus dem Datenblatt des Mikros: 
STM32F407) richtig interpretieren?

Aus dem Diagramm sieht man eindeutig, dass GPIOA durch den AHB1 Bus 
gesteuert wird.
So schreibe ich in mein Code:
1
RCC_AHB1PeriphClockCmd(GPIOA, ENABLE);

und funktioniert es auch.

Das Problem sind bespielsweise die Module, die an dem APB2 verbunden 
sind.
Diese würde ich mit dem Befehl:
1
RCC_APB2PeriphClockCmd(UART1, ENABLE);
initialisieren. Doch der im grau markierte Bus AHB scheint mit der UART1 
in Verbindung auch zu sein.
Tatsächlich findet man Beispiele, in denen die obige Zeile mit dem 
folgenden Code ergänzt wird:
1
RCC_AHB1PeriphClockCmd(UART1, ENABLE);

so verstehe ich nicht so ganz, ob ich die Module, die mit dem Bus APB2 
auch mit dem AHB1/2 initialisiert werden müssen oder nicht.

Danke
Gruß

PS: In diesem Fall war die UART Schnittstelle nur ein Beispiel. Ich 
finde solche Konfigurationen für SPI, I2C usw.

: Bearbeitet durch User
von holger (Gast)


Lesenswert?

>So schreibe ich in mein Code:
>RCC_AHB1PeriphClockCmd(GPIOA, ENABLE);
>
>und funktioniert es auch.

Tatsächlich?

Also bei mir sieht sowas so aus:

  RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOD, ENABLE );

Und damit ist alles klar.

von holger (Gast)


Lesenswert?

>so verstehe ich nicht so ganz, ob ich die Module, die mit dem Bus APB2
>auch mit dem AHB1/2 initialisiert werden müssen oder nicht.

Nein, müssen sie nicht.

von X. A. (wilhem)


Lesenswert?

holger schrieb:
>>So schreibe ich in mein Code:
>>RCC_AHB1PeriphClockCmd(GPIOA, ENABLE);
>>
>>und funktioniert es auch.
>
> Tatsächlich?
>
> Also bei mir sieht sowas so aus:
>
>   RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOD, ENABLE );
>
> Und damit ist alles klar.

Ja, du hast Recht. Ich habe mich verschrieben gestern abend.

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.