Ejemplo n.º 1
0
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));
  }
}
Ejemplo n.º 2
0
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);
  //}

}
Ejemplo n.º 3
0
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;
  }
}
Ejemplo n.º 4
0
void UART_tx_force_char(uart *u, u8_t c) {
  while (UART_CHECK_TX(u) == 0)
    ;
  UART_HW(u)->TDR = (uint8_t) c;
}
Ejemplo n.º 5
0
void UART_tx_force_char(uart *u, u8_t c) {
  while (UART_CHECK_TX(u) == 0)
    ;
  USART_SendData(UART_HW(u), (uint8_t) c);
}