@@ -63,6 +63,37 @@ static serial_t *objs[MXC_UART_INSTANCES];
63
63
64
64
static void usurp_pin (PinName , int );
65
65
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
+
66
97
//******************************************************************************
67
98
void serial_init (serial_t * obj , PinName tx , PinName rx )
68
99
{
@@ -101,6 +132,27 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
101
132
102
133
MXC_UART_Init (obj -> uart , DEFAULT_BAUD , MXC_UART_APB_CLK , obj -> map );
103
134
//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 ;
104
156
}
105
157
106
158
void serial_free (serial_t * obj )
@@ -153,37 +205,6 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b
153
205
}
154
206
}
155
207
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
-
187
208
//******************************************************************************
188
209
void serial_irq_handler (serial_t * obj , uart_irq_handler handler , uint32_t id )
189
210
{
@@ -197,27 +218,6 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
197
218
MBED_ASSERT (obj -> index < MXC_UART_INSTANCES );
198
219
objs [obj -> index ] = obj ;
199
220
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
221
// Set TX Almost Empty level to interrupt when empty
222
222
MXC_UART_SetRXThreshold (obj -> uart , 1 );
223
223
0 commit comments