Forum: Mikrocontroller und Digitale Elektronik STM32 NVIC Mapping


von Leopold N. (leo_n)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin ein klein wenig verwirrt.
Beim STM32F103C8T6 mit dem Cortex M3 im Datenblatt des Cortex M3 steht 
das NVIC Register Mapping (siehe Bild).

Wie sollen 21 IPRx Register in einen Speicherraum von 0x300 bis 0x320 
passen?
Jedes Register hat doch 4 Bitfelder á 8 Bit und ist somit ein 32 Bit 
Register, dass einen Adressraum von 0x0, 0x1, 0x2 und 0x3 einnimmt.
Und bei 21 Registern á 32 Bit lande ich am Ende bei einer Adresse 
oberhalb von 0x320.

Grüße

: Bearbeitet durch User
von Christopher J. (christopher_j23)


Lesenswert?

Leopold N. schrieb:
> Jedes Register hat doch 4 Bitfelder á 8 Bit und ist somit ein 32 Bit
> Register, dass einen Adressraum von 0x0, 0x1, 0x2 und 0x3 einnimmt.

Das ist korrekt aber jedes dieser Register ist für vier Interrupts à 8 
Bit. Im Bild IP0, IP1, IP2 und IP3 in IPR0.

von pegel (Gast)


Lesenswert?

Hex <> Dezimal

von Leopold N. (leo_n)


Lesenswert?

pegel schrieb:
> Hex <> Dezimal

?
Ich verstehe nicht ganz, was Du damit sagen möchtest.

Christopher J. schrieb:
> Leopold N. schrieb:
>> Jedes Register hat doch 4 Bitfelder á 8 Bit und ist somit ein 32 Bit
>> Register, dass einen Adressraum von 0x0, 0x1, 0x2 und 0x3 einnimmt.
>
> Das ist korrekt aber jedes dieser Register ist für vier Interrupts à 8
> Bit. Im Bild IP0, IP1, IP2 und IP3 in IPR0.

Das habe ich schon gerafft.
Aber mein Problem ist ein anderes.
Im Datenblatt (siehe Bild) sind 21 Register angegeben (genauer 
IPR0....IPR20)
Jetzt kommt die Adressierung:

IPR_0: 0x300
IPR_1: 0x304
IPR_2: 0x308
IPR_3: 0x30C
IPR_4: 0x310
IPR_5: 0x314
IPR_6: 0x318
IPR_7: 0x31C
IPR_8: 0x320
IPR_9: 0x324


Jetzt bin ich schon über die Maximaladresse von 0x320 hinaus, darf aber 
laut Datenblatt nur bis 0x320 gehen.
Wo ist mein Fehler?

: Bearbeitet durch User
von Nico W. (nico_w)


Lesenswert?

Die erste und die letzte Adresse sind angegeben. Wie kommst du jetzt 
darauf dass das immer um 4 weiter geht?

von Leopold N. (leo_n)


Lesenswert?

Nico W. schrieb:
> Die erste und die letzte Adresse sind angegeben. Wie kommst du
> jetzt
> darauf dass das immer um 4 weiter geht?

Weil die Register 32Bit = 4Byte breit sind und der Speicher meines 
Wissens nach byteweise adressiert wird.

von Nico W. (nico_w)


Lesenswert?

Edit... Jetzt muss ich doch nochmal nachschlagen.

: Bearbeitet durch User
von Nico W. (nico_w)


Lesenswert?

Wo hast du denn dein Datenblatt her?

von Nico W. (nico_w)


Lesenswert?

So, hab jetzt alles zusammengesucht. Ist nen Haufen Arbeit. Wäre nett, 
wenn man das gleich als Info bekommt.

Einmal das Programming Manual [1] woher dein Screenshot kommt. Auf Seite 
129 findet man diesen Teil.

Als nächstes habe ich dann einmal das Cortex M3 Reference Manual [2] 
rausgeholt. Wenn man jetzt hier nach dem gleichen Bereich sucht findet 
man die Übersicht der NVIC-Register.

