Skip to content

Commit 9e443e9

Browse files
Merge pull request #4734 from LMESTM/stm32_uart_irq
Avoid data loss with serial interrupt used at high baudrates
2 parents e7f27aa + b5cbaaa commit 9e443e9

File tree

9 files changed

+48
-59
lines changed

9 files changed

+48
-59
lines changed

targets/TARGET_STM/TARGET_STM32F0/serial_device.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -264,17 +264,15 @@ static void uart_irq(int id)
264264
UART_HandleTypeDef * huart = &uart_handlers[id];
265265

266266
if (serial_irq_ids[id] != 0) {
267-
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
268-
if (__HAL_UART_GET_IT(huart, UART_IT_TC) != RESET) {
267+
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) {
268+
if (__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESET) {
269269
irq_handler(serial_irq_ids[id], TxIrq);
270-
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_TCF);
271270
}
272271
}
273272
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
274273
if (__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) {
275274
irq_handler(serial_irq_ids[id], RxIrq);
276-
volatile uint32_t tmpval = huart->Instance->RDR; // Clear RXNE flag
277-
UNUSED(tmpval);
275+
/* Flag has been cleared when reading the content */
278276
}
279277
}
280278
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
@@ -419,7 +417,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
419417
if (irq == RxIrq) {
420418
__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
421419
} else { // TxIrq
422-
__HAL_UART_ENABLE_IT(huart, UART_IT_TC);
420+
__HAL_UART_ENABLE_IT(huart, UART_IT_TXE);
423421
}
424422
NVIC_SetVector(irq_n, vector);
425423
NVIC_EnableIRQ(irq_n);
@@ -433,7 +431,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
433431
all_disabled = 1;
434432
}
435433
} else { // TxIrq
436-
__HAL_UART_DISABLE_IT(huart, UART_IT_TC);
434+
__HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
437435
// Check if RxIrq is disabled too
438436
if ((huart->Instance->CR1 & USART_CR1_RXNEIE) == 0) {
439437
all_disabled = 1;

targets/TARGET_STM/TARGET_STM32F1/serial_device.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -159,16 +159,15 @@ static void uart_irq(int id)
159159
UART_HandleTypeDef * huart = &uart_handlers[id];
160160

161161
if (serial_irq_ids[id] != 0) {
162-
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
163-
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESET) {
162+
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) {
163+
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE) != RESET) {
164164
irq_handler(serial_irq_ids[id], TxIrq);
165-
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC);
166165
}
167166
}
168167
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
169168
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESET) {
170169
irq_handler(serial_irq_ids[id], RxIrq);
171-
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_RXNE);
170+
/* Flag has been cleared when reading the content */
172171
}
173172
}
174173
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
@@ -228,7 +227,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
228227
if (irq == RxIrq) {
229228
__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
230229
} else { // TxIrq
231-
__HAL_UART_ENABLE_IT(huart, UART_IT_TC);
230+
__HAL_UART_ENABLE_IT(huart, UART_IT_TXE);
232231
}
233232
NVIC_SetVector(irq_n, vector);
234233
NVIC_EnableIRQ(irq_n);
@@ -242,7 +241,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
242241
all_disabled = 1;
243242
}
244243
} else { // TxIrq
245-
__HAL_UART_DISABLE_IT(huart, UART_IT_TC);
244+
__HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
246245
// Check if RxIrq is disabled too
247246
if ((huart->Instance->CR1 & USART_CR1_RXNEIE) == 0) {
248247
all_disabled = 1;

targets/TARGET_STM/TARGET_STM32F2/serial_device.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -246,16 +246,15 @@ static void uart_irq(int id)
246246
UART_HandleTypeDef * huart = &uart_handlers[id];
247247

248248
if (serial_irq_ids[id] != 0) {
249-
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
250-
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESET) {
249+
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) {
250+
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE) != RESET) {
251251
irq_handler(serial_irq_ids[id], TxIrq);
252-
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC);
253252
}
254253
}
255254
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
256255
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESET) {
257256
irq_handler(serial_irq_ids[id], RxIrq);
258-
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_RXNE);
257+
/* Flag has been cleared when reading the content */
259258
}
260259
}
261260
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
@@ -385,7 +384,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
385384
if (irq == RxIrq) {
386385
__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
387386
} else { // TxIrq
388-
__HAL_UART_ENABLE_IT(huart, UART_IT_TC);
387+
__HAL_UART_ENABLE_IT(huart, UART_IT_TXE);
389388
}
390389
NVIC_SetVector(irq_n, vector);
391390
NVIC_EnableIRQ(irq_n);
@@ -399,7 +398,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
399398
all_disabled = 1;
400399
}
401400
} else { // TxIrq
402-
__HAL_UART_DISABLE_IT(huart, UART_IT_TC);
401+
__HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
403402
// Check if RxIrq is disabled too
404403
if ((huart->Instance->CR1 & USART_CR1_RXNEIE) == 0) {
405404
all_disabled = 1;

targets/TARGET_STM/TARGET_STM32F3/serial_device.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -210,17 +210,15 @@ static void uart_irq(int id)
210210
UART_HandleTypeDef * huart = &uart_handlers[id];
211211

212212
if (serial_irq_ids[id] != 0) {
213-
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
214-
if (__HAL_UART_GET_IT(huart, UART_IT_TC) != RESET) {
213+
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) {
214+
if (__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESET) {
215215
irq_handler(serial_irq_ids[id], TxIrq);
216-
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_TCF);
217216
}
218217
}
219218
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
220219
if (__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) {
221-
irq_handler(serial_irq_ids[id], RxIrq);
222-
volatile uint32_t tmpval = huart->Instance->RDR; // Clear RXNE flag
223-
UNUSED(tmpval);
220+
irq_handler(serial_irq_ids[id], RxIrq);
221+
/* Flag has been cleared when reading the content */
224222
}
225223
}
226224
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
@@ -312,7 +310,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
312310
if (irq == RxIrq) {
313311
__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
314312
} else { // TxIrq
315-
__HAL_UART_ENABLE_IT(huart, UART_IT_TC);
313+
__HAL_UART_ENABLE_IT(huart, UART_IT_TXE);
316314
}
317315
NVIC_SetVector(irq_n, vector);
318316
NVIC_EnableIRQ(irq_n);
@@ -326,7 +324,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
326324
all_disabled = 1;
327325
}
328326
} else { // TxIrq
329-
__HAL_UART_DISABLE_IT(huart, UART_IT_TC);
327+
__HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
330328
// Check if RxIrq is disabled too
331329
if ((huart->Instance->CR1 & USART_CR1_RXNEIE) == 0) {
332330
all_disabled = 1;

targets/TARGET_STM/TARGET_STM32F4/serial_device.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -273,16 +273,15 @@ static void uart_irq(int id)
273273
UART_HandleTypeDef * huart = &uart_handlers[id];
274274

275275
if (serial_irq_ids[id] != 0) {
276-
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
277-
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESET) {
276+
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) {
277+
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE) != RESET) {
278278
irq_handler(serial_irq_ids[id], TxIrq);
279-
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC);
280279
}
281280
}
282281
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
283282
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESET) {
284283
irq_handler(serial_irq_ids[id], RxIrq);
285-
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_RXNE);
284+
/* Flag has been cleared when reading the content */
286285
}
287286
}
288287
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
@@ -438,7 +437,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
438437
if (irq == RxIrq) {
439438
__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
440439
} else { // TxIrq
441-
__HAL_UART_ENABLE_IT(huart, UART_IT_TC);
440+
__HAL_UART_ENABLE_IT(huart, UART_IT_TXE);
442441
}
443442
NVIC_SetVector(irq_n, vector);
444443
NVIC_EnableIRQ(irq_n);
@@ -452,7 +451,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
452451
all_disabled = 1;
453452
}
454453
} else { // TxIrq
455-
__HAL_UART_DISABLE_IT(huart, UART_IT_TC);
454+
__HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
456455
// Check if RxIrq is disabled too
457456
if ((huart->Instance->CR1 & USART_CR1_RXNEIE) == 0) {
458457
all_disabled = 1;

targets/TARGET_STM/TARGET_STM32F7/serial_device.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -238,16 +238,15 @@ static void uart_irq(int id)
238238
UART_HandleTypeDef * huart = &uart_handlers[id];
239239

240240
if (serial_irq_ids[id] != 0) {
241-
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
242-
if (__HAL_UART_GET_IT(huart, UART_IT_TC) != RESET) {
241+
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) {
242+
if (__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESET) {
243243
irq_handler(serial_irq_ids[id], TxIrq);
244-
__HAL_UART_CLEAR_IT(huart, UART_CLEAR_TCF);
245244
}
246245
}
247246
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
248247
if (__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) {
249248
irq_handler(serial_irq_ids[id], RxIrq);
250-
volatile uint32_t tmpval = huart->Instance->RDR; // Clear RXNE
249+
/* Flag has been cleared when reading the content */
251250
}
252251
}
253252
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
@@ -373,7 +372,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
373372
if (irq == RxIrq) {
374373
__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
375374
} else { // TxIrq
376-
__HAL_UART_ENABLE_IT(huart, UART_IT_TC);
375+
__HAL_UART_ENABLE_IT(huart, UART_IT_TXE);
377376
}
378377
NVIC_SetVector(irq_n, vector);
379378
NVIC_EnableIRQ(irq_n);
@@ -387,7 +386,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
387386
all_disabled = 1;
388387
}
389388
} else { // TxIrq
390-
__HAL_UART_DISABLE_IT(huart, UART_IT_TC);
389+
__HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
391390
// Check if RxIrq is disabled too
392391
if ((huart->Instance->CR1 & USART_CR1_RXNEIE) == 0) {
393392
all_disabled = 1;

targets/TARGET_STM/TARGET_STM32L0/serial_device.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -201,16 +201,15 @@ static void uart_irq(int id)
201201
UART_HandleTypeDef * huart = &uart_handlers[id];
202202

203203
if (serial_irq_ids[id] != 0) {
204-
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
205-
if (__HAL_UART_GET_IT(huart, UART_IT_TC) != RESET) {
204+
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) {
205+
if (__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESET) {
206206
irq_handler(serial_irq_ids[id], TxIrq);
207-
__HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_TCF);
208207
}
209208
}
210209
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
211210
if (__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) {
212211
irq_handler(serial_irq_ids[id], RxIrq);
213-
volatile uint32_t tmpval = huart->Instance->RDR; // Clear RXNE flag
212+
/* Flag has been cleared when reading the content */
214213
}
215214
}
216215
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
@@ -302,7 +301,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
302301
if (irq == RxIrq) {
303302
__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
304303
} else { // TxIrq
305-
__HAL_UART_ENABLE_IT(huart, UART_IT_TC);
304+
__HAL_UART_ENABLE_IT(huart, UART_IT_TXE);
306305
}
307306
NVIC_SetVector(irq_n, vector);
308307
NVIC_EnableIRQ(irq_n);
@@ -316,7 +315,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
316315
all_disabled = 1;
317316
}
318317
} else { // TxIrq
319-
__HAL_UART_DISABLE_IT(huart, UART_IT_TC);
318+
__HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
320319
// Check if RxIrq is disabled too
321320
if ((huart->Instance->CR1 & USART_CR1_RXNEIE) == 0) {
322321
all_disabled = 1;

targets/TARGET_STM/TARGET_STM32L1/serial_device.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -190,16 +190,15 @@ static void uart_irq(int id)
190190
UART_HandleTypeDef * huart = &uart_handlers[id];
191191

192192
if (serial_irq_ids[id] != 0) {
193-
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
194-
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TC) != RESET) {
193+
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) {
194+
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE) != RESET) {
195195
irq_handler(serial_irq_ids[id], TxIrq);
196-
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC);
197196
}
198197
}
199198
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
200199
if (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESET) {
201200
irq_handler(serial_irq_ids[id], RxIrq);
202-
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_RXNE);
201+
/* Flag has been cleared when reading the content */
203202
}
204203
}
205204
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
@@ -284,7 +283,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
284283
if (irq == RxIrq) {
285284
__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
286285
} else { // TxIrq
287-
__HAL_UART_ENABLE_IT(huart, UART_IT_TC);
286+
__HAL_UART_ENABLE_IT(huart, UART_IT_TXE);
288287
}
289288
NVIC_SetVector(irq_n, vector);
290289
NVIC_EnableIRQ(irq_n);
@@ -298,7 +297,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
298297
all_disabled = 1;
299298
}
300299
} else { // TxIrq
301-
__HAL_UART_DISABLE_IT(huart, UART_IT_TC);
300+
__HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
302301
// Check if RxIrq is disabled too
303302
if ((huart->Instance->CR1 & USART_CR1_RXNEIE) == 0) {
304303
all_disabled = 1;

targets/TARGET_STM/TARGET_STM32L4/serial_device.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -217,16 +217,15 @@ static void uart_irq(int id)
217217
UART_HandleTypeDef * huart = &uart_handlers[id];
218218

219219
if (serial_irq_ids[id] != 0) {
220-
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) {
221-
if (__HAL_UART_GET_IT(huart, UART_IT_TC) != RESET) {
222-
irq_handler(serial_irq_ids[id], TxIrq);
223-
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_TC);
220+
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) {
221+
if (__HAL_UART_GET_IT(huart, UART_IT_TXE) != RESET) {
222+
irq_handler(serial_irq_ids[id], TxIrq);
224223
}
225224
}
226225
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) {
227226
if (__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) {
228-
irq_handler(serial_irq_ids[id], RxIrq);
229-
__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_RXNE);
227+
irq_handler(serial_irq_ids[id], RxIrq);
228+
/* Flag has been cleared when reading the content */
230229
}
231230
}
232231
if (__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE) != RESET) {
@@ -330,7 +329,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
330329
if (irq == RxIrq) {
331330
__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
332331
} else { // TxIrq
333-
__HAL_UART_ENABLE_IT(huart, UART_IT_TC);
332+
__HAL_UART_ENABLE_IT(huart, UART_IT_TXE);
334333
}
335334
NVIC_SetVector(irq_n, vector);
336335
NVIC_EnableIRQ(irq_n);
@@ -344,7 +343,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
344343
all_disabled = 1;
345344
}
346345
} else { // TxIrq
347-
__HAL_UART_DISABLE_IT(huart, UART_IT_TC);
346+
__HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
348347
// Check if RxIrq is disabled too
349348
if ((huart->Instance->CR1 & USART_CR1_RXNEIE) == 0) {
350349
all_disabled = 1;

0 commit comments

Comments
 (0)