Forum: Mikrocontroller und Digitale Elektronik STM32f042k6 - UART Kommunikation


von Jojo N. (jogli)


Lesenswert?

Guten Abend,

Vorgeschichte:

Ich versuche auf dem STM32f042 uC UART zu konfigurieren. Als erstes habe 
ich den USART2 genommen, doch ich bin auf das Problem gestoßen, dass die 
IDLE line immer aktiv war, obwohl ich den PI(PI und STM kommunizieren) 
noch gar nicht angeschlossen habe. Da das STM Board die ganze Zeit am 
USB Kabel hängt und somit wahrscheinlich mit dem USB Port verbunden ist, 
dachte ich OK, dann ergibt es ja auch Sinn dass die IDLE line immer 
aktiv ist, solange halt das Kabel angeschlossen ist. Das senden hat 
übrigens gut funktioniert mit dem USART2. Daher will ich es nun mit dem 
USART1 versuchen, welches NICHT mit dem USB Port verbunden ist.

Mein Problem:

Hier ist der Code auf dem STM32. Ich will eine ganz einfache UART 
Kommunikation(Asynchron) konfigurieren. 1 Start Bit, 1 Stop Bit und 8 
DB.

Die Probleme sind im Code in den Kommentaren zu sehen.

Ich programmiere mit dem mbed PlatformIO framework und auf 
Registerebene.
1
#include <mbed.h>
2
#include <stm32f042x6.h>
3
4
#define LED (1 << 3)
5
6
int main() {
7
  //enable HSI48 clk
8
  RCC->CR2 |= RCC_CR2_HSI48ON;
9
  //use HSI48 as sysclk
10
  RCC->CFGR |= 0b11;
11
  //enable peripherals
12
  RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
13
  RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
14
15
  //enable clock
16
  USART1->CR2 |= USART_CR2_CLKEN;
17
18
  //PA9 := TX, PA10 := RX
19
20
  //DEBUG LED zur Statusanzeige
21
  RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
22
  GPIOB->MODER |= (1 << 6);
23
24
  //sysclk for USART1
25
  RCC->CFGR3 |= 1;
26
27
  //alternate function mode
28
  GPIOA->MODER |= (0xaul << 18);
29
  //highspeed
30
  GPIOA->OSPEEDR |= (0xful << 18);
31
  //UART functionallity
32
  GPIOA->AFR[1] |= (0b10001ul << 4);
33
34
  //115200 Braudrate
35
  USART1->BRR = 0x1A1;
36
37
38
  //enable USART 
39
  USART1->CR1 |= USART_CR1_UE;
40
41
  //TX and RX enable
42
  USART1->CR1 |= USART_CR1_TE;
43
  USART1->CR1 |= USART_CR1_RE;
44
45
  //wait for IDLE line, then turn LED on
46
  while ((USART1->ISR & USART_ISR_IDLE) != USART_ISR_IDLE);
47
  GPIOB->ODR = LED;
48
  
49
  //warten bis eine IDLE line gefunden wird, dann die LED anschalten,
50
  //solange LED blinken lassen
51
  while ((USART1->ISR & USART_ISR_IDLE) != USART_ISR_IDLE) {
52
    for ( unsigned x = 0 ; x < 0x1ffff; ++x) {
53
      __NOP();
54
      __NOP();
55
    }
56
    GPIOB->ODR ^= LED;
57
  }
58
59
  //1. Problem -> LED geht an obwohl keine Spannung(IDLE line) anliegt.
60
  GPIOB->ODR = LED;
61
62
  while(1) {
63
64
   //2. Problem
65
   //LED geht nicht aus, wenn ich etwas an den RX pin mit den gleichen Einstellungen schicke(mit Oszilloskop geprüft)
66
   
67
/*
68
Das Problem ist, dass das RXNE (Receive buffer NOT EMPTY) anscheinend nicht geupdated wird. Also entweder liegt es daran, dass das Startbit nicht erkannt wird, oder es hat eine andere Urasache.
69
*/
70
    while((USART1->ISR & USART_ISR_RXNE) != USART_ISR_RXNE);
71
    GPIOB->ODR = 0; 
72
   //clear RXNE flag
73
    USART1->RQR |= USART_RQR_RXFRQ;
74
}

Seht ihr etwas bzw. kann mir jemand helfen?


PS: Komisch ist, wenn ich das Oszilloskop anschließe, dann reagiert 
(nur) die IDLE erkennung.

Liebe Grüße

: 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.