Forum: Mikrocontroller und Digitale Elektronik [ARM] [ LPC1x] Interrupt Prioritäten einstellen in "C"


von Wolfgang (Gast)


Lesenswert?

Hallo,
ich würde gerne an meinem LPC1111 die Prioritäten meiner
Interrupts in "C" einstellen, aber ohne CMSIS-Unterstützung.

Hat das mal jemand probiert?

Würde mich über ein getestetes Code-Beispiel freuen.

Danke

von Lutz (Gast)


Lesenswert?

Was ist denn an dem User Manual mit den Registern unverständlich?

von temp (Gast)


Lesenswert?

Ich verstehe nicht was am CMSIS so schlecht sein soll. Anders als bei 
den Libs für die Peripherie ist das doch recht schlank. Und wenn man die 
Funktion z.B. NVIC_SetPriority aus der core_cm0.h durch was eigenes 
ersetzt wird es auch nicht kleiner:
1
__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
2
{
3
  if(IRQn < 0) {
4
    SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
5
        (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); }
6
  else {
7
    NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
8
        (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); }
9
}

von Wolfgang (Gast)


Lesenswert?

Weil dort nur der Zugriff mittels
"void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)"
beschrieben ist, und DAS geht nur mit vollständiger 
CMSIS-Implementierung.
Wenn Du im UM mehr gefunden hast, dann gib mir doch bitte einen Tip mit 
Kapitelangabe.
Danke

von (prx) A. K. (prx)


Lesenswert?

Wolfgang schrieb:
> und DAS geht nur mit vollständiger CMSIS-Implementierung.

Wie ist das zu verstehen? Inwieweit ist das unvollständig?

von Wolfgang (Gast)


Lesenswert?

Hallo "temp"
Du hast schon Recht, aber ich versuche das selbst zu verstehen, ok?

A.K.
die Zeilen oben von "temp" werden so nicht compiliert. Ohne die ganzen 
CMSIS-Dateien ist zuviel unbekannt...

von (prx) A. K. (prx)


Lesenswert?

Es ging doch nicht darum, den CMSIS Kram abzuschreiben. Sondern weshalb 
du ihn nicht direkt verwendest, also mitsamt der Includes.

Zum CMSIS habe ich in dieser Frage allerdings meine eigene Ansicht:
Beitrag "CMSIS und die Interrupt-Prioritäten"

von Wolfgang (Gast)


Lesenswert?

Ganz einfach, weil ich der Meinung bin, daß CMSIS mehr Probleme macht, 
als es löst.
Das Thema "Prioritäten" ist das Einzige, bei dem ich jetzt nicht auf 
Anhieb klarkomme.
Wenn Du mich bitte mir Deinen ca. 14 Jahren Erfahrung (10 Jahre 2009) 
unterstützen könntes hierzu eine Lösung zu finden, wäre ich dankbar.
LG
Wolfgang

von Lothar (Gast)


Lesenswert?

volatile unsigned int *pNVIC_IntPri = (unsigned int *) &IP0; // 
0xE000E400
IntNumber -= NVIC_WAKE_UP0; // NVIC_WAKE_UP0=16 ist der erste IRQ
pNVIC_IntPri += IntNumber;
*pNVIC_IntPri = Priority;

Noch zur Info: vor NVIC_WAKE_UP0 gibt es schon noch was z.B. SVC_IRQ 
aber dafür gibt es extra Register.

von (prx) A. K. (prx)


Angehängte Dateien:

Lesenswert?

So schlicht sieht das bei mir aus. Ist für CM3, nicht CM0, was sich aber 
m.W. strukturell nicht wesentlich unterscheidet.

von temp (Gast)


Lesenswert?

zwischen dem M0 und M3 gibt es den Unterschied,dass beim M0 die NVIC->IP 
Register nur wortweise beschreiben werden können. Das macht es etwas 
umständlicher. In etwa so (ungetestet):
1
// aus core_cm0.h
2
typedef struct
3
{
4
  __IO uint32_t ISER[1];                
5
       uint32_t RESERVED0[31];
6
  __IO uint32_t ICER[1];                
7
       uint32_t RSERVED1[31];
8
  __IO uint32_t ISPR[1];                 
9
       uint32_t RESERVED2[31];
10
  __IO uint32_t ICPR[1];                 
11
       uint32_t RESERVED3[31];
12
       uint32_t RESERVED4[64];
13
  __IO uint32_t IP[8];                  
14
}  NVIC_type;
15
16
#define NVIC ((NVIC_type *) 0xe000e100)  
17
18
void NvicSetPri(IRQn_Type nIrq, uint8_t pri)
19
{
20
  if (nIrq>=0 && nIrq<32)
21
    {                                             
22
    NVIC->IP[nIrq>>2]= ( NVIC->IP[nIrq>>2] & ~(0xFF << ((nIrq & 0x03)*8)))
23
                      | (pri<<((nIrq & 0x03)*8));
24
    }    
25
}

IRQn_Type ist ein enum aus lpc11xx.h, kann man aber auch durch einen int 
ersetzen.
Wenn man darüber nachdenkt ist es wie oben schon angemerkt wirklich 
besser die Priorität als Byte zu lassen wie sie ist und nicht dran zu 
drehen. Beim M0 sind dann halt nur die obersten beiden Bits relevant.

von Wolfgang (Gast)


Lesenswert?

Danke an Alle, werde es mal testen ;-)

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.