[ARM] [ LPC1x] Interrupt Prioritäten einstellen in "C"

Gast #3041210
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
}
Gast #3041248
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
Gast #3041412
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
Gast #3041505
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.
Gast #3042688
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.

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