Forum: Mikrocontroller und Digitale Elektronik USART STM32 Empfangfehler ?


von Tomi (Gast)


Lesenswert?

Hallo,

ich habe einen SM3210e-Eval board mit einem STM32F103Z Prozessor von ARM
drauf und habe das Problem das wenn ich was sende ich am Terminal was 
ganz anderes raus bekomme....

Ich sende 0x49 bekomme  8698 (Hex) angezeigt
Ich sende (uint8_t *)'A' bekomme  FE06 (Hex) angezeigt
Ich sende (uint8_t *)'0' bekomme  F800 (Hex) angezeigt

Denke meine GPIO sollte stimmen das ich ja was empfange.
An meinem Terminal sollte auch alles richtig sein:

Baud:9600
Data:8
Stop:1
Parity:None

Hier mein Code....
1
USART_InitTypeDef USART_InitStructure;
2
3
4
void main(void)
5
{
6
7
Init();
8
Config_ADC();
9
Config_Usart();
10
...
11
12
while(1)
13
{
14
  USART_SendData(USART1,0x49); //
15
  /* Loop until the end of transmission */
16
  while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
17
  {
18
  }
19
}
20
}
21
22
void Config_Usart()
23
{
24
  
25
  //enable bus clocks
26
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
27
28
  /* Configure USART2 Tx as alternate function push-pull */
29
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
30
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
31
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
32
  GPIO_Init(GPIOA, &GPIO_InitStructure);
33
  
34
  USART_InitStructure.USART_BaudRate = 9600;
35
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
36
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
37
  USART_InitStructure.USART_Parity = USART_Parity_No;
38
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
39
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
40
  /* Configurating and enabling USART1 */ 
41
  USART_Init(USART1, &USART_InitStructure); 
42
43
44
  USART_Cmd(USART1, ENABLE);
45
}

von Steel (Gast)


Lesenswert?

Wie soll sich die Übertragung denn Synchronisieren wenn du lückenlos 
Dauerfeuer vom uC aus gibst?

Starte mal das Terminal und schalte den uC dann erst ein (oder Reset). 
Besser: Wartezeit von x ms zwischen den Übertragungen.

Welches Terminalprogramm? Ich kann hterm empfehlen.

von Davis (Gast)


Lesenswert?

Aus der Hüfte: da stimmt etwas mit den Clockeinstellungen nicht.

von Tomi (Gast)


Lesenswert?

Noch ne kleine Frage:

Wie sollte sich typischerweise die USART Bitfolge zusammensetzen ?

Eigentlich ja so :

Startbit D0 D1 D2 D3 D4 D5 D6 D7 (D8) (Parität) Stopbit(s)

Wie lange sind dann die Start/Stopbits ? Woran erkenne ich diese ?
Wozu ist die Parität ?
und warum ist das D8 in () ?

von Tomi (Gast)


Lesenswert?

Steel schrieb:
> Wie soll sich die Übertragung denn Synchronisieren wenn du
> lückenlos
> Dauerfeuer vom uC aus gibst?
>
> Starte mal das Terminal und schalte den uC dann erst ein (oder Reset).
> Besser: Wartezeit von x ms zwischen den Übertragungen.
>
> Welches Terminalprogramm? Ich kann hterm empfehlen.

Ich benütze hterm bereits.
Mein Ziel war es zunächst nur Daten senden und später einen Interrupt 
einbauen der dann die Daten sendet.

Naja das mit Reset und warten hat nicht geholfen

von Steel (Gast)


Lesenswert?

Dann tippe ich auch auf die Clock-Einstellung.

von Alex (Gast)


Lesenswert?

Hallo,

hast du die Clocks initialisiert? (SystemInit();)

Hterm hat als Standardmäßige Baudeinstellung 115200, da kommt es 
manchmal vor das man vergisst die richtige einzustellen.

von Tomi (Gast)


Lesenswert?

Alex schrieb:
> Hallo,
>
> hast du die Clocks initialisiert? (SystemInit();)
>
> Hterm hat als Standardmäßige Baudeinstellung 115200, da kommt es
> manchmal vor das man vergisst die richtige einzustellen.

Einfach am Anfang SystemInit(); aufrufen ? genügt das schon ?

von Scherflein (Gast)


Lesenswert?

>Startbit D0 D1 D2 D3 D4 D5 D6 D7 (D8) (Parität) Stopbit(s)

>Wie lange sind dann die Start/Stopbits ? Woran erkenne ich diese ?

Musst nicht Du tun. Das macht der UART (bei richtiger Einstellung)

>Wozu ist die Parität ?

Zum Fehlercheck?!

>und warum ist das D8 in () ?

Die Wortlänge bei einer UART Strecke ist konfigurierbar.
Das können 5 bis ich weiss nicht wieviel Bits sein...

von Scherflein (Gast)


Lesenswert?

Und man könnte ja z.B. mal

http://de.wikipedia.org/wiki/UART

lesen.

von Tomi (Gast)


Lesenswert?

Steel schrieb:
> Dann tippe ich auch auf die Clock-Einstellung.

ALso ich habe am Anfang die SystemInit(); aufgerufen aber gebracht hat 
es nichts, deswegen leigt das nicht am Clock ?

von Tomi (Gast)


Lesenswert?

Also der Fehler liegt in dem system_stm32f10x.c file,
im SetSysClock() function in der SystemInit.

Wenn ich es auskommentiere läuft alles langsamer aber dafür geht es.

Da ich auch aber ne ADC auswertung mache , ist das nicht so gut, wie 
mische ich das ganze jetzt zusammen das es für USART geht aber dafür das 
ADC nicht leidet ??



Mein preprozessor hat den Symbol STM32F10X_HD_VL definiert.

in the system_stm32f10x.c:

#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined 
STM32F10X_HD_VL)
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
 #define SYSCLK_FREQ_24MHz  24000000
#else
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz  24000000 */
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
#define SYSCLK_FREQ_72MHz  72000000
#endif
.....



static void SetSysClock(void)
{
#ifdef SYSCLK_FREQ_HSE
  SetSysClockToHSE();
#elif defined SYSCLK_FREQ_24MHz
  SetSysClockTo24();
#elif defined SYSCLK_FREQ_36MHz
  SetSysClockTo36();
#elif defined SYSCLK_FREQ_48MHz
  SetSysClockTo48();
#elif defined SYSCLK_FREQ_56MHz
  SetSysClockTo56();
#elif defined SYSCLK_FREQ_72MHz
  SetSysClockTo72();
#endif

 /* If none of the define above is enabled, the HSI is used as System 
clock
    source (default after reset) */
}

von Franzi (Gast)


Lesenswert?

Zur richtigen Erstellung von system_stm32f10x.c bietet STM ein 
Excel-Tool an. Da gibst du deine Systemparameter ein und dir wird ein 
passendes system_stm32f10x.c erstellt. Kennst du das, hast du das 
verwendet, oder hast du deine system_stm32f10x.c aus einem fremden 
Projekt, mit fremden Einstellungen kopiert?

Das Excel-Tool ist irgendwo auf der STM-page versteckt, einfach mal 
suchen...

Grüße,
Franzi

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.