STM32: UART initialisiert nicht

Gast #4764029
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
Gast #4764147
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);
  }
}
Gast #4764182
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!
Gast #4765480
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren