Forum: Mikrocontroller und Digitale Elektronik stm32f107 sendet 0xFF bei USART-Initialisierung


von V. B. (dr-robotnik)


Lesenswert?

Hallo zusammen,
ich spiele gerade ein wenig mit dem stm32f107 rum und habe in komisches 
Verhalten des USART: bei einem Reset sendet der Controller scheinbar ein 
'0xFF', jedenfalls wird eins von meinem Terminal-Programm auf dem PC 
empfangen.

Ich bin mein Hauptprogramm im Debug-Modus Schritt für Schritt 
durchgegangen und habe festgestellt, dass das Zeichen während der 
Initialisierung des USART gesendet wird. So sieht meine Initialisierung 
aus - also alles so in der Reihenfolge wie es vom Reference-Manual von 
st vorgeschrieben wird.
1
void USARTInit(void) {
2
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
3
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
4
5
  GPIO_InitTypeDef GPIO_InitStructure;
6
7
  /* Initialize USART2 Tx Pin */
8
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
9
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
10
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
11
  GPIO_Init(GPIOD, &GPIO_InitStructure);
12
13
  /* Initialize USART2 Rx Pin */
14
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
15
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
16
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
17
  GPIO_Init(GPIOD, &GPIO_InitStructure);
18
19
  GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
20
21
22
23
  USART_InitTypeDef USART_InitStructure;
24
  USART_InitStructure.USART_BaudRate = 9600;
25
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
26
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
27
  USART_InitStructure.USART_Parity = USART_Parity_No;
28
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
29
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
30
  USART_Init(USART2, &USART_InitStructure);
31
32
  USART_Cmd(USART2, ENABLE);
33
}

Komischerweise wenn ich beim Debuggen mit "Step Into" in die USARTInit() 
reingehe und dort alles Schritt für Schritt durchgehe bekomme ich kein 
'0xFF' auf der Ausgabe...


Wie kann ich das 0xFF unterdrücken? Kann jemand helfen?

Vielen Dank und viele Grüße!

von M.K. B. (mkbit)


Lesenswert?

Ich vermute, dass das 0xFF durch einen einfachen Impuls auf der Leitung 
ausgelöst wird.

Ein Spike auf der Leitung sieht wie folgt aus:
Siehe: 
http://de.wikipedia.org/wiki/Universal_Asynchronous_Receiver_Transmitter

1 -- ---------------------
0   -

Interpretiert man dies nun aus sich des Uart Empfängers, dann ist der 
Spike das Startbit. Darauf folgen 1er Bits (8 Daten, Stop).
Resultat: 0xFF

Gehst du das ganze im Debugmodus langsam durch, ist der Spike vermutlich 
zu lang und das Telegram wird als ungültig erkannt.

Ich kenn mich jetzt nicht mit deinem Controller aus, aber was du mal 
prüfen könntest wäre der Pegel des Tx Pins, bevor du diesen als UART 
konfigurierst. Schau mal ob sich was ändert, wenn du den Logikpegel 
vorher anders konfigurierst.

Schreib ob es geklappt hat oder nicht, dann schaun wir mal weiter.

von Ingo (Gast)


Lesenswert?

Das machen alle meine Controller... Normal!

von M.K. B. (mkbit)


Lesenswert?

Ist das jetzt gut oder schlecht?

von unbekannter ARM-User (Gast)


Lesenswert?

probiere mal das hier:

/* Initialize USART2 Tx Pin */
  GPIO_SetBits(GPIOD,GPIO_Pin_5); // setzt Tx-Pin auf high
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

und berichte, ob erfolgreich.

von V. B. (dr-robotnik)


Lesenswert?

Hallo zusammen,

sorry ich habe den Thread aus den Augen verloren, möchte euch aber nicht 
vorenthalten was die Lösung für das Problem zu sein scheint.
Das bemängelte Verhalten tritt nicht mehr auf wenn man das Pin-Remapping 
VOR der GPIO-Initialisierung macht also in etwa so:
1
  GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
2
3
  /* Initialize USART2 Tx Pin */
4
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
5
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
6
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
7
  GPIO_Init(GPIOD, &GPIO_InitStructure);
8
9
  /* Initialize USART2 Rx Pin */
10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
11
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
12
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
13
  GPIO_Init(GPIOD, &GPIO_InitStructure);

Dann wird beim resetten kein unerwünschtes Byte vom terminal mehr 
empfangen.

Schöne Grüße!

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.