Forum: Mikrocontroller und Digitale Elektronik STM32 - GPIO-Pin lässt sich nicht setzen


von Grenzfall (Gast)


Angehängte Dateien:

Lesenswert?

Guten Abend zusammen!

Ich habe ein Problem mit einem selbstentwickelten GPS-Empfänger, in dem 
ich einen STM32-µc (STM32F103RET6) verbaut habe. Leider bin ich weder 
mit Google noch im Datenblatt des Controllers fündig geworden, deshalb 
hoffe ich, dass Ihr mir weiterhelfen könnt.

Also, nun zu meinem Anliegen:
Ich möchte den Eingang eines p-MOSFETs schalten. Das Gate habe ich über 
einen hochohmigen Pull-Up auf 3.3V gezogen, damit der Transistor 
standardmässig sperrt (siehe Schaltbild).
Am Controller habe ich den Pin PA12 auf Ausgang mit Open-Drain 
programmiert, um bei Bedarf das Gate auf 0 Volt zu ziehen und meinen 
Verbraucher einzuschalten.

Soweit ich es überblicke, habe ich alle Clocks für den Port gesetzt und 
der Rest der Schaltung arbeitet auch korrekt - nur wenn ich den GPIO 
PA12 auf low schalte, tut sich nichts. Mein Voltmeter zeigt konstant 
3.3V an.
Ich hab auch schon versucht, den Ausgang als Push-Pull zu definieren, 
das hat aber auch nichts gebracht.

Ich benutze die STM-Standard-Peripheral-Library. Die Schaltung ist, wie 
gesagt, ein Eigenbau.

Hier noch mein Code zur Initialisierung;
Für die Kommunikation mit dem PC initialisiere ich auch USART1, jedoch 
ohne CTS und RTS (PA12 wäre RTS von USART1) - aber ich habe nirgendwo 
gelesen, dass dass man den Pin nicht anders verwenden kann, wenn man RTS 
nicht benutzt, oder?
1
void USART1_Configuration()
2
{
3
    // PC-Verbindung an USART 1 - PA9/PA10 
4
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);
5
6
    GPIO_InitTypeDef GPIO_InitStructure;   
7
8
    // Alle diese Ports werden nur langsam geschaltet
9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
10
11
    // GPS IO an USART 1 - PA9/PA10
12
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
13
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
14
    GPIO_Init(GPIOA, &GPIO_InitStructure);
15
16
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
17
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
18
    GPIO_Init(GPIOA, &GPIO_InitStructure);
19
20
    // Support für NMEA-Protokoll aus Datenblatt
21
    USART_InitTypeDef USART_InitStructure;
22
    USART_InitStructure.USART_BaudRate = 9600;
23
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
24
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
25
    USART_InitStructure.USART_Parity = USART_Parity_No;
26
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
27
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
28
29
    USART_Init(USART1, &USART_InitStructure);
30
    USART_Cmd(USART1, ENABLE); 
31
}
32
33
void GPS_USART_Configuration()
34
{   
35
    // Clocks Initialisieren
36
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
37
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2, ENABLE);
38
39
40
    GPIO_InitTypeDef GPIO_InitStructure;   
41
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
42
43
    // GPS IO an USART 2 - PA2/PA3
44
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; // USART2 DI
45
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
46
    GPIO_Init(GPIOA, &GPIO_InitStructure);
47
48
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; // USART2 DO
49
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
50
    GPIO_Init(GPIOA, &GPIO_InitStructure);
51
52
    // Support für NMEA-Protokoll aus Datenblatt
53
    USART_InitTypeDef USART_InitStructure;
54
    USART_InitStructure.USART_BaudRate = 9600;
55
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
56
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
57
    USART_InitStructure.USART_Parity = USART_Parity_No;
58
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
59
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
60
61
    USART_Init(USART2, &USART_InitStructure);
62
    USART_Cmd(USART2, ENABLE); 
63
    
64
    // GPS Power Supply (GPS_EN) - PA12 als Open Drain Ausgang
65
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
66
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; 
67
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
68
    GPIO_Init(GPIOA, &GPIO_InitStructure);
69
}

Aufruf und Test läuft dann (Auszugsweise) wie folgt ab:
1
main() {
2
   SystemInit();
3
   ...
4
   Enable_RedLed();
5
   USART1_Configuration();
6
   GPS_USART_Configuration();
7
   ...
8
9
   GPIO_SetBits(GPIOA, GPIO_Pin_12); 
10
   // Jetzt sollten an PA12 3.3V anliegen, was auch der Fall ist
11
   CountDown(20); // = 2 Sekunden
12
   Disable_RedLed();
13
   GPIO_ResetBits(GPIOA, GPIO_Pin_12);
14
   CountDown(20); // = 2 Sekunden
15
   // Jetzt sollten an PA12 0V anliegen, es sind aber immer noch 3.3V
16
   ...
17
}

Vielleicht habe ich ja Tomaten vor den Augen und sehe das 
Offensichtliche nicht. Ich würde mich jedenfalls freuen, wenn Ihr mir 
weiterhelfen könntet.

Viele Grüße
Grenzfall

von Bernd (Gast)


Lesenswert?

Hallo!

Bitte tausche den Pull-Up Widerstand gegen einen 47k Widerstand.
Die RCC-Funktionen musst du nur einmal aufrufen und dann ist die Clock 
initialisiert und nicht doppelt, siehe 'USART1_Configuration()' und 
'GPS_USART_Configuration()'
Definiere den Mode von PA12 als 'GPIO_MODE_Out_PP' und dann sollte es 
funktionieren.

lg
Bernd

von holger (Gast)


Lesenswert?

>Bitte tausche den Pull-Up Widerstand gegen einen 47k Widerstand.

Ist Wurst.

>Die RCC-Funktionen musst du nur einmal aufrufen und dann ist die Clock
>initialisiert und nicht doppelt

Die kann er aufrufen solange er Lust dazu hat.

Ich tipp mal auf Schaltungsfehler.

von Matthias K. (matthiask)


Lesenswert?

Teste mal den PA12 ohne die Schaltung dran. Die P-Kanäle gehen gern mal 
kaputt. Und dann probiers mal an einen anderen GPIO.

von Grenzfall (Gast)


Lesenswert?

Vielen Dank erstmal für eure Antworten,

mir ist klar, dass die Clocks mehrfach initialisiert werden. Ich hab das 
zunächst nach Peripherie/Baugruppe sortiert.
Das werde ich optimieren, wenn die Peripherie komplett läuft.

Das Thema Schaltungsfehler hab ich schon mehrfach geprüft - Der Pin ist 
über eine einzige Leitung mit dem Gate des Transistors verbunden und die 
ist in Ordnung. Einen Kurzschluss gegen VCC/3.3V kann ich auch 
ausschließen - ich messe nur den Pull-Up Widerstand.

PA12 ohne Schaltung probiere ich morgen mal aus - Dazu muss ich den 
MOSFET entlöten. Ich lass euch wissen, was dabei rauskommt.

Anderer GPIO wird schwierig, das es ein fertiges PCB ist. Allerdings 
habe ich noch einige IOs für spätere Erweiterungen nach draußen geführt, 
die könnte ich mal testen...

Ich melde mich, wenn ich mehr weiß.

Grenzfall

von Grenzfall (Gast)


Lesenswert?

Guten Tag alle,

ich habe das Problem gelöst, offenbar war tatsächlich der MOSFET defekt.
Nach Austausch hat alles nach Wunsch funktioniert.

Vielen Dank für eure Hilfe,

Grenzfall

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.