Forum: Mikrocontroller und Digitale Elektronik STM32F4 pointer Frage


von Martin F. (martin_f70)


Lesenswert?

Hallo!
Ich habe ein stm32f4-discovery board. Ich habe gesehen dass manche es 
wie das echte Assembler - mäßig programmieren, also mit bits in Adressen 
setzen, beispiel:
1
*((uint32_t volatile *)(0x40023810))=0x08; // RCC->AHB1RSTR ---> reset PORTD

Meine Frage: Wo kann ich nachgucken welche Adressen die register haben 
und welche Werte bestimmte dinge haben die ich setzten möchte?

von Jim M. (turboj)


Lesenswert?

So programmieren nur Idioten, denn das kann man selber nach 3 Wochen 
nicht mehr lesen. Selbst mit dem Manual (Reference Manual, Family Manual 
oder ähnlich) kann man das nur mit viel Mühe entziffern.

Die Hersteller liefern normalerweise benutzbare Header mit,
womit man Code so schreiben kann:
1
RCC->AHB1RSTR = RESET_PORTD;

.. und der Präprozessor + Compiler daraus das macht, was im OP steht.

von Dennis S. (eltio)


Lesenswert?

Jim Meba schrieb:
> So programmieren nur Idioten, denn das kann man selber nach 3
> Wochen
> nicht mehr lesen. Selbst mit dem Manual (Reference Manual, Family Manual
> oder ähnlich) kann man das nur mit viel Mühe entziffern.
>
> Die Hersteller liefern normalerweise benutzbare Header mit,
> womit man Code so schreiben kann:RCC->AHB1RSTR = RESET_PORTD;
>
> .. und der Präprozessor + Compiler daraus das macht, was im OP steht.

Toller Umgang... aber wenigstens eine indirekte Beantwortung der Frage.

Schau mal nach dem "Programming Manual", da sollte das drin stehen.

Gruß
Dennis

von Falk B. (falk)


Lesenswert?

@ Martin Fischer (martin_f70)

>Meine Frage: Wo kann ich nachgucken welche Adressen die register haben
>und welche Werte bestimmte dinge haben die ich setzten möchte?

In den header Files. Aber die absoluten Adressen will man ja gerade 
NICHT verwenden, weil die alles andere als aussagekräftig sind.


*((uint32_t volatile *)(0x40023810))=0x08; // RCC->AHB1RSTR ---> reset 
PORTD

Endlose Schreiberei, fehleranfällig, Kommentar nötig, Kommentar kan 
durch Copy & Paste oder wasauchimmer falsch sein.

RCC->AHB1RSTR = RESET_PORTD;

Kurz, prägnant, selbsterklärend!

Noch Fragen, Kienzle?

von Martin F. (martin_f70)


Lesenswert?

Jim Meba schrieb:
> was im OP steht.

Was ist OP?

von Kaj (Gast)


Angehängte Dateien:

Lesenswert?

Martin Fischer schrieb:
> Meine Frage: Wo kann ich nachgucken welche Adressen die register haben
> und welche Werte bestimmte dinge haben die ich setzten möchte?
Im Reference Maual, siehe Anhang. Da findest du die Adressen der 
Register, usw.

von Martin F. (martin_f70)


Lesenswert?

*((uint32_t volatile *)(0x40023810))=0x08; // RCC->AHB1RSTR ---> reset 
PORTD
0x40023810 ist die adresse für RCC->AHB1RSTR
http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf 
-> seite 178: warum ist der wert für PORTD 0x08 ?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Martin Fischer schrieb:
> 
http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf
> -> seite 178: warum ist der wert für PORTD 0x08 ?

Du bist ins falsche Register geraten. In meinem Ref. Manual auf Seite 
168 (Kapitel 6.3.5) ist das RCC->AHB1RSTR (Address Offset 0x10) 
beschrieben. Und GPIOD_RST sitzt auf Bit 3 = 0x08 oder in 32-bit binär:
0b00000000000000000000000000001000

von Martin F. (martin_f70)


Lesenswert?

Ok, und
1
*((uint32_t volatile *)(0x40020C00))=0x55000000; // GPIOD->MODER ---> PORTD.(12,13,14,15)

