mbed library sources. Supersedes mbed-src. Fixes analogIn and analogOut problems for TARGET_STM32F3. Tested on NUCLEO-F303K8, using 3 analogout and 7 analogin channels simultaneously. Added ability for STM32F334R8 and STM32F303K8 to use all three channels of DAC simultaneously. https://developer.mbed.org/users/StevieWray/code/mbed-dev/ Added ability for TARGET_STM32F3 to use more than one ADC simultaneously. https://developer.mbed.org/questions/67997/NUCLEO-F303K8ADC/

Fork of mbed-dev by mbed official

Committer:
neurofun
Date:
Tue Feb 23 21:59:35 2016 +0000
Revision:
70:b3a5af880266
Parent:
0:9b334a45a8ff
Edited DAC routines to allow for the simultaneous use of three channels from two DACs as seen on the STM32F334R8 and STM32F303K8. Edited ADC routines to allow for the simultaneous use of more than one ADC.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm 0:9b334a45a8ff 1 #ifndef MBED_INTERRUPTMANAGER_H
bogdanm 0:9b334a45a8ff 2 #define MBED_INTERRUPTMANAGER_H
bogdanm 0:9b334a45a8ff 3
bogdanm 0:9b334a45a8ff 4 #include "cmsis.h"
bogdanm 0:9b334a45a8ff 5 #include "CallChain.h"
bogdanm 0:9b334a45a8ff 6 #include <string.h>
bogdanm 0:9b334a45a8ff 7
bogdanm 0:9b334a45a8ff 8 namespace mbed {
bogdanm 0:9b334a45a8ff 9
bogdanm 0:9b334a45a8ff 10 /** Use this singleton if you need to chain interrupt handlers.
bogdanm 0:9b334a45a8ff 11 *
bogdanm 0:9b334a45a8ff 12 * Example (for LPC1768):
bogdanm 0:9b334a45a8ff 13 * @code
bogdanm 0:9b334a45a8ff 14 * #include "InterruptManager.h"
bogdanm 0:9b334a45a8ff 15 * #include "mbed.h"
bogdanm 0:9b334a45a8ff 16 *
bogdanm 0:9b334a45a8ff 17 * Ticker flipper;
bogdanm 0:9b334a45a8ff 18 * DigitalOut led1(LED1);
bogdanm 0:9b334a45a8ff 19 * DigitalOut led2(LED2);
bogdanm 0:9b334a45a8ff 20 *
bogdanm 0:9b334a45a8ff 21 * void flip(void) {
bogdanm 0:9b334a45a8ff 22 * led1 = !led1;
bogdanm 0:9b334a45a8ff 23 * }
bogdanm 0:9b334a45a8ff 24 *
bogdanm 0:9b334a45a8ff 25 * void handler(void) {
bogdanm 0:9b334a45a8ff 26 * led2 = !led1;
bogdanm 0:9b334a45a8ff 27 * }
bogdanm 0:9b334a45a8ff 28 *
bogdanm 0:9b334a45a8ff 29 * int main() {
bogdanm 0:9b334a45a8ff 30 * led1 = led2 = 0;
bogdanm 0:9b334a45a8ff 31 * flipper.attach(&flip, 1.0);
bogdanm 0:9b334a45a8ff 32 * InterruptManager::get()->add_handler(handler, TIMER3_IRQn);
bogdanm 0:9b334a45a8ff 33 * }
bogdanm 0:9b334a45a8ff 34 * @endcode
bogdanm 0:9b334a45a8ff 35 */
bogdanm 0:9b334a45a8ff 36 class InterruptManager {
bogdanm 0:9b334a45a8ff 37 public:
bogdanm 0:9b334a45a8ff 38 /** Return the only instance of this class
bogdanm 0:9b334a45a8ff 39 */
bogdanm 0:9b334a45a8ff 40 static InterruptManager* get();
bogdanm 0:9b334a45a8ff 41
bogdanm 0:9b334a45a8ff 42 /** Destroy the current instance of the interrupt manager
bogdanm 0:9b334a45a8ff 43 */
bogdanm 0:9b334a45a8ff 44 static void destroy();
bogdanm 0:9b334a45a8ff 45
bogdanm 0:9b334a45a8ff 46 /** Add a handler for an interrupt at the end of the handler list
bogdanm 0:9b334a45a8ff 47 *
bogdanm 0:9b334a45a8ff 48 * @param function the handler to add
bogdanm 0:9b334a45a8ff 49 * @param irq interrupt number
bogdanm 0:9b334a45a8ff 50 *
bogdanm 0:9b334a45a8ff 51 * @returns
bogdanm 0:9b334a45a8ff 52 * The function object created for 'function'
bogdanm 0:9b334a45a8ff 53 */
bogdanm 0:9b334a45a8ff 54 pFunctionPointer_t add_handler(void (*function)(void), IRQn_Type irq) {
bogdanm 0:9b334a45a8ff 55 return add_common(function, irq);
bogdanm 0:9b334a45a8ff 56 }
bogdanm 0:9b334a45a8ff 57
bogdanm 0:9b334a45a8ff 58 /** Add a handler for an interrupt at the beginning of the handler list
bogdanm 0:9b334a45a8ff 59 *
bogdanm 0:9b334a45a8ff 60 * @param function the handler to add
bogdanm 0:9b334a45a8ff 61 * @param irq interrupt number
bogdanm 0:9b334a45a8ff 62 *
bogdanm 0:9b334a45a8ff 63 * @returns
bogdanm 0:9b334a45a8ff 64 * The function object created for 'function'
bogdanm 0:9b334a45a8ff 65 */
bogdanm 0:9b334a45a8ff 66 pFunctionPointer_t add_handler_front(void (*function)(void), IRQn_Type irq) {
bogdanm 0:9b334a45a8ff 67 return add_common(function, irq, true);
bogdanm 0:9b334a45a8ff 68 }
bogdanm 0:9b334a45a8ff 69
bogdanm 0:9b334a45a8ff 70 /** Add a handler for an interrupt at the end of the handler list
bogdanm 0:9b334a45a8ff 71 *
bogdanm 0:9b334a45a8ff 72 * @param tptr pointer to the object that has the handler function
bogdanm 0:9b334a45a8ff 73 * @param mptr pointer to the actual handler function
bogdanm 0:9b334a45a8ff 74 * @param irq interrupt number
bogdanm 0:9b334a45a8ff 75 *
bogdanm 0:9b334a45a8ff 76 * @returns
bogdanm 0:9b334a45a8ff 77 * The function object created for 'tptr' and 'mptr'
bogdanm 0:9b334a45a8ff 78 */
bogdanm 0:9b334a45a8ff 79 template<typename T>
bogdanm 0:9b334a45a8ff 80 pFunctionPointer_t add_handler(T* tptr, void (T::*mptr)(void), IRQn_Type irq) {
bogdanm 0:9b334a45a8ff 81 return add_common(tptr, mptr, irq);
bogdanm 0:9b334a45a8ff 82 }
bogdanm 0:9b334a45a8ff 83
bogdanm 0:9b334a45a8ff 84 /** Add a handler for an interrupt at the beginning of the handler list
bogdanm 0:9b334a45a8ff 85 *
bogdanm 0:9b334a45a8ff 86 * @param tptr pointer to the object that has the handler function
bogdanm 0:9b334a45a8ff 87 * @param mptr pointer to the actual handler function
bogdanm 0:9b334a45a8ff 88 * @param irq interrupt number
bogdanm 0:9b334a45a8ff 89 *
bogdanm 0:9b334a45a8ff 90 * @returns
bogdanm 0:9b334a45a8ff 91 * The function object created for 'tptr' and 'mptr'
bogdanm 0:9b334a45a8ff 92 */
bogdanm 0:9b334a45a8ff 93 template<typename T>
bogdanm 0:9b334a45a8ff 94 pFunctionPointer_t add_handler_front(T* tptr, void (T::*mptr)(void), IRQn_Type irq) {
bogdanm 0:9b334a45a8ff 95 return add_common(tptr, mptr, irq, true);
bogdanm 0:9b334a45a8ff 96 }
bogdanm 0:9b334a45a8ff 97
bogdanm 0:9b334a45a8ff 98 /** Remove a handler from an interrupt
bogdanm 0:9b334a45a8ff 99 *
bogdanm 0:9b334a45a8ff 100 * @param handler the function object for the handler to remove
bogdanm 0:9b334a45a8ff 101 * @param irq the interrupt number
bogdanm 0:9b334a45a8ff 102 *
bogdanm 0:9b334a45a8ff 103 * @returns
bogdanm 0:9b334a45a8ff 104 * true if the handler was found and removed, false otherwise
bogdanm 0:9b334a45a8ff 105 */
bogdanm 0:9b334a45a8ff 106 bool remove_handler(pFunctionPointer_t handler, IRQn_Type irq);
bogdanm 0:9b334a45a8ff 107
bogdanm 0:9b334a45a8ff 108 private:
bogdanm 0:9b334a45a8ff 109 InterruptManager();
bogdanm 0:9b334a45a8ff 110 ~InterruptManager();
bogdanm 0:9b334a45a8ff 111
bogdanm 0:9b334a45a8ff 112 // We declare the copy contructor and the assignment operator, but we don't
bogdanm 0:9b334a45a8ff 113 // implement them. This way, if someone tries to copy/assign our instance,
bogdanm 0:9b334a45a8ff 114 // he will get an error at compile time.
bogdanm 0:9b334a45a8ff 115 InterruptManager(const InterruptManager&);
bogdanm 0:9b334a45a8ff 116 InterruptManager& operator =(const InterruptManager&);
bogdanm 0:9b334a45a8ff 117
bogdanm 0:9b334a45a8ff 118 template<typename T>
bogdanm 0:9b334a45a8ff 119 pFunctionPointer_t add_common(T *tptr, void (T::*mptr)(void), IRQn_Type irq, bool front=false) {
bogdanm 0:9b334a45a8ff 120 int irq_pos = get_irq_index(irq);
bogdanm 0:9b334a45a8ff 121 bool change = must_replace_vector(irq);
bogdanm 0:9b334a45a8ff 122
bogdanm 0:9b334a45a8ff 123 pFunctionPointer_t pf = front ? _chains[irq_pos]->add_front(tptr, mptr) : _chains[irq_pos]->add(tptr, mptr);
bogdanm 0:9b334a45a8ff 124 if (change)
bogdanm 0:9b334a45a8ff 125 NVIC_SetVector(irq, (uint32_t)&InterruptManager::static_irq_helper);
bogdanm 0:9b334a45a8ff 126 return pf;
bogdanm 0:9b334a45a8ff 127 }
bogdanm 0:9b334a45a8ff 128
bogdanm 0:9b334a45a8ff 129 pFunctionPointer_t add_common(void (*function)(void), IRQn_Type irq, bool front=false);
bogdanm 0:9b334a45a8ff 130 bool must_replace_vector(IRQn_Type irq);
bogdanm 0:9b334a45a8ff 131 int get_irq_index(IRQn_Type irq);
bogdanm 0:9b334a45a8ff 132 void irq_helper();
bogdanm 0:9b334a45a8ff 133 void add_helper(void (*function)(void), IRQn_Type irq, bool front=false);
bogdanm 0:9b334a45a8ff 134 static void static_irq_helper();
bogdanm 0:9b334a45a8ff 135
bogdanm 0:9b334a45a8ff 136 CallChain* _chains[NVIC_NUM_VECTORS];
bogdanm 0:9b334a45a8ff 137 static InterruptManager* _instance;
bogdanm 0:9b334a45a8ff 138 };
bogdanm 0:9b334a45a8ff 139
bogdanm 0:9b334a45a8ff 140 } // namespace mbed
bogdanm 0:9b334a45a8ff 141
bogdanm 0:9b334a45a8ff 142 #endif
bogdanm 0:9b334a45a8ff 143