Auf der Seit 8-4 sieht man, dass der Cortex M3 bis zu 0xE000E4F0 geht.

PS: Ist eh schon etwas seltsam im Nachhinein, wenn da eine Dezimale 20 
bei 0x320 steht. 0x00 bis 0x20 sind schon 33. Demnach müsste da 
eigentlich IPR32 stehen. Wie auch immer.

[1] 
https://www.st.com/content/ccc/resource/technical/document/programming_manual/5b/ca/8d/83/56/7f/40/08/CD00228163.pdf/files/CD00228163.pdf/jcr:content/translations/en.CD00228163.pdf

[2] 
http://infocenter.arm.com/help/topic/com.arm.doc.ddi0337e/DDI0337E_cortex_m3_r1p1_trm.pdf

: Bearbeitet durch User
von Leopold N. (leo_n)


Lesenswert?

> Als nächstes habe ich dann einmal das Cortex M3 Reference Manual [2]
> rausgeholt. Wenn man jetzt hier nach dem gleichen Bereich sucht findet
> man die Übersicht der NVIC-Register.
>
> Auf der Seit 8-4 sieht man, dass der Cortex M3 bis zu 0xE000E4F0 geht.


Und was soll das jetzt konkret für meine Frage bedeuten?
Im Register Map vom NVIC steht aber als Ende für die IPRx Register der 
Offset 0x320

: Bearbeitet durch User
von Nico W. (nico_w)


Lesenswert?

Nico W. schrieb:
> PS: Ist eh schon etwas seltsam im Nachhinein, wenn da eine Dezimale 20
> bei 0x320 steht. 0x00 bis 0x20 sind schon 33. Demnach müsste da
> eigentlich IPR32 stehen. Wie auch immer.

S.o.

von Nico W. (nico_w)


Lesenswert?

Hier noch aus dem core_cm3.h vom CMSIS. Ich denke, dass da dann das 
Programming Manual einfach fehlerhaft ist.
1
/**
2
  \brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).
3
 */
4
typedef struct
5
{
6
  __IOM uint32_t ISER[8U];               /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */
7
        uint32_t RESERVED0[24U];
8
  __IOM uint32_t ICER[8U];               /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */
9
        uint32_t RSERVED1[24U];
10
  __IOM uint32_t ISPR[8U];               /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */
11
        uint32_t RESERVED2[24U];
12
  __IOM uint32_t ICPR[8U];               /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */
13
        uint32_t RESERVED3[24U];
14
  __IOM uint32_t IABR[8U];               /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register */
15
        uint32_t RESERVED4[56U];
16
  __IOM uint8_t  IP[240U];               /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) */
17
        uint32_t RESERVED5[644U];
18
  __OM  uint32_t STIR;                   /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register */
19
}  NVIC_Type;

von Leopold N. (leo_n)


Lesenswert?

Nico W. schrieb:
> Nico W. schrieb:
>> PS: Ist eh schon etwas seltsam im Nachhinein, wenn da eine Dezimale 20
>> bei 0x320 steht. 0x00 bis 0x20 sind schon 33. Demnach müsste da
>> eigentlich IPR32 stehen. Wie auch immer.
>
> S.o.

Nein!

Die Register sind 4 Byte breit, belegen also pro Register 4 Byte.

Register IPR0 belegt also den Speicher von 0x320 bis 0x324 und so 
weiter.

Edit: Meinst du dass da einfach ein Fehler vorliegt, meine Adressierung 
stimmt und man am Ende an Adresse 0x350 rauskommt?

: Bearbeitet durch User
von Nico W. (nico_w)


Lesenswert?

Leopold N. schrieb:
> Nein!
>
> Die Register sind 4 Byte breit, belegen also pro Register 4 Byte.
>
> Register IPR0 belegt also den Speicher von 0x320 bis 0x324 und so
> weiter.

