Forum: Mikrocontroller und Digitale Elektronik STM32: UART initialisiert nicht


von Benajmin Buxbaum (Gast)


Lesenswert?

Das hier ist mein Code um das UART-Peripheral auf einem STM32F4-Disco 
zum Laufen zu bekommen:
1
int main(void) {
2
  HAL_Init();
3
  SystemClock_Config();
4
5
  __HAL_RCC_GPIOC_CLK_ENABLE();
6
7
  char message[] = "Hello UART!\n";
8
9
  GPIO_InitTypeDef GPIOinit;
10
  GPIOinit.Pin = GPIO_PIN_10 | GPIO_PIN_11;
11
  GPIOinit.Mode = GPIO_MODE_AF_PP;
12
  GPIOinit.Pull = GPIO_PULLUP;
13
  GPIOinit.Speed = GPIO_SPEED_FAST;
14
  GPIOinit.Alternate = GPIO_AF8_UART4;
15
  HAL_GPIO_Init(GPIOC, &GPIOinit);
16
17
  UART_HandleTypeDef uart4;
18
  uart4.Instance = UART4;
19
  uart4.Init.BaudRate = 9600;
20
  uart4.Init.WordLength = UART_WORDLENGTH_8B;
21
  uart4.Init.StopBits = UART_STOPBITS_1;
22
  uart4.Init.Parity = UART_PARITY_NONE;
23
  uart4.Init.Mode = UART_MODE_TX_RX;
24
  uart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
25
26
  HAL_UART_Init(&uart4);
27
  
28
while (1) {
29
    HAL_UART_Transmit(&uart4, (uint8_t*) message, 12, 5000);
30
    delay(20000);
31
  }
32
}

Die While-Schleife wird allerdings gar nicht mehr erreicht. Bei der 
Init-Funktion stoppt die Ausfuehrung einfach...
Bin sowohl mit Eclipse, als auch STM32 generell noch nicht allzu 
vertraut, sicher ist es also irgendwas ganz triviales. Kann den Fehler 
aber beim besten Willen nicht finden.

So bald

von hp-freund (Gast)


Lesenswert?

Wenn Du das alt bewährte

http://www.st.com/content/st_com/en/products/evaluation-tools/product-evaluation-tools/mcu-eval-tools/stm32-mcu-eval-tools/stm32-mcu-discovery-kits/stm32f4discovery.html

meinst, bei dem ist PC10 belegt.
Da Du ja offensichtlich HAL benutzt, wäre es vielleicht gut auch 
STM32CubeMX zu verwenden.

von Benajmin Buxbaum (Gast)


Lesenswert?

Danke fuer den Tipp. Da er rausgefuehrt ist, dachte ich, man koennte ihn 
trotzdem benutzen...

Cube benutze ich, da ich den generierten Code aber unglaublich 
unuebersichtlich finde, kopiere ich in der Regel nur die relevanten 
Teile. Gerade gesehen, das Cube den UART4 zwar sperrt, wenn man zuerst 
die Pinbelegung aendert, kann man ihn aber trotzdem benutzen. Scheint 
ein Bug zu sein.

Habe den Code nun auf USART2 an PA2 und PA3 umgestrickt, was leider, da 
USART scheinbar ein wenig komplizierter einzurichten ist, immmer noch 
nicht funktioniert. Die Initialisierung scheiter immer noch an einer 
Assertion (Polarity). Vielleicht mag ja nochmal jemand gucken:

[c]
int main(void) {
  HAL_Init();
  SystemClock_Config();

  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_USART2_CLK_ENABLE();

  char message[] = "Hello UART!\n";

  GPIO_InitTypeDef GPIOinit;
  GPIOinit.Pin = GPIO_PIN_2 | GPIO_PIN_3;
  GPIOinit.Mode = GPIO_MODE_AF_PP;
  GPIOinit.Pull = GPIO_PULLUP;
  GPIOinit.Speed = GPIO_SPEED_FAST;
  GPIOinit.Alternate = GPIO_AF7_USART2;
  HAL_GPIO_Init(GPIOA, &GPIOinit);

  USART_HandleTypeDef huart2;
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 9600;
  huart2.Init.WordLength = USART_WORDLENGTH_8B;
  huart2.Init.StopBits = USART_STOPBITS_1;
  huart2.Init.Parity = USART_PARITY_NONE;
  huart2.Init.Mode = USART_MODE_TX_RX;
  HAL_USART_Init(&huart2);

  while (1) {
    HAL_USART_Transmit(&huart2, (uint8_t *) message, 12, 5000);
    delay(20000);
  }
}

