www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 Usart DR register bleibt leer


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: stm32 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo Leute,

Ich schaffe es partout nicht, in das USART2->DR Register zu schreiben, 
um ein Zeichen zu senden.

Habe ich etwas vergessen? Der µC ist ein STM32f100rb und ich benutze 
Keil uVision.

Code:
...
  /* PA2, USART2_TX Ausgabe der Daten!*/
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);    
  RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // 50mhz, 10mhz, 2mhz 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   // push pull
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;  
   
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  
  USART_InitStructure.USART_BaudRate = 38400;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_Mode = USART_Mode_Tx;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  
  USART_Init(USART2, &USART_InitStructure);

  USART_Cmd(USART2, ENABLE);     

  //USART_ITConfig(USART2, USART_IT_TXE, DISABLE); // TXE=Transfer Register Empty -> neues Zeichen reinschreiben


  USART_SendData(USART2, 0x1122);

...

Dies ist der relevante Ausschnitt. Die Register werden beschrieben, 
lediglich das DR Register bleibt leer (in SendData).
Das USART2 Anzeige Modul des Debuggers bleibt ebenfalls leer (wobei ich 
nicht weiß, ob das überhaupt funktioniert mit dem Discovery Board, oder 
ob ich noch was einstellen muss..)

Bei Betrachtung von USART_SendData() ist mir noch ne Frage eingefallen: 
Dort werden die Daten mit 0x01FF ver"and"et. Das Register ist nur 8 Bit 
groß, das verstehe ich. Aber was passiert mit den oberen 16 Bits? Die 
kann man doch nicht einfach so wegfallen lassen?

Habt ihr Ideen?

Danke & viele Grüße.

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
stm32 schrieb:

>   RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
>   RCC_APB1PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

Fällt dir da was auf?

Autor: stm32 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Du meinst, ich aktiviere für GPIOA und AFIO den Takt, oder muss ich das 
verodern?

Wie auch immer, die Pins sollten doch eh egal sein, momentan greife ich 
das Signal noch gar nicht an den Pins ab, denn das DR Register wird ja 
noch nichtmals geschrieben, oder hängt das unmittelbar zusammen?

Danke :)

Autor: stm32 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Edit: ach du scheiße, hab' die Zahlen gesehen -.-

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
stm32 schrieb:

> Aber was passiert mit den oberen 16 Bits? Die
> kann man doch nicht einfach so wegfallen lassen?

Klar kann man. Im Regelfall überträgt eine UART 8-Bit Daten. Alternativ
könnte die Lib natürlich auch schmollen und stehen bleiben, wenn in den
nicht übertragenen Bits nicht 0 steht.

Beitrag #2643087 wurde vom Autor gelöscht.
Autor: stm32 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Jo, aber dann fallen die Bits halt weg. Wieso nimmt man dann als 
Datentyp nicht gleich uint8_t und bekommt n Fehler, wenn 2 Bytes 
reinkommen?
Aber das is eigentlich gar nicht das Problem ;)

Habe die Takt Config für GPIOA angepasst, aber wie gefragt: das USART2 
DR Register sollte doch davon unbeeindruckt sein?

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Falls es dir noch nicht aufgefallen ist: Es gibt zwei DR Register. Eines 
fürs Senden und eines fürs Empfangen. Rate mal, was passiert, wenn man 
versucht, das fürs Senden zuständige DR auszulesen.

Autor: Reinhard B. (brainstorm)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
stm32 schrieb:
> Die Register werden beschrieben,
> lediglich das DR Register bleibt leer (in SendData).

Achtung... Du weißt aber schon, dass du beim Auslesen von DR prinzipiell 
nie das zurückbekommst, was du hineingeschrieben hast?

mfg

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
stm32 schrieb:

> Jo, aber dann fallen die Bits halt weg. Wieso nimmt man dann als
> Datentyp nicht gleich uint8_t und bekommt n Fehler, wenn 2 Bytes
> reinkommen?

Wahrscheinlich kennt diese UART auch einen 9-Bit Modus (RS485).