Ich habe nur versucht deinen Screenshot zu interpretieren. Vielleicht 
auch falsch gedacht. Auf jeden Fall steht da bei Offset 0x320 ein 
NVIC_IPR20, was nicht richtig aussieht.

Leopold N. schrieb:
> Edit: Meinst du dass da einfach ein Fehler vorliegt, meine Adressierung
> stimmt und man am Ende an Adresse 350 rauskommt?

Siehe das Listing aus dem CMSIS. Ich denke, dass der Korrekt ist.

von Leopold N. (leo_n)


Lesenswert?

Nico W. schrieb:
> Leopold N. schrieb:
>> Nein!
>>
>> Die Register sind 4 Byte breit, belegen also pro Register 4 Byte.
>>
>> Register IPR0 belegt also den Speicher von 0x320 bis 0x324 und so
>> weiter.
>
> Ich habe nur versucht deinen Screenshot zu interpretieren. Vielleicht
> auch falsch gedacht. Auf jeden Fall steht da bei Offset 0x320 ein
> NVIC_IPR20, was nicht richtig aussieht.
>
> Leopold N. schrieb:
>> Edit: Meinst du dass da einfach ein Fehler vorliegt, meine Adressierung
>> stimmt und man am Ende an Adresse 350 rauskommt?
>
> Siehe das Listing aus dem CMSIS. Ich denke, dass der Korrekt ist.

Die im CMSIS haben ja keine absoluten Adressen drinstehen, sondern 
definieren das Ganze als aneinandergereihte Arrays/Vektoren.
Aber rein rechnerisch müssten die ja auch über die Endadresse 
rauskommen.

von Leopold N. (leo_n)


Angehängte Dateien:

Lesenswert?

Hier noch der Ausschnitt aus CMSIS core_cm3.h

Hier definieren die ein Array mit 240 Elementen á 8Bit, das bei Offset 
0x300 anfängt. Enden sollte das Array dann bei Offset 0x540 oder?

von Nico W. (nico_w)


Lesenswert?

Leopold N. schrieb:
> Enden sollte das Array dann bei Offset 0x540 oder?

Nein.

Warum muss man eigentlich einen Screenshot von Code machen? Was ist an 
deinem Screenshot anders als an dem Listing oben von mir?

Anfangen tut der kram bei 0x300.
240 Byte später sind wir bei? 240 Dezimal -> 0xF0 Hex

0xE000E100 + 0x3F0. Bzw. 0xE000E4F0 (siehe oben 
Beitrag "Re: STM32 NVIC Mapping")

: Bearbeitet durch User
von Leopold N. (leo_n)


Lesenswert?

Nico W. schrieb:
> Anfangen tut der kram bei 0x300.
> 240 Byte später sind wir bei? 240 Dezimal -> 0xF0 Hex

Tschuldigung, hatte die 240 Byte als hex-zahl in meinen tr eingegeben...
Ja so macht es dann Sinn.

Ist also im Endeffekt dann ein Fehler im Cortex M3 Manual oder?

Danke

: Bearbeitet durch User
von Christopher J. (christopher_j23)


Lesenswert?

Leopold N. schrieb:
> Ist also im Endeffekt dann ein Fehler im Cortex M3 Manual oder?

Ich dachte es wäre aus dem Programming Manual für den STM32. Wie auch 
immer, die Abbildung ist definitiv so nicht richtig, da hast du recht.

von Leopold N. (leo_n)


Lesenswert?

Christopher J. schrieb:
> Leopold N. schrieb:
>> Ist also im Endeffekt dann ein Fehler im Cortex M3 Manual oder?
>
> Ich dachte es wäre aus dem Programming Manual für den STM32. Wie auch
> immer, die Abbildung ist definitiv so nicht richtig, da hast du recht.

Ja Programming Manual stimmt, danke für die Korrektur.

Dann wäre das also geklärt, vielen Dank für Eure Hilfe.

Grüße

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.