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
Was ist denn an dem User Manual mit den Registern unverständlich?
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 | }
|
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
Wolfgang schrieb: > und DAS geht nur mit vollständiger CMSIS-Implementierung. Wie ist das zu verstehen? Inwieweit ist das unvollständig?
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...
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"
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
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.
So schlicht sieht das bei mir aus. Ist für CM3, nicht CM0, was sich aber m.W. strukturell nicht wesentlich unterscheidet.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.