[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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.