Forum: Mikrocontroller und Digitale Elektronik STM32 - GPIOs funktionieren nicht


von Reinhard (gotbread)


Angehängte Dateien:

Lesenswert?

Hallo :-)

Ich hab mir neulich ein STM32F4 Discovery board zugelegt:
http://www.st.com/en/evaluation-tools/32f429idiscovery.html
(Prozessor ist STM32F429ZI)

Als Software nutze ich zum erzeugen des Init-codes
STM32CubeMx und als IDE CooCox mit der ARM embedded toolchain.

Ich hab in MX ein paar IO-Pinne als Output definiert. Diese
möchte ich nun im Code ansprechen.

Das Programm ist größtenteils automatisch von MX generiert.
Ich habe nur 1-2 Zeilen hinzugefügt, um einen der IO-Pinne
zu setzen. Kann das ganze auch problemlos kompilieren und
flashen. Allerdings passiert nichts, ich messe weiterhin 0.0V
an dem Pin. Weder togglen noch auf High setzen scheint zu
funktionieren.

Code siehe Anhang.

Relevante Stelle (da der Rest automatisch erzeugt wurde):
1
int main(void)
2
{
3
  /* USER CODE BEGIN 1 */
4
5
  /* USER CODE END 1 */
6
7
  /* MCU Configuration----------------------------------------------------------*/
8
9
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
10
  HAL_Init();
11
12
  /* USER CODE BEGIN Init */
13
14
  /* USER CODE END Init */
15
16
  /* Configure the system clock */
17
  SystemClock_Config();
18
19
  /* USER CODE BEGIN SysInit */
20
21
  /* USER CODE END SysInit */
22
23
  /* Initialize all configured peripherals */
24
  MX_GPIO_Init();
25
  /* USER CODE BEGIN 2 */
26
27
  /* USER CODE END 2 */
28
29
  /* Infinite loop */
30
  /* USER CODE BEGIN WHILE */
31
  while (1)
32
  {
33
34
  /* USER CODE END WHILE */
35
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
36
    //HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_4);
37
    HAL_Delay(100);    // 100ms
38
  /* USER CODE BEGIN 3 */
39
40
  }
41
  /* USER CODE END 3 */
42
43
}

Der Pin ist laut Schaltplan vom Board
http://www.st.com/content/ccc/resource/technical/document/user_manual/6b/25/05/23/a9/45/4d/6a/DM00093903.pdf/files/DM00093903.pdf/jcr:content/translations/en.DM00093903.pdf
direkt mit PB4 verbunden. Das High setzen von selbigem sollte
also dazu führen dass ich eine Spannugn am Pin messen kann.

Was muss ich tun um den IO Pin zu nutzen?

Viele Grüße,
Gotbread

von Nop (Gast)


Lesenswert?

Reinhard S. schrieb:

> Was muss ich tun um den IO Pin zu nutzen?

Du machst das, was man als Nutzer der HAL eben tun muß. Du gehst in den 
automatisch generierten Code und gleichst das, was da gemacht wird, mit 
dem Reference Manual des Chips ab. Dann folgerst Du zurück, welche 
Einstellungen in der GUI wahrscheinlich verkehrt waren und änderst die.

Klingt umständlich? Ja, das ist der Preis der HAL-Benutzung. Sobald es 
nicht geht, wird es umständlich.

von Dr. Sommer (Gast)


Lesenswert?

War PB4 nicht der JTAG Reset Pin ...?

von Dr. Sommer (Gast)


Lesenswert?

Hab's nachgeguckt, ja PB4 ist der NJTRST. Wenn man den unbedingt braucht 
kann man den zum GPIO umkonfigurieren. Da würde ich bei deinem Kenntnis 
Stand von abraten. Nimm lieber einen anderen Pin.

von Reinhard (gotbread)


Lesenswert?

Dr. Sommer schrieb:
> Hab's nachgeguckt, ja PB4 ist der NJTRST.

Kannst du mir kurz sagen wo du das gefunden hast?

Ich hab extra in der Pinbelegung (Seite 22) nach freien
Pins gesucht, und PB4 sah frei aus. Auch im Schaltplan
(Seite 32) seh ich da nicht die Verbindung. Was übersehe
ich da?

