Forum: Mikrocontroller und Digitale Elektronik stm32 UART sendet nichts


von stm32uart (Gast)


Lesenswert?

Hallo,

ich habe hier ein STM32 Discovery Board (CPU: STM32F103RB).
Versuche den Uart1 zum Laufen zu bringen, doch leider kommt an dem 
angeschlossenen USB->Serial Konverter nichts an. PA9 -> RX und PA10-> TX

Sourcecode:
1
#include <stm32f10x_gpio.h>
2
#include <stm32f10x_tim.h>
3
#include <stm32f10x_rcc.h>
4
#include <stm32f10x_usart.h>
5
6
void InitializeUart() {
7
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
8
  USART_InitTypeDef init;
9
  init.USART_BaudRate = 115200;
10
  init.USART_WordLength = USART_WordLength_8b;
11
  init.USART_StopBits = USART_StopBits_1;
12
  init.USART_Parity = USART_Parity_No;
13
  init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
14
  init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
15
  USART_Init(USART1, &init);
16
17
  GPIO_InitTypeDef rspin;
18
19
  //TX
20
  rspin.GPIO_Mode = GPIO_Mode_AF_PP;
21
  rspin.GPIO_Mode = GPIO_Pin_9;
22
  rspin.GPIO_Speed = GPIO_Speed_2MHz;
23
  GPIO_Init(GPIOA, &rspin);
24
  //RX
25
  rspin.GPIO_Mode = GPIO_Mode_IN_FLOATING;
26
  rspin.GPIO_Pin = GPIO_Pin_10;
27
  GPIO_Init(GPIOA, &rspin);
28
  USART_Cmd(USART1, ENABLE);
29
}
30
void putchar(char data) {
31
  while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); 
32
33
  USART_SendData(USART1, data); 
34
}
35
int main() {
36
  uint32_t clock = SystemCoreClock;
37
  char a = 0x00;
38
  InitializeUart();
39
  
40
  for (;;) {
41
    if (a > 250) {
42
      a = 0x00;
43
    }
44
45
    putchar(a);
46
    a++;
47
  }
48
49
  return 0; 
50
}

Der STM läuft mit 24Mhz. Das komische ist es kommt überhaupt nichts 
an....

von Rene H. (Gast)


Lesenswert?

Schaltplan?

von Michael F. (startrekmichi)


Lesenswert?

stm32uart schrieb:
> Der STM läuft mit 24Mhz.
Sicher? In deinem Code wird die PLL nicht konfiguriert. Wo ist z.B. 
"SystemInit()"?

> Das komische ist es kommt überhaupt nichts an....
Wie hast du das verifiziert? Nur mit dem Adapter oder mit einem Oszi? 
Ich denke, die Baudrate ist einfach so falsch, dass der Adapter alles 
ignoriert.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Michael Frangenberg schrieb:
> Sicher? In deinem Code wird die PLL nicht konfiguriert. Wo ist z.B.
> "SystemInit()"?

Und wo sind die Clock Freigaben? Anbei mal ein bisschen Code dafür, hier 
wird USART1 auf PortB 6 und 7 initialisiert (und dieser Code läuft auf 
dem VL Discovery):
1
#define BAUDRATE 19200
2
#define USART USART1
3
void UsartInit(void)
4
{
5
GPIO_InitTypeDef GPIO_InitStructure;
6
USART_InitTypeDef USART_InitStructure;
7
USART_ClockInitTypeDef USART_ClockInitStructure;
8
//enable bus clocks
9
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
10
//Set USART1 Tx (PB.06) as AF push-pull
11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
12
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
13
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
14
GPIO_Init(GPIOB, &GPIO_InitStructure);
15
16
//Set USART1 Rx (PB.07) as input
17
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
18
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
19
GPIO_Init(GPIOB, &GPIO_InitStructure);
20
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
21
22
USART_ClockStructInit(&USART_ClockInitStructure);
23
USART_ClockInit(USART, &USART_ClockInitStructure);
24
25
USART_InitStructure.USART_BaudRate = BAUDRATE;
26
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
27
USART_InitStructure.USART_StopBits = USART_StopBits_1;
28
USART_InitStructure.USART_Parity = USART_Parity_No ;
29
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
30
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
31
32
//Write USART parameters
33
USART_Init(USART, &USART_InitStructure);
34
//Enable USART
35
USART_Cmd(USART, ENABLE);
36
}
Vorher auch nicht das vergessen:
1
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

