Hallo zusammen,
ich versuche gerade die UART3 des STM32F32030XC ans laufen zu kriegen
aber es tut sich gar nichts.
Meine Vermutung ist, dass ich irgendwo in dem Code unten was vergessen
habe und hoffe dass einer von euch mir einen Hinweis geben kann.
Vielen Dank dafür.
1
voidUART3_Config(void)
2
{
3
4
RCC->AHBENR|=RCC_AHBENR_GPIOCEN;// Enable GPIO clock Port C
5
6
/* Configure UART */
7
GPIOC->MODER|=(GPIO_MODER_MODER10_1|GPIO_MODER_MODER11_1);// Switch to alternate function mode
8
GPIOC->AFR[1]|=(GPIO_AFRH_AFSEL10|GPIO_AFRH_AFSEL11);// Select UART3 RX and TX
flo schrieb:> GPIOC->MODER |= (GPIO_MODER_MODER10_1 | GPIO_MODER_MODER11_1); //> GPIOC->AFR[1] |= (GPIO_AFRH_AFSEL10 | GPIO_AFRH_AFSEL11); //
Was sollen diese beiden Zeilen bewirken? Die machen nun nicht gerade
das, was
in den Kommentaren steht. Ich würde mal gründlich lesen, was im RM zu
den GPIO-Registern und im Datenblatt zu den AF steht. Und es schader
auch nicht, in den
CMSIS Headern nachzusehen, was diese Makros eigentlich bedeuten.
UART3 liegt bei Port C auf AF01.
Das '|=' macht hier wenig Sinn, da damit ja höchstens Bits gesetzt
werden können.
Zwar werden nach einem Reset die meisten (aber nicht alle!) Bits auf 0
gesetzt,
aber spätestens, wenn man Pins *um*konfiguriert, fällt einem das auf die
Füße.
Besser wäre es, mit GPIO_AFRH_AFSEL10_Msk erst alle Bits auszumaskieren
(daher der Name _Msk) und dann die benötigten zu setzen.
Außerdem wäre es sinnvoll, erst AFR zu setzen, und erst danach den Port
auf AF umzuschalten (sonst ist der --- wenn auch nur kurz --- eventuell
auf eine andere AF eingestellt).
Danke für die Antworten, ich lese mich gerade ein und schaue was die
Makros so bedeuten.
>Isn't it easier to use STM32CubeMX?
Es ist zwar einfacher aber die Hintergründe hat man dann noch nicht
verstanden.
Zum Pinstatus setzen empfehle ich eine Funktion zu bauen um das nicht
immer neu zu machen.
Das ist fehlerträchtig und nervt irgendwann ;)
Die Funktion bekommt:
- Port -> GPIOA/B/C usw, also direkt dieses Makro welches vom Typ
"GPIO_TypeDef*" ist.
- Pinnummer
- modus (output, input, pulldown/up, alternate, etc)
- geschwindigkeit (davon gibts 4)
- alternate function als nummer (bei manchen L0 kommt ein UARt auch mal
als verschiednene AF numemrnr aus, wodurch ein enum leider nicht geht)
Kann man auch in ein struct packen wen man will ud dann kan man den pin
"uart3_rx" durch die Gegend schubsen im Programm.
Anstatt ein UART3_config zu schreiben wäre doch eine allgemeinere
Funktion besser.
UART_config und es wird übergeben welcher uart da konfiguiert werden
soll.
Beispiel:
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang