/* Transmits datas via UART DMA, the function will return after datas is sent. 
@method UART_SendBuf  */
void UART_SendBuf(UART_TypeDef *UARTx, uint8_t *buf, uint32_t len)
/* Transmits datas via UART DMA, the function will return after datas is sent. 
@method UART_SendBuf  */
void UART_SendBuf(UART_TypeDef *UARTx, uint8_t *buf, uint32_t len)
{
    _ASSERT(IS_UART(UARTx));
    _ASSERT(NULL != buf);
    _ASSERT(len < 0xfffff);
    DMA_TypeDef *DMAx                = (DMA_TypeDef *)((uint32_t)UARTx - sizeof(DMA_TypeDef));
    DMAx->SRC_ADDR.reg               = (uint32_t)buf;
    DMAx->LEN_LOW.bit.TX_LEN_L       = len & 0xffff;
    DMAx->CTRL.bit.TX_LEN_H          = len >> 16;
    DMAx->CTRL.bit.START             = 1;
    while (DMAx->STATUS.bit.DONE != 1);
}