: Bearbeitet durch User
von stm32uart (Gast)


Lesenswert?

Hallo,

danke für die Hilfe. Mit dem Code von Matthias kommt nun zumindest ein 
Zeichensalat an.

Hatte mich beim Umsetzen an dem 
http://visualgdb.com/tutorials/arm/stm32/uart/ Tutorial orientiert, da 
wurde dies mit der Clock und dem Port anderst dargestellt.


SystemInit muss nicht aufgerufen werden dies wird wohl im Hintergrund 
von der Library übernommen. Laut Datenblatt von ST sollte der UART1 doch 
auf Port A liegen? Er läuft aber nur auf Port B?

Liege ich richtig in der Annahme das ich jetzt noch die Baudrate 
"ausrechnen" muss damit diese mit den 24Mhz läuft?

von qUARTz (Gast)


Lesenswert?

Du kannst auch die neue HAL von St verwenden. Da kannst du die Hardware 
sogar Grafisch konfigurieren (Cube-MX). Und er aktiviert die benötigten 
Clocks.

Die neue HAL berechnet die Vorteiler selbst. Hier musst du vermutlich 
anhand der UART-Clock die Parameter berechnen. Du kannst die IP-Pins an 
unterschiedlichen Positionen legen, das musst du auch mappen.

Btw. Cube-MX macht manchmal noch ein paar Fehler. Z.B. wird der PLL 
nicht immer richtig konfiguriert (oder ich bedienen den falsch)

von stm32uart (Gast)


Lesenswert?

Kleiner Nachtrag:

Es lag wirklich nur am Port. Clock_init kann man komplett weg lassen und 
er läuft trotzdem....

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

stm32uart schrieb:
> Es lag wirklich nur am Port. Clock_init kann man komplett weg lassen und
> er läuft trotzdem....

Es ist möglich, das es hier Unterschiede in den verschiedenen Startup 
Codes gibt. Mein Code ist für Atollic Lite und evtl. machen andere 
Umgebungen andere Setups bzw. initialisieren diverse Clocks bereits. Ich 
mach immer auf sicher :-)

: Bearbeitet durch User
von stm32uart (Gast)


Lesenswert?

Matthias Sch. schrieb:
> stm32uart schrieb:
>> Es lag wirklich nur am Port. Clock_init kann man komplett weg lassen und
>> er läuft trotzdem....
>
> Es ist möglich, das es hier Unterschiede in den verschiedenen Startup
> Codes gibt. Mein Code ist für Atollic Lite und evtl. machen andere
> Umgebungen andere Setups bzw. initialisieren diverse Clocks bereits. Ich
> mach immer auf sicher :-)

Gibt es für die ganzen Befehle eine brauchbare Doku?
VisualGDB scheint CMSIS von ST zu nutzen, jedoch listet die "Doku" nur 
alle Befehle auf ohne jegliche Beschreibung wo für was Hand angelegt 
werden muss.

Auf der anderen Seite gibt es noch die "Programming PDFs" von ST, es 
wird grob beschrieben wie die Peripherie programmiert werden muss aber 
es gibt keinen Bezug zur Library.
Als Anfänger ist es wirklich schwer hier die richtigen Funktionen etc. 
herauszupicken. Würde fast schon sagen ohne Tutorials nicht möglich. 
Beim AVR war das einfacher, dort gab es in der Perihperie Beschreibung 
direkt konkrete Funktionen welche benutzt werden konnten....

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

stm32uart schrieb:
> Gibt es für die ganzen Befehle eine brauchbare Doku?
> VisualGDB scheint CMSIS von ST zu nutzen, jedoch listet die "Doku" nur
> alle Befehle auf ohne jegliche Beschreibung wo für was Hand angelegt
> werden muss.

Da ich mittlerweile Coocox nehme, greife ich oft auf die 'Popup' Hilfe 
zurück, die beim Eintippen erscheint. Wenn da nicht das richtige bei 
ist, schaue ich mir die 'peripherie'.h oder .c Dateien, die sowieso im 
Projekt drin sind, nach. Also z.B. 'stm32_adc.h' oder 'stm32_rcc.c'.

Um aber die Register im Einzelnen zu kapieren, wirst du um das F1 
Reference Manual nicht drumrum kommen.

: Bearbeitet durch User
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.