Forum: Mikrocontroller und Digitale Elektronik STM32F4 USART1


von Moritz M. (avrprogger)


Lesenswert?

Hallo,

hat jemand ein einfaces Bespiel für die USART1 Schnittstelle am 
stm32f407vgt6? Am besten, wenn einfach nur nen Zeichen gesendet wird 
ohne Interrupts, DMA, oder so erstmal rx/tx is doch dann am PA10/PA9 
oder?

MAX3232 geht doch dann damit oder?

fang gerade mit den stm32f4 an

Moritz

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

In der Peripherie Lib von ST gibt es Demo Code für den UART, 4 
Beispiele.

von Moritz M. (avrprogger)


Lesenswert?

Hallo

erstmal vielen dank für die Antwort.

Ich kenn die Beispiele aber die sin alle mit nem Evalution. und dann 
gibt es dabei immer funktionen die ich nicht kenne die das initalisieren 
übernehmen aber mir geht es ja darum zu lernen die schnittstelle zu 
initalisiren.
außerdem is dabei immer irgentwas mit interrupt oder dma oder smartcard 
oder so.
Moritz

von Dennis P. (dennisp)


Lesenswert?

Hier der Init Code für USART3. Für USART 1 musste nur die entsprechenden 
Pins ändern. Die ganzen USART können auf verschiedenen Pins laufen z.B. 
für USART 1 PA9/10 oder PB6/7. Es werden die entsprechenden Pins 
genommen die du in dem untenstehenden Code siehst/einstellst. Bedenke 
USART1 hängt am APB2!
1
   USART_InitStructure.USART_BaudRate = 115200;
2
   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
3
   USART_InitStructure.USART_StopBits = USART_StopBits_1;
4
   USART_InitStructure.USART_Parity = USART_Parity_No;
5
   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
6
   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
7
8
   //   GPIO_InitTypeDef GPIO_InitStructure;
9
10
   //configure clock for USART
11
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
12
    //configure clock for GPIO
13
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
14
    //configure AF
15
    GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_USART3);
16
    GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_USART3);
17
18
    //configure ports, &GPIO_InitStructure);
19
20
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
21
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
22
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
23
24
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
25
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
26
    GPIO_Init(GPIOC, &GPIO_InitStructure);
27
28
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
29
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
30
    GPIO_Init(GPIOC, &GPIO_InitStructure);
31
32
    USART_Init(USART3, &USART_InitStructure);
33
34
     /* Enable USART */
35
     USART_Cmd(USART3, ENABLE);

senden:
1
    while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
2
    USART_SendData(USART3, hier der Buchstabe);
Empfangen:
1
    while (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET);
2
    buchstabe = USART_ReceiveData(USART3);

von Moritz M. (avrprogger)


Lesenswert?

Hallo,

cool genau sowas habe ich gesucht!

Wo werden genau die Pins für die Schniitstelle eingestellt unter 
"//configure AF"? wie wird eingestelt welcher pin rx oder tx ist?

Moritz

von Dennis P. (dennisp)


Lesenswert?

Ja welcher (mögliche) Pin für den jeweiligen Uart genutzt wird, wird bei 
AF eingestellt. Welcher TX und welcher RX ist findest du in den 
Datenblätter z.B. beim STM32F4Discovery manual. Ebenso steht dort auch 
welcher Pin mit welchen Funktionen belegt werden kann. In der Regel ist 
Tx der mit niedrigen Pin.

von Moritz M. (avrprogger)


Lesenswert?

Ah, sorry hab ich falsch verstanden, also man kann sich zwischen 
verschiedenen Möglickeiten, die von ST vorgegeben sind, entscheiden und 
die Pins nicht frei wählen, richtig? also für USART1 PA9/10 oder PB6/7

Moritz

von Dennis P. (dennisp)


Lesenswert?

Ja das ist richtig so. Auf Seite 19 findest du z.B. einen Überblick was 
die Pins an Funktionen haben.

http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/USER_MANUAL/DM00039084.pdf

von Moritz M. (avrprogger)


Lesenswert?

Hallo

ich hab den oben genannten quellcode ausprobiert doch es kommt immer nur 
müll raus? woran könnte dass liegen? Muss man der Funktion den ASCII 
Code übergeben? -> Dann kommt aber auch nur müll raus.

Moritz

von Moritz M. (avrprogger)


Lesenswert?

Hallo,

brauch mann vieleicht noch extra hardware ausser max3232?
ich neme 9600 Baud/geht das?

von Roland H. (batchman)


Lesenswert?

Dennis P. schrieb:
> Hier der Init Code für USART3. Für USART 1 musste nur die entsprechenden
> Pins ändern. Die ganzen USART können auf verschiedenen Pins laufen z.B.
> für USART 1 PA9/10 oder PB6/7.

PA9/PA10 könnte mit USB kollidieren,
PB6 evtl. mit dem Audio-DAC.

Besser USART2 oder 3 verwenden. Die restlichen USARTs sind alle 
irgendwie "tangiert".

Hat das schon mal jemand mit USART 1, 4 oder 5 probiert?

Moritz M. schrieb:
> brauch mann vieleicht noch extra hardware ausser max3232?
> ich neme 9600 Baud/geht das?

Die Kondensatoren am max.
9600 ... hängt vom Takt und vom Vorteiler ab.

von Moritz M. (avrprogger)


Lesenswert?

Ah, jetzt gehts wunderbar
usart1 gig wiklich nicht wegen usb oder so.

usart3 geht jetz (muss halt nur einstellen(das hse_value 8Mhz sind und 
nicht 25)

Vielen Dank an alle für die Hilfe!

Moritz

von Dennis P. (dennisp)


Lesenswert?

Es muss auch in der system_stm32f4xx.c Datei der Wert PLL_M von 25 auf 8 
gestellt werden. Sonst läuft der Core nicht mit den 168MHz sondern halt 
mit ca 50MHz.
Ebenso muss der HSE_VALUE in der stm32f4xx.h von 25000000 auf 8000000 
gestellt werden (wenn man das STM32F4Discovery Board nimmt).

P.S. Ich benutz den USART1 auf PB6/7 ohne Probleme.

von Moritz M. (avrprogger)


Lesenswert?

Hallo,

ja hab ich auch gemerkt aber es ging trotzdem mit 50 MHz

von Roland H. (batchman)


Lesenswert?

Dennis P. schrieb:
> P.S. Ich benutz den USART1 auf PB6/7 ohne Probleme.

Das kann schon sein, die Frage ist nur: Mit oder ohne Audio-DAC?

PB6 ist mit "Audio_SCL" verbunden ?!

von Dennis P. (dennisp)


Lesenswert?

Ja das ist richtig. Da ich das Audio Zeug nicht brauch, hab ich dort den 
UART rangehangen. Ich hab aktuell Ethernet (RMII) und ne SD-Karte (SDIO) 
dran. Geplant ist noch ein 16bit LCD (dafür müssen aber paar Widerstände 
rausgelötet werden) sowie ein paar Elemente die über SPI angesprochen 
werden. Genau geplant hab ich das noch nicht, da ich erst seit gut 2 
Wochen mit den STM32F4 Prozessort rumprobiere (bzw. erster 32bit 
Prozessor). Davor hatte ich nur mit den Atmel 8bit µC rumgespielt.

von Roland H. (batchman)


Lesenswert?

Dennis P. schrieb:
> Ja das ist richtig. Da ich das Audio Zeug nicht brauch, hab ich dort den
> UART rangehangen.

D. h. ohne HW-technische Änderung am Discovery?

Dennis P. schrieb:
> Ich hab aktuell Ethernet (RMII) und ne SD-Karte (SDIO)
> dran.

Jetzt wird's interessant.

- Welche Pins sind für Ethernet nötig?  Mit/ohne HW-technischen 
Änderungen am Discovery? Welches PHY?

- Analog für die SD-Karte mittels SDIO: Welche Pins? Mit/ohne 
HW-technischen Änderungen am Discovery?

von Dennis P. (dennisp)


Angehängte Dateien:

Lesenswert?

Alle bisher ohne HW Änderungen am Board.
Hab mal ein Foto vom fliegenden Aufbau angehängt.

USART1:
USART1_TX    PB6
USART1_RX    PB7
Hinweis: der Audio DAC ist damit nichtmehr nutzbar

SDIO:
SDIO_D0            PC8
SDIO_D1            PC9
SDIO_D2            PC10
SDIO_D3            PC11
SDIO_CK            PC12
SDIO_CMD           PD2
Hinweis: der Audio DAC ist damit nichtmehr nutzbar
Geschwindigkeit mit einer µSD Karte: um die 6MB/s lesen und 3,5MB 
schreiben



Ethernet (RMII) mit einem DP83848 Board (bei Ebay gekauft aus China)

MII_TX_EN                  PB11
MII_TXD0                   PB12
MII_TXD1                   PB13
MII_RXD1                   PC5
MII_RXD0                   PC4
MII_RX_DV/RMII_CRS_DV      PA7
MII_RX_CLK/RMII_REF_CLK    PA1
MII_MDC                    PC1
MII_MDIO                   PA2

Heinweis: Damit ist der MEMS Sensor nichtmehr nutzbar.

Mit dem Ethernet (und LwIP) spiele ich grade noch rum um den http Server 
von der SD-Karte laufen zu lassen. Geplant ist noch ein FTP Server.

Grüße

von Jörg B. (joerg-sh)


Lesenswert?

Hallo Dennis,
hast du auch schon was am SPI hängen und dafür eine einfache 
Initialisierung?

Diese Beispiele von ST sind so was von überladen. Da hat man es als 
Anfänger echt sehr schwer.

Gruß

Jörg

von Dennis P. (dennisp)


Lesenswert?

Hallo Jörg,

nein hab ich bisher nicht. Vielleicht wirst du bei Google fündig.

Grüße
Dennis

von Gerhard G. (xmega)


Lesenswert?

Hallo,

schau mal hier:

Projekt: STM32F4-Discovery mit DOGM128 (SPI)

http://www.basteln-mit-avr.de/index.html

von Andy (Gast)


Lesenswert?

Hallo,
ich habe diesen Thread durch Google entdeckt und es trifft auch mein 
Problem ganz gut. Daher hoffe ich, ihr könnt mir vielleicht helfen.

Ich versuche per USART3 Daten von einigen Sensoren an den Rechner zu 
übertragen. Dazu habe ich einen FTDI USB-UART Board an den Pins PD8 und 
PD9 mit dem STMF4 Discovery Kit verbunden. Wenn ich allerdings Daten 
übertragen möchte, kommt nur Quatsch beim Rechner an und auch umgekehrt. 
Ich habe schon versucht einfach ein Zeichen zu senden, aber auch dann 
kommt was komplett anderes am Rechner an. Ich habe auch schon alle 
Baudratenkombinationen ausprobiert und bin mittlerweile völlig 
ahnungslos, wo der Fehler sich versteckt haben könnte.
Anbei meine Init- und Send-Funktion.
1
void Usart3Init(void){
2
3
  GPIO_InitTypeDef GPIO_InitStructure;
4
5
  USART_InitTypeDef USART_InitStructure;
6
7
  USART_InitStructure.USART_BaudRate = 9600;
8
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
9
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
10
  USART_InitStructure.USART_Parity = USART_Parity_No;
11
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
12
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
13
14
  //   GPIO_InitTypeDef GPIO_InitStructure;
15
  //configure clock for USART
16
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
17
  //configure clock for GPIO
18
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
19
  //configure AF
20
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_USART3);
21
  GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_USART3);
