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.