void UART_irq(uart *u) { if (u->hw == 0) return; if ((UART_CHECK_RX(u)) && (UART_HW(u)->CR1 & USART_CR1_RXNEIE)) { u8_t c = USART_ReceiveData(UART_HW(u)); u->rx.buf[u->rx.wix++] = c; if (u->rx.wix >= UART_RX_BUFFER) { u->rx.wix = 0; } if (u->rx_f) { u->rx_f(u->arg, c); } } if ((UART_CHECK_TX(u))) { if (UART_ALWAYS_SYNC_TX || u->sync_tx) { USART_ITConfig(UART_HW(u), USART_IT_TXE, DISABLE); } else { if (u->tx.wix != u->tx.rix) { USART_SendData(UART_HW(u), u->tx.buf[u->tx.rix++]); if (u->tx.rix >= UART_TX_BUFFER) { u->tx.rix = 0; } } if (u->tx.wix == u->tx.rix) { UART_TX_IRQ_OFF(u); } } } if (UART_CHECK_OR(u)) { (void)USART_ReceiveData(UART_HW(u)); } }
void UART_irq(uart *u) { if (u->hw == NULL) return; if (UART_CHECK_RX(u) && UART_IS_RX_IRQ_ON(u)) { u8_t c = UART_HW(u)->RDR; u->rx.buf[u->rx.wix++] = c; if (u->rx.wix >= UART_RX_BUFFER) { u->rx.wix = 0; } // not needed acc to spec __HAL_UART_SEND_REQ(UART_HW(u), UART_RXDATA_FLUSH_REQUEST); if (u->rx_f) { u->rx_f(u->arg, c); } } if (UART_CHECK_TX(u)) { if (UART_ALWAYS_SYNC_TX || u->sync_tx) { //_UART_DISABLE_IT(UART_HW(u), USART_IT_TXE); //UART_SET_TX_IRQ_OFF(u); _UART_DISABLE_IT(UART_HW(u), USART_IT_TC); } else { if (u->tx.wix != u->tx.rix) { UART_HW(u)->TDR = u->tx.buf[u->tx.rix++]; if (u->tx.rix >= UART_TX_BUFFER) { u->tx.rix = 0; } } if (u->tx.wix == u->tx.rix) { UART_SET_TX_IRQ_OFF(u); _UART_DISABLE_IT(UART_HW(u), USART_IT_TXE); _UART_DISABLE_IT(UART_HW(u), USART_IT_TC); } } } // TODO //if (UART_CHECK_OR(u)) { // __HAL_UART_CLEAR_IT(UART_HW(u), UART_CLEAR_OREF); //} }