| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754 |
- /*
- *********************************************************************************************************
- * uC/CPU
- * CPU CONFIGURATION & PORT LAYER
- *
- * (c) Copyright 2004-2011; Micrium, Inc.; Weston, FL
- *
- * All rights reserved. Protected by international copyright laws.
- *
- * uC/CPU is provided in source form to registered licensees ONLY. It is
- * illegal to distribute this source code to any third party unless you receive
- * written permission by an authorized Micrium representative. Knowledge of
- * the source code may NOT be used to develop a similar product.
- *
- * Please help us continue to provide the Embedded community with the finest
- * software available. Your honesty is greatly appreciated.
- *
- * You can contact us at www.micrium.com.
- *********************************************************************************************************
- */
- /*
- *********************************************************************************************************
- *
- * CPU PORT FILE
- *
- * ARM-Cortex-M3
- * IAR C Compiler
- *
- * Filename : cpu_c.c
- * Version : V1.28.01.00
- * Programmer(s) : JJL
- * BAN
- *********************************************************************************************************
- */
- /*
- *********************************************************************************************************
- * INCLUDE FILES
- *********************************************************************************************************
- */
- #include <cpu.h>
- #include <cpu_core.h>
- #include <lib_def.h>
- /*$PAGE*/
- /*
- *********************************************************************************************************
- * LOCAL DEFINES
- *********************************************************************************************************
- */
- #define CPU_INT_SRC_POS_MAX ((((CPU_REG_NVIC_NVIC + 1) & 0x1F) * 32) + 16)
- #define CPU_BIT_BAND_SRAM_REG_LO 0x20000000
- #define CPU_BIT_BAND_SRAM_REG_HI 0x200FFFFF
- #define CPU_BIT_BAND_SRAM_BASE 0x22000000
- #define CPU_BIT_BAND_PERIPH_REG_LO 0x40000000
- #define CPU_BIT_BAND_PERIPH_REG_HI 0x400FFFFF
- #define CPU_BIT_BAND_PERIPH_BASE 0x42000000
- /*
- *********************************************************************************************************
- * LOCAL CONSTANTS
- *********************************************************************************************************
- */
- /*
- *********************************************************************************************************
- * LOCAL DATA TYPES
- *********************************************************************************************************
- */
- /*
- *********************************************************************************************************
- * LOCAL TABLES
- *********************************************************************************************************
- */
- /*
- *********************************************************************************************************
- * LOCAL GLOBAL VARIABLES
- *********************************************************************************************************
- */
- /*
- *********************************************************************************************************
- * LOCAL FUNCTION PROTOTYPES
- *********************************************************************************************************
- */
- /*
- *********************************************************************************************************
- * LOCAL CONFIGURATION ERRORS
- *********************************************************************************************************
- */
- /*$PAGE*/
- /*
- *********************************************************************************************************
- * CPU_BitBandClr()
- *
- * Description : Clear bit in bit-band region.
- *
- * Argument(s) : addr Byte address in memory space.
- *
- * bit_nbr Bit number in byte.
- *
- * Return(s) : none.
- *
- * Caller(s) : Application.
- *
- * Note(s) : none.
- *********************************************************************************************************
- */
- void CPU_BitBandClr (CPU_ADDR addr,
- CPU_INT08U bit_nbr)
- {
- CPU_ADDR bit_word_off;
- CPU_ADDR bit_word_addr;
- if ((addr >= CPU_BIT_BAND_SRAM_REG_LO) &&
- (addr <= CPU_BIT_BAND_SRAM_REG_HI)) {
- bit_word_off = ((addr - CPU_BIT_BAND_SRAM_REG_LO ) * 32) + (bit_nbr * 4);
- bit_word_addr = CPU_BIT_BAND_SRAM_BASE + bit_word_off;
- *(volatile CPU_INT32U *)(bit_word_addr) = 0;
- } else if ((addr >= CPU_BIT_BAND_PERIPH_REG_LO) &&
- (addr <= CPU_BIT_BAND_PERIPH_REG_HI)) {
- bit_word_off = ((addr - CPU_BIT_BAND_PERIPH_REG_LO) * 32) + (bit_nbr * 4);
- bit_word_addr = CPU_BIT_BAND_PERIPH_BASE + bit_word_off;
- *(volatile CPU_INT32U *)(bit_word_addr) = 0;
- }
- }
- /*$PAGE*/
- /*
- *********************************************************************************************************
- * CPU_BitBandSet()
- *
- * Description : Set bit in bit-band region.
- *
- * Argument(s) : addr Byte address in memory space.
- *
- * bit_nbr Bit number in byte.
- *
- * Return(s) : none.
- *
- * Caller(s) : Application.
- *
- * Note(s) : none.
- *********************************************************************************************************
- */
- void CPU_BitBandSet (CPU_ADDR addr,
- CPU_INT08U bit_nbr)
- {
- CPU_ADDR bit_word_off;
- CPU_ADDR bit_word_addr;
- if ((addr >= CPU_BIT_BAND_SRAM_REG_LO) &&
- (addr <= CPU_BIT_BAND_SRAM_REG_HI)) {
- bit_word_off = ((addr - CPU_BIT_BAND_SRAM_REG_LO ) * 32) + (bit_nbr * 4);
- bit_word_addr = CPU_BIT_BAND_SRAM_BASE + bit_word_off;
- *(volatile CPU_INT32U *)(bit_word_addr) = 1;
- } else if ((addr >= CPU_BIT_BAND_PERIPH_REG_LO) &&
- (addr <= CPU_BIT_BAND_PERIPH_REG_HI)) {
- bit_word_off = ((addr - CPU_BIT_BAND_PERIPH_REG_LO) * 32) + (bit_nbr * 4);
- bit_word_addr = CPU_BIT_BAND_PERIPH_BASE + bit_word_off;
- *(volatile CPU_INT32U *)(bit_word_addr) = 1;
- }
- }
- /*$PAGE*/
- /*
- *********************************************************************************************************
- * CPU_IntSrcDis()
- *
- * Description : Disable an interrupt source.
- *
- * Argument(s) : pos Position of interrupt vector in interrupt table :
- *
- * 0 Invalid (see Note #1a).
- * 1 Invalid (see Note #1b).
- * 2 Non-maskable interrupt.
- * 3 Hard Fault.
- * 4 Memory Management.
- * 5 Bus Fault.
- * 6 Usage Fault.
- * 7-10 Reserved.
- * 11 SVCall
- * 12 Debug monitor.
- * 13 Reserved
- * 14 PendSV.
- * 15 SysTick.
- * 16+ External Interrupt.
- *
- * Return(s) : none.
- *
- * Caller(s) : Application.
- *
- * Note(s) : (1) Several table positions do not contain interrupt sources :
- *
- * (a) Position 0 contains the stack pointer.
- * (b) Positions 7-10, 13 are reserved.
- *
- * (2) Several interrupts cannot be disabled/enabled :
- *
- * (a) Reset.
- * (b) NMI.
- * (c) Hard fault.
- * (d) SVCall.
- * (e) Debug monitor.
- * (f) PendSV.
- *
- * (3) The maximum Cortex-M3 table position is 256. A particular Cortex-M3 may have fewer
- * than 240 external exceptions and, consequently, fewer than 256 table positions.
- * This function assumes that the specified table position is valid if the interrupt
- * controller type register's INTLINESNUM field is large enough so that the position
- * COULD be valid.
- *********************************************************************************************************
- */
- /*$PAGE*/
- void CPU_IntSrcDis (CPU_INT08U pos)
- {
- CPU_INT08U group;
- CPU_INT08U pos_max;
- CPU_INT08U nbr;
- CPU_SR_ALLOC();
- switch (pos) {
- case CPU_INT_STK_PTR: /* ---------------- INVALID OR RESERVED --------------- */
- case CPU_INT_RSVD_07:
- case CPU_INT_RSVD_08:
- case CPU_INT_RSVD_09:
- case CPU_INT_RSVD_10:
- case CPU_INT_RSVD_13:
- break;
- /* ----------------- SYSTEM EXCEPTIONS ---------------- */
- case CPU_INT_RESET: /* Reset (see Note #2). */
- case CPU_INT_NMI: /* Non-maskable interrupt (see Note #2). */
- case CPU_INT_HFAULT: /* Hard fault (see Note #2). */
- case CPU_INT_SVCALL: /* SVCall (see Note #2). */
- case CPU_INT_DBGMON: /* Debug monitor (see Note #2). */
- case CPU_INT_PENDSV: /* PendSV (see Note #2). */
- break;
- case CPU_INT_MEM: /* Memory management. */
- CPU_CRITICAL_ENTER();
- CPU_REG_NVIC_SHCSR &= ~CPU_REG_NVIC_SHCSR_MEMFAULTENA;
- CPU_CRITICAL_EXIT();
- break;
- case CPU_INT_BUSFAULT: /* Bus fault. */
- CPU_CRITICAL_ENTER();
- CPU_REG_NVIC_SHCSR &= ~CPU_REG_NVIC_SHCSR_BUSFAULTENA;
- CPU_CRITICAL_EXIT();
- break;
- case CPU_INT_USAGEFAULT: /* Usage fault. */
- CPU_CRITICAL_ENTER();
- CPU_REG_NVIC_SHCSR &= ~CPU_REG_NVIC_SHCSR_USGFAULTENA;
- CPU_CRITICAL_EXIT();
- break;
- case CPU_INT_SYSTICK: /* SysTick. */
- CPU_CRITICAL_ENTER();
- CPU_REG_NVIC_ST_CTRL &= ~CPU_REG_NVIC_ST_CTRL_ENABLE;
- CPU_CRITICAL_EXIT();
- break;
- /* ---------------- EXTERNAL INTERRUPT ---------------- */
- default:
- pos_max = CPU_INT_SRC_POS_MAX;
- if (pos < pos_max) { /* See Note #3. */
- group = (pos - 16) / 32;
- nbr = (pos - 16) % 32;
- CPU_CRITICAL_ENTER();
- CPU_REG_NVIC_CLREN(group) = DEF_BIT(nbr);
- CPU_CRITICAL_EXIT();
- }
- break;
- }
- }
- /*$PAGE*/
- /*
- *********************************************************************************************************
- * CPU_IntSrcEn()
- *
- * Description : Enable an interrupt source.
- *
- * Argument(s) : pos Position of interrupt vector in interrupt table (see 'CPU_IntSrcDis()').
- *
- * Return(s) : none.
- *
- * Caller(s) : Application.
- *
- * Note(s) : (1) See 'CPU_IntSrcDis() Note #1'.
- *
- * (2) See 'CPU_IntSrcDis() Note #2'.
- *
- * (3) See 'CPU_IntSrcDis() Note #3'.
- *********************************************************************************************************
- */
- void CPU_IntSrcEn (CPU_INT08U pos)
- {
- CPU_INT08U group;
- CPU_INT08U nbr;
- CPU_INT08U pos_max;
- CPU_SR_ALLOC();
- switch (pos) {
- case CPU_INT_STK_PTR: /* ---------------- INVALID OR RESERVED --------------- */
- case CPU_INT_RSVD_07:
- case CPU_INT_RSVD_08:
- case CPU_INT_RSVD_09:
- case CPU_INT_RSVD_10:
- case CPU_INT_RSVD_13:
- break;
- /* ----------------- SYSTEM EXCEPTIONS ---------------- */
- case CPU_INT_RESET: /* Reset (see Note #2). */
- case CPU_INT_NMI: /* Non-maskable interrupt (see Note #2). */
- case CPU_INT_HFAULT: /* Hard fault (see Note #2). */
- case CPU_INT_SVCALL: /* SVCall (see Note #2). */
- case CPU_INT_DBGMON: /* Debug monitor (see Note #2). */
- case CPU_INT_PENDSV: /* PendSV (see Note #2). */
- break;
- case CPU_INT_MEM: /* Memory management. */
- CPU_CRITICAL_ENTER();
- CPU_REG_NVIC_SHCSR |= CPU_REG_NVIC_SHCSR_MEMFAULTENA;
- CPU_CRITICAL_EXIT();
- break;
- case CPU_INT_BUSFAULT: /* Bus fault. */
- CPU_CRITICAL_ENTER();
- CPU_REG_NVIC_SHCSR |= CPU_REG_NVIC_SHCSR_BUSFAULTENA;
- CPU_CRITICAL_EXIT();
- break;
- case CPU_INT_USAGEFAULT: /* Usage fault. */
- CPU_CRITICAL_ENTER();
- CPU_REG_NVIC_SHCSR |= CPU_REG_NVIC_SHCSR_USGFAULTENA;
- CPU_CRITICAL_EXIT();
- break;
- case CPU_INT_SYSTICK: /* SysTick. */
- CPU_CRITICAL_ENTER();
- CPU_REG_NVIC_ST_CTRL |= CPU_REG_NVIC_ST_CTRL_ENABLE;
- CPU_CRITICAL_EXIT();
- break;
- /* ---------------- EXTERNAL INTERRUPT ---------------- */
- default:
- pos_max = CPU_INT_SRC_POS_MAX;
- if (pos < pos_max) { /* See Note #3. */
- group = (pos - 16) / 32;
- nbr = (pos - 16) % 32;
- CPU_CRITICAL_ENTER();
- CPU_REG_NVIC_SETEN(group) = DEF_BIT(nbr);
- CPU_CRITICAL_EXIT();
- }
- break;
- }
- }
- /*$PAGE*/
- /*
- *********************************************************************************************************
- * CPU_IntSrcPendClr()
- *
- * Description : Clear a pending interrupt.
- *
- * Argument(s) : pos Position of interrupt vector in interrupt table (see 'CPU_IntSrcDis()').
- *
- * Return(s) : none.
- *
- * Caller(s) : Application.
- *
- * Note(s) : (1) See 'CPU_IntSrcDis() Note #1'.
- *
- * (2) The pending status of several interrupts cannot be clear/set :
- *
- * (a) Reset.
- * (b) NMI.
- * (c) Hard fault.
- * (d) Memory Managment.
- * (e) Bus Fault.
- * (f) Usage Fault.
- * (g) SVCall.
- * (h) Debug monitor.
- * (i) PendSV.
- * (j) Systick
- *
- * (3) See 'CPU_IntSrcDis() Note #3'.
- *********************************************************************************************************
- */
- void CPU_IntSrcPendClr (CPU_INT08U pos)
- {
- CPU_INT08U group;
- CPU_INT08U nbr;
- CPU_INT08U pos_max;
- CPU_SR_ALLOC();
- switch (pos) {
- case CPU_INT_STK_PTR: /* ---------------- INVALID OR RESERVED --------------- */
- case CPU_INT_RSVD_07:
- case CPU_INT_RSVD_08:
- case CPU_INT_RSVD_09:
- case CPU_INT_RSVD_10:
- case CPU_INT_RSVD_13:
- break;
- /* ----------------- SYSTEM EXCEPTIONS ---------------- */
- case CPU_INT_RESET: /* Reset (see Note #2). */
- case CPU_INT_NMI: /* Non-maskable interrupt (see Note #2). */
- case CPU_INT_HFAULT: /* Hard fault (see Note #2). */
- case CPU_INT_MEM: /* Memory management (see Note #2). */
- case CPU_INT_SVCALL: /* SVCall (see Note #2). */
- case CPU_INT_DBGMON: /* Debug monitor (see Note #2). */
- case CPU_INT_PENDSV: /* PendSV (see Note #2). */
- case CPU_INT_BUSFAULT: /* Bus fault. */
- case CPU_INT_USAGEFAULT: /* Usage fault. */
- case CPU_INT_SYSTICK: /* SysTick. */
- break;
- /* ---------------- EXTERNAL INTERRUPT ---------------- */
- default:
- pos_max = CPU_INT_SRC_POS_MAX;
- if (pos < pos_max) { /* See Note #3. */
- group = (pos - 16) / 32;
- nbr = (pos - 16) % 32;
- CPU_CRITICAL_ENTER();
- CPU_REG_NVIC_CLRPEND(group) = DEF_BIT(nbr);
- CPU_CRITICAL_EXIT();
- }
- break;
- }
- }
- /*$PAGE*/
- /*
- *********************************************************************************************************
- * CPU_IntSrcPrioSet()
- *
- * Description : Set priority of an interrupt source.
- *
- * Argument(s) : pos Position of interrupt vector in interrupt table (see 'CPU_IntSrcDis()').
- *
- * prio Priority. Use a lower priority number for a higher priority.
- *
- * Return(s) : none.
- *
- * Caller(s) : Application.
- *
- * Note(s) : (1) See 'CPU_IntSrcDis() Note #1'.
- *
- * (2) Several interrupts priorities CANNOT be set :
- *
- * (a) Reset (always -3).
- * (b) NMI (always -2).
- * (c) Hard fault (always -1).
- *
- * (3) See 'CPU_IntSrcDis() Note #3'.
- *********************************************************************************************************
- */
- void CPU_IntSrcPrioSet (CPU_INT08U pos,
- CPU_INT08U prio)
- {
- CPU_INT08U group;
- CPU_INT08U nbr;
- CPU_INT08U pos_max;
- CPU_INT32U prio_32;
- CPU_INT32U temp;
- CPU_SR_ALLOC();
- prio_32 = CPU_RevBits((CPU_INT08U)prio);
- prio = (CPU_INT08U)(prio_32 >> (3 * DEF_OCTET_NBR_BITS));
- switch (pos) {
- case CPU_INT_STK_PTR: /* ---------------- INVALID OR RESERVED --------------- */
- case CPU_INT_RSVD_07:
- case CPU_INT_RSVD_08:
- case CPU_INT_RSVD_09:
- case CPU_INT_RSVD_10:
- case CPU_INT_RSVD_13:
- break;
- /* ----------------- SYSTEM EXCEPTIONS ---------------- */
- case CPU_INT_RESET: /* Reset (see Note #2). */
- case CPU_INT_NMI: /* Non-maskable interrupt (see Note #2). */
- case CPU_INT_HFAULT: /* Hard fault (see Note #2). */
- break;
- case CPU_INT_MEM: /* Memory management. */
- CPU_CRITICAL_ENTER();
- temp = CPU_REG_NVIC_SHPRI1;
- temp &= ~(DEF_OCTET_MASK << (0 * DEF_OCTET_NBR_BITS));
- temp |= (prio << (0 * DEF_OCTET_NBR_BITS));
- CPU_REG_NVIC_SHPRI1 = temp;
- CPU_CRITICAL_EXIT();
- break;
- case CPU_INT_BUSFAULT: /* Bus fault. */
- CPU_CRITICAL_ENTER();
- temp = CPU_REG_NVIC_SHPRI1;
- temp &= ~(DEF_OCTET_MASK << (1 * DEF_OCTET_NBR_BITS));
- temp |= (prio << (1 * DEF_OCTET_NBR_BITS));
- CPU_REG_NVIC_SHPRI1 = temp;
- CPU_CRITICAL_EXIT();
- break;
- case CPU_INT_USAGEFAULT: /* Usage fault. */
- CPU_CRITICAL_ENTER();
- temp = CPU_REG_NVIC_SHPRI1;
- temp &= ~(DEF_OCTET_MASK << (2 * DEF_OCTET_NBR_BITS));
- temp |= (prio << (2 * DEF_OCTET_NBR_BITS));
- CPU_REG_NVIC_SHPRI1 = temp;
- CPU_CRITICAL_EXIT();
- break;
- case CPU_INT_SVCALL: /* SVCall. */
- CPU_CRITICAL_ENTER();
- temp = CPU_REG_NVIC_SHPRI2;
- temp &= ~((CPU_INT32U)DEF_OCTET_MASK << (3 * DEF_OCTET_NBR_BITS));
- temp |= (prio << (3 * DEF_OCTET_NBR_BITS));
- CPU_REG_NVIC_SHPRI2 = temp;
- CPU_CRITICAL_EXIT();
- break;
- case CPU_INT_DBGMON: /* Debug monitor. */
- CPU_CRITICAL_ENTER();
- temp = CPU_REG_NVIC_SHPRI3;
- temp &= ~(DEF_OCTET_MASK << (0 * DEF_OCTET_NBR_BITS));
- temp |= (prio << (0 * DEF_OCTET_NBR_BITS));
- CPU_REG_NVIC_SHPRI3 = temp;
- CPU_CRITICAL_EXIT();
- break;
- case CPU_INT_PENDSV: /* PendSV. */
- CPU_CRITICAL_ENTER();
- temp = CPU_REG_NVIC_SHPRI3;
- temp &= ~(DEF_OCTET_MASK << (2 * DEF_OCTET_NBR_BITS));
- temp |= (prio << (2 * DEF_OCTET_NBR_BITS));
- CPU_REG_NVIC_SHPRI3 = temp;
- CPU_CRITICAL_EXIT();
- break;
- case CPU_INT_SYSTICK: /* SysTick. */
- CPU_CRITICAL_ENTER();
- temp = CPU_REG_NVIC_SHPRI3;
- temp &= ~((CPU_INT32U)DEF_OCTET_MASK << (3 * DEF_OCTET_NBR_BITS));
- temp |= (prio << (3 * DEF_OCTET_NBR_BITS));
- CPU_REG_NVIC_SHPRI3 = temp;
- CPU_CRITICAL_EXIT();
- break;
- /* ---------------- EXTERNAL INTERRUPT ---------------- */
- default:
- pos_max = CPU_INT_SRC_POS_MAX;
- if (pos < pos_max) { /* See Note #3. */
- group = (pos - 16) / 4;
- nbr = (pos - 16) % 4;
- CPU_CRITICAL_ENTER();
- temp = CPU_REG_NVIC_PRIO(group);
- temp &= ~(DEF_OCTET_MASK << (nbr * DEF_OCTET_NBR_BITS));
- temp |= (prio << (nbr * DEF_OCTET_NBR_BITS));
- CPU_REG_NVIC_PRIO(group) = temp;
- CPU_CRITICAL_EXIT();
- }
- break;
- }
- }
- /*$PAGE*/
- /*
- *********************************************************************************************************
- * CPU_IntSrcPrioGet()
- *
- * Description : Get priority of an interrupt source.
- *
- * Argument(s) : pos Position of interrupt vector in interrupt table (see 'CPU_IntSrcDis()').
- *
- * Return(s) : Priority of interrupt source. If the interrupt source specified is invalid, then
- * DEF_INT_16S_MIN_VAL is returned.
- *
- * Caller(s) : Application.
- *
- * Note(s) : (1) See 'CPU_IntSrcDis() Note #1'.
- *
- * (2) See 'CPU_IntSrcPrioSet() Note #2'.
- *
- * (3) See 'CPU_IntSrcDis() Note #3'.
- *********************************************************************************************************
- */
- CPU_INT16S CPU_IntSrcPrioGet (CPU_INT08U pos)
- {
- CPU_INT08U group;
- CPU_INT08U nbr;
- CPU_INT08U pos_max;
- CPU_INT16S prio;
- CPU_INT32U prio_32;
- CPU_INT32U temp;
- CPU_SR_ALLOC();
- switch (pos) {
- case CPU_INT_STK_PTR: /* ---------------- INVALID OR RESERVED --------------- */
- case CPU_INT_RSVD_07:
- case CPU_INT_RSVD_08:
- case CPU_INT_RSVD_09:
- case CPU_INT_RSVD_10:
- case CPU_INT_RSVD_13:
- prio = DEF_INT_16S_MIN_VAL;
- break;
- /* ----------------- SYSTEM EXCEPTIONS ---------------- */
- case CPU_INT_RESET: /* Reset (see Note #2). */
- prio = -3;
- break;
- case CPU_INT_NMI: /* Non-maskable interrupt (see Note #2). */
- prio = -2;
- break;
- case CPU_INT_HFAULT: /* Hard fault (see Note #2). */
- prio = -1;
- break;
- case CPU_INT_MEM: /* Memory management. */
- CPU_CRITICAL_ENTER();
- temp = CPU_REG_NVIC_SHPRI1;
- prio = (temp >> (0 * DEF_OCTET_NBR_BITS)) & DEF_OCTET_MASK;
- CPU_CRITICAL_EXIT();
- break;
- case CPU_INT_BUSFAULT: /* Bus fault. */
- CPU_CRITICAL_ENTER();
- temp = CPU_REG_NVIC_SHPRI1;
- prio = (temp >> (1 * DEF_OCTET_NBR_BITS)) & DEF_OCTET_MASK;
- CPU_CRITICAL_EXIT();
- break;
- case CPU_INT_USAGEFAULT: /* Usage fault. */
- CPU_CRITICAL_ENTER();
- temp = CPU_REG_NVIC_SHPRI1;
- prio = (temp >> (2 * DEF_OCTET_NBR_BITS)) & DEF_OCTET_MASK;
- break;
- case CPU_INT_SVCALL: /* SVCall. */
- CPU_CRITICAL_ENTER();
- temp = CPU_REG_NVIC_SHPRI2;
- prio = (temp >> (3 * DEF_OCTET_NBR_BITS)) & DEF_OCTET_MASK;
- CPU_CRITICAL_EXIT();
- break;
- case CPU_INT_DBGMON: /* Debug monitor. */
- CPU_CRITICAL_ENTER();
- temp = CPU_REG_NVIC_SHPRI3;
- prio = (temp >> (0 * DEF_OCTET_NBR_BITS)) & DEF_OCTET_MASK;
- CPU_CRITICAL_EXIT();
- break;
- case CPU_INT_PENDSV: /* PendSV. */
- CPU_CRITICAL_ENTER();
- temp = CPU_REG_NVIC_SHPRI3;
- prio = (temp >> (2 * DEF_OCTET_NBR_BITS)) & DEF_OCTET_MASK;
- CPU_CRITICAL_EXIT();
- break;
- case CPU_INT_SYSTICK: /* SysTick. */
- CPU_CRITICAL_ENTER();
- temp = CPU_REG_NVIC_SHPRI3;
- prio = (temp >> (3 * DEF_OCTET_NBR_BITS)) & DEF_OCTET_MASK;
- CPU_CRITICAL_EXIT();
- break;
- /* ---------------- EXTERNAL INTERRUPT ---------------- */
- default:
- pos_max = CPU_INT_SRC_POS_MAX;
- if (pos < pos_max) { /* See Note #3. */
- group = (pos - 16) / 4;
- nbr = (pos - 16) % 4;
- CPU_CRITICAL_ENTER();
- temp = CPU_REG_NVIC_PRIO(group);
- CPU_CRITICAL_EXIT();
- prio = (temp >> (nbr * DEF_OCTET_NBR_BITS)) & DEF_OCTET_MASK;
- } else {
- prio = DEF_INT_16S_MIN_VAL;
- }
- break;
- }
- if (prio >= 0) {
- prio_32 = CPU_RevBits((CPU_INT32U)prio);
- prio = (CPU_INT16S)(prio_32 >> (3 * DEF_OCTET_NBR_BITS));
- }
- return (prio);
- }
|