mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 - GPIOs funktionieren nicht


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Reinhard S. (gotbread)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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):
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

  /* USER CODE END WHILE */
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
    //HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_4);
    HAL_Delay(100);    // 100ms
  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

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

Autor: Nop (Gast)
Datum:

Bewertung
2 lesenswert
nicht 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.

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
War PB4 nicht der JTAG Reset Pin ...?

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Reinhard S. (gotbread)
Datum:

Bewertung
-1 lesenswert
nicht 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
while (1)
{
    HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13);
    HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_14);
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_13);

    HAL_Delay(100);    // 100ms
}

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.

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Reinhard S. (gotbread)
Datum:
Angehängte Dateien:

Bewertung
-1 lesenswert
nicht 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.

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Reinhard S. (gotbread)
Datum:

Bewertung
-1 lesenswert
nicht 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:
while (1)
{
  HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
  HAL_Delay(100);
  HAL_GPIO_TogglePin(LD4_GPIO_Port, LD4_Pin);
  HAL_Delay(100);
}

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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.