STM32 NVIC Mapping

OP #5787621
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
Angehängte Dateien:
OP #5787639
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?
#5787775
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
OP #5787779
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
#5787784
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;
OP #5787785
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?
#5787790
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.
OP #5787795
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.
#5787805
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")
OP #5787852
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren