Skip to content

Commit 03367f9

Browse files
committed
Update the K64F to report uart overruns
Update the K64F to call the serial error interrupt handler when an overrun occurs. Prior to this overrun errors were ignored.
1 parent cb97257 commit 03367f9

File tree

1 file changed

+23
-18
lines changed
  • hal/targets/hal/TARGET_Freescale/TARGET_KSDK2_MCUS/TARGET_MCU_K64F

1 file changed

+23
-18
lines changed

hal/targets/hal/TARGET_Freescale/TARGET_KSDK2_MCUS/TARGET_MCU_K64F/serial_api.c

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -115,14 +115,16 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b
115115
/******************************************************************************
116116
* INTERRUPTS HANDLING
117117
******************************************************************************/
118-
static inline void uart_irq(uint32_t transmit_empty, uint32_t receive_full, uint32_t index) {
118+
static inline void uart_irq(uint32_t transmit_empty, uint32_t receive_full, uint32_t error, uint32_t index) {
119119
UART_Type *base = uart_addrs[index];
120120

121121
/* If RX overrun. */
122-
if (UART_S1_OR_MASK & base->S1)
122+
if (error)
123123
{
124124
/* Read base->D, otherwise the RX does not work. */
125125
(void)base->D;
126+
127+
irq_handler(serial_irq_ids[index], ErIrq);
126128
}
127129

128130
if (serial_irq_ids[index] != 0) {
@@ -136,32 +138,44 @@ static inline void uart_irq(uint32_t transmit_empty, uint32_t receive_full, uint
136138

137139
void uart0_irq() {
138140
uint32_t status_flags = UART0->S1;
139-
uart_irq((status_flags & kUART_TxDataRegEmptyFlag), (status_flags & kUART_RxDataRegFullFlag), 0);
141+
uart_irq((status_flags & kUART_TxDataRegEmptyFlag),
142+
(status_flags & kUART_RxDataRegFullFlag),
143+
(status_flags & kUART_RxOverrunFlag), 0);
140144
}
141145

142146
void uart1_irq() {
143147
uint32_t status_flags = UART1->S1;
144-
uart_irq((status_flags & UART_S1_TDRE_MASK), (status_flags & UART_S1_RDRF_MASK), 1);
148+
uart_irq((status_flags & UART_S1_TDRE_MASK),
149+
(status_flags & UART_S1_RDRF_MASK),
150+
(status_flags & UART_S1_OR_MASK), 1);
145151
}
146152

147153
void uart2_irq() {
148154
uint32_t status_flags = UART2->S1;
149-
uart_irq((status_flags & UART_S1_TDRE_MASK), (status_flags & UART_S1_RDRF_MASK), 2);
155+
uart_irq((status_flags & UART_S1_TDRE_MASK),
156+
(status_flags & UART_S1_RDRF_MASK),
157+
(status_flags & UART_S1_OR_MASK), 2);
150158
}
151159

152160
void uart3_irq() {
153161
uint32_t status_flags = UART3->S1;
154-
uart_irq((status_flags & UART_S1_TDRE_MASK), (status_flags & UART_S1_RDRF_MASK), 3);
162+
uart_irq((status_flags & UART_S1_TDRE_MASK),
163+
(status_flags & UART_S1_RDRF_MASK),
164+
(status_flags & UART_S1_OR_MASK), 3);
155165
}
156166

157167
void uart4_irq() {
158168
uint32_t status_flags = UART4->S1;
159-
uart_irq((status_flags & UART_S1_TDRE_MASK), (status_flags & UART_S1_RDRF_MASK), 4);
169+
uart_irq((status_flags & UART_S1_TDRE_MASK),
170+
(status_flags & UART_S1_RDRF_MASK),
171+
(status_flags & UART_S1_OR_MASK), 4);
160172
}
161173

162174
void uart5_irq() {
163175
uint32_t status_flags = UART5->S1;
164-
uart_irq((status_flags & UART_S1_TDRE_MASK), (status_flags & UART_S1_RDRF_MASK), 5);
176+
uart_irq((status_flags & UART_S1_TDRE_MASK),
177+
(status_flags & UART_S1_RDRF_MASK),
178+
(status_flags & UART_S1_OR_MASK), 5);
165179
}
166180

167181
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) {
@@ -212,24 +226,15 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
212226

213227
} else { // disable
214228
int all_disabled = 0;
215-
SerialIrq other_irq = (irq == RxIrq) ? (TxIrq) : (RxIrq);
216229
switch (irq) {
217230
case RxIrq:
218231
UART_DisableInterrupts(uart_addrs[obj->index], kUART_RxDataRegFullInterruptEnable);
232+
all_disabled = ((UART_GetEnabledInterrupts(uart_addrs[obj->index]) & kUART_TxDataRegEmptyInterruptEnable) == 0);
219233
break;
220234
case TxIrq:
221235
UART_DisableInterrupts(uart_addrs[obj->index], kUART_TxDataRegEmptyInterruptEnable);
222-
break;
223-
default:
224-
break;
225-
}
226-
switch (other_irq) {
227-
case RxIrq:
228236
all_disabled = ((UART_GetEnabledInterrupts(uart_addrs[obj->index]) & kUART_RxDataRegFullInterruptEnable) == 0);
229237
break;
230-
case TxIrq:
231-
all_disabled = ((UART_GetEnabledInterrupts(uart_addrs[obj->index]) & kUART_TxDataRegEmptyInterruptEnable) == 0);
232-
break;
233238
default:
234239
break;
235240
}

0 commit comments

Comments
 (0)