@@ -63,6 +63,37 @@ static serial_t *objs[MXC_UART_INSTANCES];
6363
6464static void usurp_pin (PinName , int );
6565
66+ //******************************************************************************
67+ void uart_handler (serial_t * obj )
68+ {
69+ // clear interrupts
70+ volatile uint32_t flags = obj -> uart -> int_fl ;
71+
72+ if (flags & UART_ER_IE ) {
73+ // clear error flags
74+ obj -> uart -> int_fl = UART_ER_IE ;
75+ }
76+
77+ if (flags & UART_RX_IE ) {
78+ obj -> uart -> int_fl = UART_RX_IE ;
79+ if (obj && irq_handler ) {
80+ irq_handler (obj -> id , RxIrq );
81+ }
82+ }
83+
84+ if (flags & UART_TX_IE ) {
85+ obj -> uart -> int_fl = UART_TX_IE ;
86+ if (obj && irq_handler ) {
87+ irq_handler (obj -> id , TxIrq );
88+ }
89+ }
90+ }
91+
92+ void uart0_handler (void ) { uart_handler (objs [0 ]); }
93+ void uart1_handler (void ) { uart_handler (objs [1 ]); }
94+ void uart2_handler (void ) { uart_handler (objs [2 ]); }
95+ void uart3_handler (void ) { uart_handler (objs [3 ]); }
96+
6697//******************************************************************************
6798void serial_init (serial_t * obj , PinName tx , PinName rx )
6899{
@@ -101,6 +132,27 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
101132
102133 MXC_UART_Init (obj -> uart , DEFAULT_BAUD , MXC_UART_APB_CLK , obj -> map );
103134 //MBED_ASSERT(retval == E_NO_ERROR);
135+
136+ switch (obj -> index ) {
137+ case 0 :
138+ NVIC_SetVector (UART0_IRQn , (uint32_t )uart0_handler );
139+ NVIC_EnableIRQ (UART0_IRQn );
140+ break ;
141+ case 1 :
142+ NVIC_SetVector (UART1_IRQn , (uint32_t )uart1_handler );
143+ NVIC_EnableIRQ (UART1_IRQn );
144+ break ;
145+ case 2 :
146+ NVIC_SetVector (UART2_IRQn , (uint32_t )uart2_handler );
147+ NVIC_EnableIRQ (UART2_IRQn );
148+ break ;
149+ case 3 :
150+ NVIC_SetVector (UART3_IRQn , (uint32_t )uart3_handler );
151+ NVIC_EnableIRQ (UART3_IRQn );
152+ break ;
153+ }
154+
155+ return ;
104156}
105157
106158void serial_free (serial_t * obj )
@@ -153,37 +205,6 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b
153205 }
154206}
155207
156- //******************************************************************************
157- void uart_handler (serial_t * obj )
158- {
159- // clear interrupts
160- volatile uint32_t flags = obj -> uart -> int_fl ;
161-
162- if (flags & UART_ER_IE ) {
163- // clear error flags
164- obj -> uart -> int_fl = UART_ER_IE ;
165- }
166-
167- if (flags & UART_RX_IE ) {
168- obj -> uart -> int_fl = UART_RX_IE ;
169- if (obj && irq_handler ) {
170- irq_handler (obj -> id , RxIrq );
171- }
172- }
173-
174- if (flags & UART_TX_IE ) {
175- obj -> uart -> int_fl = UART_TX_IE ;
176- if (obj && irq_handler ) {
177- irq_handler (obj -> id , TxIrq );
178- }
179- }
180- }
181-
182- void uart0_handler (void ) { uart_handler (objs [0 ]); }
183- void uart1_handler (void ) { uart_handler (objs [1 ]); }
184- void uart2_handler (void ) { uart_handler (objs [2 ]); }
185- void uart3_handler (void ) { uart_handler (objs [3 ]); }
186-
187208//******************************************************************************
188209void serial_irq_handler (serial_t * obj , uart_irq_handler handler , uint32_t id )
189210{
@@ -197,30 +218,6 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
197218 MBED_ASSERT (obj -> index < MXC_UART_INSTANCES );
198219 objs [obj -> index ] = obj ;
199220
200- switch (obj -> index ) {
201- case 0 :
202- NVIC_SetVector (UART0_IRQn , (uint32_t )uart0_handler );
203- NVIC_EnableIRQ (UART0_IRQn );
204- break ;
205- case 1 :
206- NVIC_SetVector (UART1_IRQn , (uint32_t )uart1_handler );
207- NVIC_EnableIRQ (UART1_IRQn );
208- break ;
209- case 2 :
210- NVIC_SetVector (UART2_IRQn , (uint32_t )uart2_handler );
211- NVIC_EnableIRQ (UART2_IRQn );
212- break ;
213- case 3 :
214- NVIC_SetVector (UART3_IRQn , (uint32_t )uart3_handler );
215- NVIC_EnableIRQ (UART3_IRQn );
216- break ;
217- default :
218- MBED_ASSERT (0 );
219- }
220-
221- // Clear pending interrupts
222- obj -> uart -> int_fl = obj -> uart -> int_fl ;
223-
224221 // Set TX Almost Empty level to interrupt when empty
225222 MXC_UART_SetRXThreshold (obj -> uart , 1 );
226223
0 commit comments