www.mikrocontroller.net

Forum: Compiler & IDEs Universelle UART Init


Autor: Dominik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich würde gerne nur eine Funktion zum Initalisieren meines 
Mikrokontrollers schreiben. Da die UARTS 0-6 die selben Register haben 
(mit Ausnahme der Zahl... z.B.: u0c0 u1c0 u2c0...).

Der Funktion würde ich folgende Parameter übergeben

UART_Init(UART-Nr., BAUDRATE);

Wie könnte man so etwas realisieren?

Ich hätte nur die Idee, einen Switch in der Funktion zu verwenden. Ich 
würde mir gerne Code sparen und dies besser lösen.

Für Vorschläge wäre ich sehr dankbar!

Mit freundlichen Grüßen
Dominik

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der name ist egal, wenn es register sind und dise im gleichen abstand im 
Speicher sind. Dann kann man sich einfach die Adresse ausrechnen.

Autor: Guru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher uC?

Jedenfalls, wenn der uC memory mapped I/O hat, wie die AVRs in Bezug auf 
viele der Peripherieregister, dann einfach die Adresse(n) entsprechend 
umschalten.

Oder per Preprozessor ##-Operator.

Autor: Dominik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist ein uC von der Renesas R32C111-Reihe.

Den Tipp mit den Adressen find ich ganz gut, danke!

Allerdings sehe ich da bei diesem Datenblatt keinen Zusammenhang (vl ist 
das bei Renesas anders).

z.B.: u0mr = 000368h
      u1mr = 0002E8h
      u2mr = 000338h

Danke für eure Antworten

mfg
Dominik

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wenn du der init funktion die basis adresse übergibst - sind die 
anderen register im bezug zur basis adresse immer gleich?

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es mit einem Array?
typedef struct {
   int *uxc0;
   int *uxm0;
   ...
} uart_info_t;

uart_info_t uart_info[6] = {{ &u0c0, &u0m0 ... },
                            { &u1c0, &u1m0 ... }, .. };
uart_info[3].uxc0 = 0xdd;

Autor: Dominik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich denke, dass ich es so, wie Klaus Falser mir es vorschlägt, machen 
werde. Finde, dass dies auch eine schöne Lösung ist. Besser als die 
Switch-Lösung auf jeden Fall ;-)

Ich hab mir nochmals die Adressen angesehen und kann einfach keinen 
Zusammenhang finden. Es könnte aber trotzdem auch so funktionieren beim 
Renesas uC. Da fehlt mir die Erfahrung.

Vielen Dank für eure Hilfe

mfg
Dominik

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alternative ist ein switc/case, aber nicht als Funktion in einem Modul, 
sondern als inline-Funktion.

Ein optimierender Compiler wirft dann die nicht benötigten Fällt in die 
Tonne.

Mit einem Array sollen die Typen wohl "int volatile*" sein anstatt 
"int*"?

Antwort schreiben

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

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.