STM32F4 USART1

OP #2475372
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
OP #2475410
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
#2475510
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);
#2475795
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.
#2476688
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.
#2477076
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.
#2477254
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.
#2477400
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?
#2477720
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
Angehängte Dateien:
Gast #2601019
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
Gast #2601152
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.
Gast #2601169
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.
Gast #2603363
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

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