mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Fri Jul 17 09:15:10 2015 +0100
Revision:
592:a274ee790e56
Parent:
579:53297373a894
Synchronized with git revision e7144f83a8d75df80c4877936b6ffe552b0be9e6

Full URL: https://github.com/mbedmicro/mbed/commit/e7144f83a8d75df80c4877936b6ffe552b0be9e6/

More API implementation for SAMR21

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 579:53297373a894 1 #ifndef UTILS_INTERRUPT_INTERRUPT_H
mbed_official 579:53297373a894 2 #define UTILS_INTERRUPT_INTERRUPT_H
mbed_official 579:53297373a894 3
mbed_official 579:53297373a894 4 #include <compiler.h>
mbed_official 579:53297373a894 5 #include <parts.h>
mbed_official 579:53297373a894 6
mbed_official 579:53297373a894 7 #ifdef __cplusplus
mbed_official 579:53297373a894 8 extern "C" {
mbed_official 579:53297373a894 9 #endif
mbed_official 579:53297373a894 10
mbed_official 579:53297373a894 11 /**
mbed_official 579:53297373a894 12 * \weakgroup interrupt_group
mbed_official 579:53297373a894 13 *
mbed_official 579:53297373a894 14 * @{
mbed_official 579:53297373a894 15 */
mbed_official 579:53297373a894 16
mbed_official 579:53297373a894 17 /**
mbed_official 579:53297373a894 18 * \name Interrupt Service Routine definition
mbed_official 579:53297373a894 19 *
mbed_official 579:53297373a894 20 * @{
mbed_official 579:53297373a894 21 */
mbed_official 579:53297373a894 22
mbed_official 579:53297373a894 23 /**
mbed_official 579:53297373a894 24 * \brief Define service routine
mbed_official 579:53297373a894 25 *
mbed_official 579:53297373a894 26 * \note For NVIC devices the interrupt service routines are predefined to
mbed_official 579:53297373a894 27 * add to vector table in binary generation, so there is no service
mbed_official 579:53297373a894 28 * register at run time. The routine collections are in exceptions.h.
mbed_official 579:53297373a894 29 *
mbed_official 579:53297373a894 30 * Usage:
mbed_official 579:53297373a894 31 * \code
mbed_official 579:53297373a894 32 ISR(foo_irq_handler)
mbed_official 579:53297373a894 33 {
mbed_official 579:53297373a894 34 // Function definition
mbed_official 579:53297373a894 35 ...
mbed_official 579:53297373a894 36 }
mbed_official 579:53297373a894 37 \endcode
mbed_official 579:53297373a894 38 *
mbed_official 579:53297373a894 39 * \param func Name for the function.
mbed_official 579:53297373a894 40 */
mbed_official 579:53297373a894 41 # define ISR(func) \
mbed_official 579:53297373a894 42 void func (void)
mbed_official 579:53297373a894 43
mbed_official 579:53297373a894 44 /**
mbed_official 579:53297373a894 45 * \brief Initialize interrupt vectors
mbed_official 579:53297373a894 46 *
mbed_official 579:53297373a894 47 * For NVIC the interrupt vectors are put in vector table. So nothing
mbed_official 579:53297373a894 48 * to do to initialize them, except defined the vector function with
mbed_official 579:53297373a894 49 * right name.
mbed_official 579:53297373a894 50 *
mbed_official 579:53297373a894 51 * This must be called prior to \ref irq_register_handler.
mbed_official 579:53297373a894 52 */
mbed_official 579:53297373a894 53 # define irq_initialize_vectors() \
mbed_official 579:53297373a894 54 do { \
mbed_official 579:53297373a894 55 } while(0)
mbed_official 579:53297373a894 56
mbed_official 579:53297373a894 57 /**
mbed_official 579:53297373a894 58 * \brief Register handler for interrupt
mbed_official 579:53297373a894 59 *
mbed_official 579:53297373a894 60 * For NVIC the interrupt vectors are put in vector table. So nothing
mbed_official 579:53297373a894 61 * to do to register them, except defined the vector function with
mbed_official 579:53297373a894 62 * right name.
mbed_official 579:53297373a894 63 *
mbed_official 579:53297373a894 64 * Usage:
mbed_official 579:53297373a894 65 * \code
mbed_official 579:53297373a894 66 irq_initialize_vectors();
mbed_official 579:53297373a894 67 irq_register_handler(foo_irq_handler);
mbed_official 579:53297373a894 68 \endcode
mbed_official 579:53297373a894 69 *
mbed_official 579:53297373a894 70 * \note The function \a func must be defined with the \ref ISR macro.
mbed_official 579:53297373a894 71 * \note The functions prototypes can be found in the device exception header
mbed_official 579:53297373a894 72 * files (exceptions.h).
mbed_official 579:53297373a894 73 */
mbed_official 579:53297373a894 74 # define irq_register_handler(int_num, int_prio) \
mbed_official 579:53297373a894 75 NVIC_ClearPendingIRQ( (IRQn_Type)int_num); \
mbed_official 579:53297373a894 76 NVIC_SetPriority( (IRQn_Type)int_num, int_prio); \
mbed_official 579:53297373a894 77 NVIC_EnableIRQ( (IRQn_Type)int_num); \
mbed_official 579:53297373a894 78
mbed_official 579:53297373a894 79 //@}
mbed_official 579:53297373a894 80
mbed_official 579:53297373a894 81 # define cpu_irq_enable() \
mbed_official 579:53297373a894 82 do { \
mbed_official 579:53297373a894 83 g_interrupt_enabled = true; \
mbed_official 579:53297373a894 84 __DMB(); \
mbed_official 579:53297373a894 85 __enable_irq(); \
mbed_official 579:53297373a894 86 } while (0)
mbed_official 579:53297373a894 87 # define cpu_irq_disable() \
mbed_official 579:53297373a894 88 do { \
mbed_official 579:53297373a894 89 __disable_irq(); \
mbed_official 579:53297373a894 90 __DMB(); \
mbed_official 579:53297373a894 91 g_interrupt_enabled = false; \
mbed_official 579:53297373a894 92 } while (0)
mbed_official 579:53297373a894 93
mbed_official 579:53297373a894 94 typedef uint32_t irqflags_t;
mbed_official 579:53297373a894 95
mbed_official 579:53297373a894 96 #if !defined(__DOXYGEN__)
mbed_official 579:53297373a894 97 extern volatile bool g_interrupt_enabled;
mbed_official 579:53297373a894 98 #endif
mbed_official 579:53297373a894 99
mbed_official 579:53297373a894 100 #define cpu_irq_is_enabled() (__get_PRIMASK() == 0)
mbed_official 579:53297373a894 101
mbed_official 579:53297373a894 102 static volatile uint32_t cpu_irq_critical_section_counter;
mbed_official 579:53297373a894 103 static volatile bool cpu_irq_prev_interrupt_state;
mbed_official 579:53297373a894 104
mbed_official 579:53297373a894 105 static inline irqflags_t cpu_irq_save(void)
mbed_official 579:53297373a894 106 {
mbed_official 579:53297373a894 107 irqflags_t flags = cpu_irq_is_enabled();
mbed_official 579:53297373a894 108 cpu_irq_disable();
mbed_official 579:53297373a894 109 return flags;
mbed_official 579:53297373a894 110 }
mbed_official 579:53297373a894 111
mbed_official 579:53297373a894 112 static inline bool cpu_irq_is_enabled_flags(irqflags_t flags)
mbed_official 579:53297373a894 113 {
mbed_official 579:53297373a894 114 return (flags);
mbed_official 579:53297373a894 115 }
mbed_official 579:53297373a894 116
mbed_official 579:53297373a894 117 static inline void cpu_irq_restore(irqflags_t flags)
mbed_official 579:53297373a894 118 {
mbed_official 579:53297373a894 119 if (cpu_irq_is_enabled_flags(flags))
mbed_official 579:53297373a894 120 cpu_irq_enable();
mbed_official 579:53297373a894 121 }
mbed_official 579:53297373a894 122
mbed_official 579:53297373a894 123 void cpu_irq_enter_critical(void);
mbed_official 579:53297373a894 124 void cpu_irq_leave_critical(void);
mbed_official 579:53297373a894 125
mbed_official 579:53297373a894 126 /**
mbed_official 579:53297373a894 127 * \weakgroup interrupt_deprecated_group
mbed_official 579:53297373a894 128 * @{
mbed_official 579:53297373a894 129 */
mbed_official 579:53297373a894 130
mbed_official 579:53297373a894 131 #define Enable_global_interrupt() cpu_irq_enable()
mbed_official 579:53297373a894 132 #define Disable_global_interrupt() cpu_irq_disable()
mbed_official 579:53297373a894 133 #define Is_global_interrupt_enabled() cpu_irq_is_enabled()
mbed_official 579:53297373a894 134
mbed_official 579:53297373a894 135 //@}
mbed_official 579:53297373a894 136
mbed_official 579:53297373a894 137 //@}
mbed_official 579:53297373a894 138
mbed_official 579:53297373a894 139 #ifdef __cplusplus
mbed_official 579:53297373a894 140 }
mbed_official 579:53297373a894 141 #endif
mbed_official 579:53297373a894 142
mbed_official 579:53297373a894 143 #endif /* UTILS_INTERRUPT_INTERRUPT_H */