22
23
  //configure ports, &GPIO_InitStructure);
24
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
25
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
26
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
27
28
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
29
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
30
  GPIO_Init(GPIOD, &GPIO_InitStructure);
31
32
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
33
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
34
  GPIO_Init(GPIOD, &GPIO_InitStructure);
35
36
  USART_Init(USART3, &USART_InitStructure);
37
38
  // Enable USART
39
  USART_Cmd(USART3, ENABLE);
40
}
41
void SendUart (uint8_t byte) {
42
  while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);  
43
  USART_SendData(USART3, byte);    
44
}

Gruß Andy

von Jörg B. (joerg-sh)


Lesenswert?

Systemtakt der MCU richtig eingestellt? Discovery hat nur 8 MHz

von Gerhard G. (g_g)


Lesenswert?

Hallo,


USART_FLAG_TXE: Transmit data register empty flag
USART_FLAG_TC: Transmission Complete flag


nimm mal USART_FLAG_TC, so funktioniert das bei mir!

Gruß xmega

von Andy (Gast)


Lesenswert?

Hey, das ging ja fix mit den Antworten. Danke schon mal dafür.

@Jörg
Den Systemtakt hab ich über HSE_VALUE in der stm32f4xx.h auf 8 MHz 
eingestellt und PLL_M in der system_stm... hab ich ebenfalls auf 8 
gesetzt.

@xmega
Das mit dem USART_FLAG_TC hab ich dann jetzt mal ausprobiert, kommt aber 
ebenfalls nichts sinnvolles am Rechner an.

Ich hab jetzt mal ein paar verschiedene Daten vom Board an den Rechner 
gesendet, um zu überprüfen, was denn so an kommt. Dazu habe ich einmal 
das Alphabet durchlaufen lassen. Zunächst werden aus einem gesendeten 
Zeichen vom Board, am Rechner immer zwischen zwei und drei. Auffällig 
ist dabei, dass es immer die vier gleichen Zeichen sind, nur in anderer 
Reihenfolge, 0xFC, 0x1C, 0xE0 und 0x00. Vielleicht hilft das ja bei der 
Diagnose.

von Andy (Gast)


Lesenswert?

Juhuuuu, ich habs hin bekommen!!!

Weil es fast immer drei empfangene Zeichen bei einem gesendeten waren, 
dachte ich mir, mach doch mal die Sendebaudrate einfach drei mal höher 
als die Empfangsrate und tada!!! Schon läufts wie erwartet.

Aber die Erklärung dafür kann ich nicht liefern. Vielleicht weiß ja 
jemand die Antwort.

von Fummler (Gast)


Lesenswert?

Würd mich auch mal interessieren.

von cd334 (Gast)


Lesenswert?

Hello Alle!

Bei STM32F4 Discovery ist auf der PA9 ein 4.7uF Kondensator(C49).
Um die UART1 mit PA9/PA10 korrekt zu funktionieren, muss man diese 
kondensator entlöten, oder eine andere UART suchen.

cd334

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.