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); //} }
s32_t UART_put_buf(uart *u, u8_t* c, u16_t len) { if (UART_ALWAYS_SYNC_TX || u->sync_tx) { u16_t tlen = len; while (tlen-- > 0) { UART_put_char(u, *c++); } return len; } else { u32_t written = 0; u16_t guard = 0; do { u16_t avail = UART_tx_available(u); s32_t len_to_write = MIN(len - written, avail); guard++; if (len_to_write == 0) { while (UART_CHECK_TX(u) == 0) ; len_to_write = 1; } guard = 0; u32_t remaining = len_to_write; u32_t len_to_end = UART_TX_BUFFER - u->tx.wix; if (remaining > len_to_end) { memcpy(&u->tx.buf[u->tx.wix], c, len_to_end); c += len_to_end; remaining -= len_to_end; u->tx.wix = 0; } memcpy(&u->tx.buf[u->tx.wix], c, remaining); c += remaining; u->tx.wix += remaining; if (u->tx.wix >= UART_RX_BUFFER) { u->tx.wix = 0; } UART_SET_TX_IRQ_ON(u); written += len_to_write; } while (u->assure_tx && written < len && guard < 0xff); return written; } }
void UART_tx_force_char(uart *u, u8_t c) { while (UART_CHECK_TX(u) == 0) ; UART_HW(u)->TDR = (uint8_t) c; }
void UART_tx_force_char(uart *u, u8_t c) { while (UART_CHECK_TX(u) == 0) ; USART_SendData(UART_HW(u), (uint8_t) c); }