Mw E. schrieb:
> Der Teiler ist so schon in Ordnung.
> Der UART hat eine 16fach Überabtastung des Signals (Dieser Takt muss ins
> BRR).
> Aber die UART PLL hat 4 Nachkommastellen = 16 als Zahl.
> Daher reichts da ne Ganzzahl reinzuwerfen.
>
> Nur wirds jetzt in dem Thread hier inkonsistent wenn der APB einmal
> 100MHz hat und einmal 16MHz.
> Wie soll man da helfen?
>
> Lutz schrieb:
>> Kann ihn auch so posten.
>
> Soll heßen, dass das jetzt nicht mehr der Code ist, der auf dem ARM
> läuft, sondern was zusammenkopiertes?
Also, ich hatte zwei Varianten probiert. Einmal 16 MHZ Clock APB2 und
100 MHz Clock APB2, daher die Verwirrung.
Ich hatte folgendes vergessen:
Es muss im Alternative Function Register zunächst noch eingestellt
werden, welche alternative Funktion auf den Pin laufen soll. Das steht
im Reference auf Seite 189. Bei mir ist das AF7 (SPI, USART1...3)
•
1 | GPIOA_AFRH |= 0x00000770; //Alternative Funktion AF7 für PA9+PA10
|
Dann habe ich die Baudrate jetzt auch von Hand eingestellt.
100000000/115200/16 = 54,25347
Wobei nur 54,25 in das Register passt.
•
1 | USART_BRR = 0x00000364; //= 54,25
|
Jedenfalls sendet TX nun. Hier der Code, falls es jmd interessiert.
Leider bekomme ich in unregelmäßigen Abständen falsche Zeichen
übermitelt.
Vielleicht hat da ja jmd eine Idee ?
•
1 | //für 100 MHz APB2
|
2 | GPIOA_AFRH |= 0x00000770; //Alternate Functions AF7 für PA9 und PA10
|
3 | APB2_USART1 |= 0x00000010U; //Peripherie Bus Clock Enable
|
4 | USART_CR1 |= 0x00002008U; //USART Enable
|
5 | USART_CR2 |= 0x00000000U; //1 Stop Bit
|
6 | USART_BRR = 0x00000364; //54,25
|
7 |
|
8 | while(1)
|
9 | {
|
10 | USART1->DR = 'z';
|
11 | while( (USART_SR & 0x00000040 ) != 64 ); //Warte, bis TC gesetzt wurde
|
12 | }
|