Hallo zusammen,
ich versuche den LPUART1 des G431@170MHz zum Laufen zu bringen (nein:
HAL und LL sind keine Alternative):
Initialisierung:
1 | RCC->APB1ENR2 |= RCC_APB1ENR2_LPUART1EN;
|
2 | RCC->CCIPR |= 0x01 << RCC_CCIPR_LPUART1SEL_Pos;
|
3 | LPUART1->PRESC = 0x0111; // presc: 16
|
4 | uint32_t clock = 170'000'000;
|
5 | clock /= 16;
|
6 | clock *= 256;
|
7 | clock /= 9600;
|
8 | LPUART1->BRR = clock;
|
9 | LPUART1->CR1 |= USART_CR1_FIFOEN;
|
10 | LPUART1->CR1 |= USART_CR1_RE;
|
11 | // LPUART1->CR1 |= USART_CR1_TE;
|
12 | LPUART1->CR1 |= USART_CR1_UE;
|
Das BRR bekommt: 283333. Das sollte laut DB alle Anforderungen erfüllen.
Später lese ich in einer Polling-Loop:
1 | if (LPUART1->ISR & USART_ISR_RXNE_RXFNE) {
|
2 | uint8_t b = LPUART1->RDR;
|
3 | IO::outl<trace>("LPUART: ", b);
|
4 | }
|
Dort lese ich dann:
1 | LPUART: 128
|
2 | LPUART: 128
|
3 | LPUART: 0
|
wenn ich ein '\n' über die ser. Schnittstelle ausgebe (per LA
verifiziert).
Sende ich mit der 8-fach höheren Baudrate von 76800Baud, so kommen die
Zeichen korrekt an.
Wo ist mein Fehler?