Wie kommt man auf die 55000000 ?

Kann mir das noch jemadn erklären? (übrigens: datenblatt 
(http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf) 
Seite 284

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Mit dem Umrechnen von Hexadezimal in Binär hast du es nicht so, oder?
0x55000000 ist doch einfach nur
0b01010101 00000000 00000000 00000000
Und die gesetzten Bits entsprechen dann denen in deinem Register.
Tu dir einen Gefallen und nimm die von den includes gelieferten 
Mnemonics bzw. structs, die entsprechen denen in der Referenz und laufen 
dann auch auf anderen STM32.
Wenn du unbedingt Assembler machen willst, brauchst du aber noch ein 
paar Grundlagen in Zahlensystemen.

von Martin F. (martin_f70)


Lesenswert?

Ok danke, aber eien Frage noch: wo gibt es eine liste von den defines, 
ich weiß ja sonst nicht wie was heißt

von Martin F. (martin_f70)


Lesenswert?

Also werden Bit 24,26,28 und 30 gesetzt?

von holger (Gast)


Lesenswert?

>Ok danke, aber eien Frage noch: wo gibt es eine liste von den defines,

STM32F4xx_DSP_StdPeriph_Lib_V1.3.0\Libraries\CMSIS\Device\ST\STM32F4xx\I 
nclude\stm32f4xx.h

von Martin F. (martin_f70)


Lesenswert?

Martin Fischer schrieb:
> Also werden Bit 24,26,28 und 30 gesetzt?

bei

Matthias Sch. schrieb:
> 0x55000000 ist doch einfach nur
> 0b01010101 00000000 00000000 00000000

von Schaulus Tiger (Gast)


Lesenswert?

holger schrieb:

> STM32F4xx_DSP_StdPeriph_Lib_V1.3.0\...

Ist diese StdPeriph_Lib nicht vor geraumer Zeit durch CubeMX (oder so 
ähnlich) ersetzt worden? Oder was ist dann dieses Cube-Zeugs?

von Martin F. (martin_f70)


Lesenswert?

Martin Fischer schrieb:
> Martin Fischer schrieb:
>> Also werden Bit 24,26,28 und 30 gesetzt?
>
> bei
>
> Matthias Sch. schrieb:
>> 0x55000000 ist doch einfach nur
>> 0b01010101 00000000 00000000 00000000

Ich werde die defines auch nutzen aber kann mir jemand nurnoch schnell 
das erklären? s. Seite 284 im 
http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf

von Martin F. (martin_f70)


Lesenswert?

Ahh habs schon: 0b01010101 00000000 00000000 00000000 -> Pin 12, 
13,14,15 weil für jedes bit 2 werte sind(010101..)

Aber wie kann ich dort dann den port 30 einschalten?

von (prx) A. K. (prx)


Lesenswert?

Martin Fischer schrieb:
> Aber wie kann ich dort dann den port 30 einschalten?

Wenn du Bit 30 vom Port meinst: gibts nicht.

von Martin F. (martin_f70)


Lesenswert?

Das sehe ich anders: http://i.imgur.com/dmLc6UL.png

von (prx) A. K. (prx)


Lesenswert?

Ich sehe da nirgends ein Bit 30 vom Port. Nur ein Bit 30 vom Register.

von Martin F. (martin_f70)


Lesenswert?

Ah ja sehe gerade paar tabelle weiter obnen hast recht danke

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Die Ports haben nur 16 bit. Wie wäre es denn, wenn du dir erstmal ein 
paar Beispielprogramme anschaust und evtl. den Schaltplan vom Discovery 
Board? Da fehlen wirklich jede Menge Grundlagen.
Oder zum Beispiel Uwes Grundlagen fürs Board?
http://mikrocontroller.bplaced.net/wordpress/?page_id=46
Der Schaltplan fürs Board ist Bestandteil des Dokuments UM1472 von STM.

von Martin F. (martin_f70)


Lesenswert?

Wenn ich ehrlich sein soll, das board bekomme ich erst morgen, ich gucke 
nur so tutorials schon an und versuche so bissl was zu verstehen, jetzt 
habe ich aber alles verstanden

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.