Autor: stm32 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
A. K. schrieb:
> stm32 schrieb:
>
>> Jo, aber dann fallen die Bits halt weg. Wieso nimmt man dann als
>> Datentyp nicht gleich uint8_t und bekommt n Fehler, wenn 2 Bytes
>> reinkommen?
>
> Wahrscheinlich kennt diese UART auch einen 9-Bit Modus (RS485).

Stimmt natürlich :)

A. K. schrieb:
> Falls es dir noch nicht aufgefallen ist: Es gibt zwei DR Register. Eines
> fürs Senden und eines fürs Empfangen. Rate mal, was passiert, wenn man
> versucht, das fürs Senden zuständige DR auszulesen.

Hm, es gibt laut Datenblatt (Reference Manual) nur ein DR register, das 
sowohl fürs Senden als auch Empfangen gedacht ist (Seite 610), oder hab' 
ich das falsch verstanden?

Jedenfalls ist das Register als rw gekenntzeichnet.


Reinhard B. schrieb:
> stm32 schrieb:
>> Die Register werden beschrieben,
>> lediglich das DR Register bleibt leer (in SendData).
>
> Achtung... Du weißt aber schon, dass du beim Auslesen von DR prinzipiell
> nie das zurückbekommst, was du hineingeschrieben hast?
>
> mfg

Hier wirds interessant denke ich. Das heißt, der Debugger, mit dem ich 
das Register anzeige zeigt unter umständen NICHT das vorher 
reingeschriebene an, auch nicht im single step?

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
stm32 schrieb:

> Hm, es gibt laut Datenblatt (Reference Manual) nur ein DR register, das
> sowohl fürs Senden als auch Empfangen gedacht ist (Seite 610), oder hab'
> ich das falsch verstanden?

Guck mal Bildchen "USART block diagram", dann wirds vielleicht klarer.

Autor: stm32 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Okay verstehe.

Aber wenn der richtige Modus eingeschaltet ist (TX), sollte ich doch 
reinschreiben können?

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
stm32 schrieb:

> Aber wenn der richtige Modus eingeschaltet ist (TX), sollte ich doch
> reinschreiben können?

Kannst du ja auch. Nur mit dem Auslesen hapert's, denn das ist das 
andere Register, das vom RX.

Autor: Reinhard B. (brainstorm)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
stm32 schrieb:
> Das heißt, der Debugger, mit dem ich
> das Register anzeige zeigt unter umständen NICHT das vorher
> reingeschriebene an, auch nicht im single step?

Nicht nur unter Umständen - immer.

Das selbe hat auch A.K. gemeint mit den zwei Registern. Beim Schreiben 
auf DR wird das "Senden"-Register beschrieben und beim Lesen von DR wird 
aus dem "Empfangs"-Register gelesen. Vom "Umschalten" bekommst du nichts 
mit, beide Register werden über DR angesprochen.

mfg

Autor: stm32 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ah. Verstehe denke ich. Wenn der Debugger das Register auslesen will, 
landet er direkt im Rx Register ok.

Ich dachte der Debugger wäre da irgendwie... "schlauer" oder so. Aber 
okay, wenn das in Hardware so implementiert ist - gut. Dann hätte ich 
die ganze Zeit nur mal den Pin angucken sollen ;)

Im UART2 Viewer sehe ich allerdings nichts, ebenso im Logic Analyzer. 
Muss mein Debugger das speziell unterstützen?

Danke für eure Infos!

Autor: A. K. (prx)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
stm32 schrieb:

> Ich dachte der Debugger wäre da irgendwie... "schlauer" oder so. Aber
> okay, wenn das in Hardware so implementiert ist - gut. Dann hätte ich
> die ganze Zeit nur mal den Pin angucken sollen ;)

Um Prinzip ja, nur wärst du dann am ABP1/2 gescheitert. ;-)

Autor: stm32 (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Stimmt ;) Aber das hätte ich vllt noch gesehen, so weit war ich ja noch 
garnicht, da das DR Register immer "leer" blieb ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net