(Ich beziehe mich auf dieses Dokument: 
http://www.st.com/content/ccc/resource/technical/document/user_manual/6b/25/05/23/a9/45/4d/6a/DM00093903.pdf/files/DM00093903.pdf/jcr:content/translations/en.DM00093903.pdf 
)

Ich hab testweise mal andere Pinne genommen:
PB13, PG13, PG14
1
while (1)
2
{
3
    HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13);
4
    HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_14);
5
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_13);
6
7
    HAL_Delay(100);    // 100ms
8
}

An allen 3 Pinnen sollte eine LED hängen (Seite 23 + 26)
Ich seh aber hier weder eine LED leuchten, noch messe
ich eine Spannung an den Pinnen.

von Dr. Sommer (Gast)


Lesenswert?

Reinhard S. schrieb:
> Kannst du mir kurz sagen wo du das gefunden hast?

Im Datasheet des Controllers natürlich:
http://www.st.com/resource/en/datasheet/stm32f429zi.pdf
S. 69
Alternativ im Reference Manual:
http://www.st.com/resource/en/reference_manual/dm00031020.pdf
S. 1687

Reinhard S. schrieb:
> Auch im Schaltplan
> (Seite 32) seh ich da nicht die Verbindung.
Der Pin ist intern mit der JTAG-Schaltung verbunden. Den muss man erst 
"frei machen". Würde ich aber nicht machen.

Reinhard S. schrieb:
> An allen 3 Pinnen sollte eine LED hängen (Seite 23 + 26)
PB13 ist speziell, VBus-Monitoring für USB. Da geht das ggf nicht so 
direkt.

Sicher dass das Delay funktioniert? Mal nur durch das Toggle gesteppt 
und dann angehalten? Was steht im ODR Register?

von Reinhard (gotbread)


Angehängte Dateien:

Lesenswert?

Dr. Sommer schrieb:
> Sicher dass das Delay funktioniert? Mal nur durch das Toggle gesteppt
> und dann angehalten? Was steht im ODR Register?

Debuggen scheint nicht richtig zu funktionieren. Habe testweise
mal ein Breakpoint auf das HAL_Init() gesetzt. Dort hält
er aber nicht an. Weder ein normaler BP noch ein Line-BP
funktioniert. Die COM-LEDs auf dem Board blinken während
er verbunden ist, also passiert zumindest irgentwas.

Halte ich die CPU manuell an lande ich in einer Reihe von movs
(siehe Anhang). Wird vmtl 0x00 im Speicher sein.

Habe den Verdacht dass er den Code garnicht in den Flash
schreibt. Zum flashen nutze ich den im Demoboard vorhandenen
ST-Link Programmer und die "Download Code to Flash" Funktion
in der IDE. Viel mehr bietet sie ja auch nicht an.

von Dr. Sommer (Gast)


Lesenswert?

Reinhard S. schrieb:
> Halte ich die CPU manuell an lande ich in einer Reihe von movs
> (siehe Anhang). Wird vmtl 0x00 im Speicher sein.

Die Adressen liegen nicht im Flash. Das Programm stürzt irgendwo ab. 
Nimm vielleicht mal statt der veralteten CooCox IDE was aktuelles wie 
das mittlerweile gratis nutzbare Atollic Studio.
Steppe das Programm von Anfang an durch um die Stelle des Absturzes zu 
finden

von Reinhard (gotbread)


Lesenswert?

Dr. Sommer schrieb:
> Nimm vielleicht mal statt der veralteten CooCox IDE was aktuelles wie
> das mittlerweile gratis nutzbare Atollic Studio.

Habe ich jetzt mal heruntergeladen und getestet. Funktioniert!
Sowohl das Atollic Beispielprogramm als auch das von CubeMX
generierte Projekt. Toll!

Testweise mal beide LEDs ausprobiert:
1
while (1)
2
{
3
  HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
4
  HAL_Delay(100);
5
  HAL_GPIO_TogglePin(LD4_GPIO_Port, LD4_Pin);
6
  HAL_Delay(100);
7
}

Geht problemlos. Auch kein problem mit dem Delay(). Und debuggen
kann es sogar auch noch.

Lag also echt an Coocox. Mit dem Atollic Studio gehts super!

Vielen Dank an alle, besonders an Dr. Sommer!

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.