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