Forum: Compiler & IDEs Universelle UART Init


von Dominik (Gast)


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

von Peter II (Gast)


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.

von Guru (Gast)


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.

von Dominik (Gast)


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

von Peter II (Gast)


Lesenswert?

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

von Klaus F. (kfalser)


Lesenswert?

Wie wäre es mit einem Array?
1
typedef struct {
2
   int *uxc0;
3
   int *uxm0;
4
   ...
5
} uart_info_t;
6
7
uart_info_t uart_info[6] = {{ &u0c0, &u0m0 ... },
8
                            { &u1c0, &u1m0 ... }, .. };
9
uart_info[3].uxc0 = 0xdd;

von Dominik (Gast)


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

von Johann L. (gjlayde) Benutzerseite


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*"?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.