von Benajmin Buxbaum (Gast)


Lesenswert?

Sorry fuer das fehlende Tag. War schon ein langer Tag.

von hp-freund (Gast)


Lesenswert?

Ich weiß jetzt nicht was die Vorgabe ist, aber ich habe noch ein

huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;

von hp-freund (Gast)


Lesenswert?

Benajmin Buxbaum schrieb:
> da ich den generierten Code aber unglaublich
> unuebersichtlich finde,

So schwer ist das nicht.
Mach dir ein einfaches blinky.
Als IDE nutze ich das AC6 Plugin was auch von CubeMX direkt unterstützt 
wird.
Das geht inzwischen so gut das alles andere zu schwierig scheint ;)

von Benajmin Buxbaum (Gast)


Lesenswert?

Das Plugin gucke ich mir mal in Ruhe an.

Wenn man ein UARTHandleTypeDef uebergibt, laesst es sich schonmal 
initialisieren, aber nur wenn HwFlowCtl und OverSampling gesetzt sind. 
Text kommt leider immer noch keiner raus :(
Jetzt scheint die Transmit-Funktion ein Timeout zu generieren... So 
schwer kann das doch eigentlich gar nicht sein.

Danke schonmal fuer die Hilfe bisher!

von Benajmin Buxbaum (Gast)


Lesenswert?

Habe den Fehler gefunden. Natuerlich muss ich "message" noch in einen 
Pointer umwandeln, bevor ich es uebergebe. Jetzt laeuft alles!

von hp-freund (Gast)


Lesenswert?

Na dann, gute Nacht ;-)

von W.S. (Gast)


Lesenswert?

Benajmin Buxbaum schrieb:
> Das hier ist mein Code um das UART-Peripheral auf einem STM32F4-Disco
> zum Laufen zu bekommen:
> int main(void)


Da predigt unsereiner den Leuten hier zum x-ten Mal, sich einen 
ordentlichen Treiber zu schreiben, anstatt zu allererst in die Tasten zu 
hauen und main hinzuschreiben.

Aber es nützt nichts.

Nach wie vor starten die Leute zuerst ihre tolle Eclipse, um damit als 
erstes 'main' hieinzutippen. Anschließend sagen sie sich "es wird mir 
beim Schreiben schon was einfallen" und tippen lustig drauflos.

Danach ist 'auf die Fresse fallen' angesagt, der Debugger wird bemüht 
und man fällt zusammen mit dem Debugger nochmal auf die Fresse. 
Anschließend wird hier um Hilfe nachgefragt, aber dennoch kein Rat 
angenommen. Aber man meint im Brustton tiefster Überzeugung, alles genau 
richtig gemacht zu haben. Vom Lesen des Manuals oder gar vom Verstehen 
kann man dabei nichts erkennen. Siehe das hier:

"Cube benutze ich, da ich den generierten Code aber unglaublich 
unuebersichtlich finde, kopiere ich in der Regel nur die relevanten 
Teile."

und

"Habe den Code nun auf USART2 an PA2 und PA3 umgestrickt, was leider, da
USART scheinbar ein wenig komplizierter einzurichten ist, immmer noch
nicht funktioniert. Die Initialisierung scheiter immer noch an einer
Assertion (Polarity)."

Der eigentliche Treppenwitz (für mich) besteht darin, daß ich hier schon 
mehrfach einen ordentlichen (und wirklich funktionablen und 
HW-abstahierenden) Treiber für UART's und für USB-VCP gepostet habe, 
sowohl für LPC als auch für STM32, aber die Leute sind sowohl zu faul, 
ins RefMan zu schauen als auch zu faul, mal die Suchfunktion des Forums 
zu bemühen. Ich für meinen Teil erwarte da ein gewisses 
Mindest-Eigenbemühen, wir sind ja nicht im Schlaraffenland.

W.S.

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.