mirror of https://github.com/ARMmbed/mbed-os.git
[NUCLEO_F103RB] Serial interrupt fixes
- use TC flag instead of TXE for TX interrupt - clear interrupt flags to prevent possible interrupt stormpull/122/head
parent
2b8e05e002
commit
faee2bf073
|
@ -182,30 +182,21 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
// not api
|
// not api
|
||||||
void uart1_irq(void) {
|
static void uart_irq(USART_TypeDef* usart, int id) {
|
||||||
USART_TypeDef *usart = (USART_TypeDef *)UART_1;
|
if (serial_irq_ids[id] != 0) {
|
||||||
if (serial_irq_ids[0] != 0) {
|
if (USART_GetITStatus(usart, USART_IT_TC) != RESET) {
|
||||||
if (USART_GetITStatus(usart, USART_IT_TXE) != RESET) {
|
irq_handler(serial_irq_ids[id], TxIrq);
|
||||||
irq_handler(serial_irq_ids[0], TxIrq);
|
USART_ClearITPendingBit(usart, USART_IT_TC);
|
||||||
}
|
}
|
||||||
if (USART_GetITStatus(usart, USART_IT_RXNE) != RESET) {
|
if (USART_GetITStatus(usart, USART_IT_RXNE) != RESET) {
|
||||||
irq_handler(serial_irq_ids[0], RxIrq);
|
irq_handler(serial_irq_ids[id], RxIrq);
|
||||||
|
USART_ClearITPendingBit(usart, USART_IT_RXNE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// not api
|
static void uart1_irq(void) {uart_irq((USART_TypeDef*)UART_1, 0);}
|
||||||
void uart2_irq(void) {
|
static void uart2_irq(void) {uart_irq((USART_TypeDef*)UART_2, 1);}
|
||||||
USART_TypeDef *usart = (USART_TypeDef *)UART_2;
|
|
||||||
if (serial_irq_ids[1] != 0) {
|
|
||||||
if (USART_GetITStatus(usart, USART_IT_TXE) != RESET) {
|
|
||||||
irq_handler(serial_irq_ids[1], TxIrq);
|
|
||||||
}
|
|
||||||
if (USART_GetITStatus(usart, USART_IT_RXNE) != RESET) {
|
|
||||||
irq_handler(serial_irq_ids[1], RxIrq);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) {
|
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) {
|
||||||
irq_handler = handler;
|
irq_handler = handler;
|
||||||
|
@ -233,7 +224,7 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
|
||||||
USART_ITConfig(usart, USART_IT_RXNE, ENABLE);
|
USART_ITConfig(usart, USART_IT_RXNE, ENABLE);
|
||||||
}
|
}
|
||||||
else { // TxIrq
|
else { // TxIrq
|
||||||
USART_ITConfig(usart, USART_IT_TXE, ENABLE);
|
USART_ITConfig(usart, USART_IT_TC, ENABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
NVIC_SetVector(irq_n, vector);
|
NVIC_SetVector(irq_n, vector);
|
||||||
|
|
Loading…
Reference in New Issue