请问串口DMA接收数据时,如何知道本次接收到多少字节数据?



  • 手册和代码里没有找到对应的寄存器



  • 串口接收波特率是多少



  • 这个需要在串口超时中断中算,DMA搬运地址减去首地址+手动搬运的



  • @zr 不好意思没看懂,我这边接收到的数据是不定长,不定内容的。常规的MCU都会有接口返回当前DMA接收位置偏移量,咱们这个怎么定位?



  • @乒乒乓乒兵乓乒
    void uart1_isr(void)
    {
    uint8_t uart_id = __UART_INT_GET_ID(Uart1_handle.UARTx);
    printf("%02x\r\n",uart_id);
    if(uart_id == INT_INDEX_RX_TOUT )
    {
    uint32_t BACK_uart_rec_len = DMA->Channels[DMA_Chan0_Handle.Channel].CTL2.BLOCK_TS;
    printf("len = %d\r\n",BACK_uart_rec_len);
    uint32_t cur_des = DMA->Channels[0].DAR;
    uint8_t *write_des = (uint8_t *)cur_des;
    uint32_t finish_size = cur_des - (uint32_t)&RxBuf[0];
    while (Uart1_handle.UARTx->LSR.LSR_BIT.DR)
    {
    *write_des++ = Uart1_handle.UARTx->DATA_DLL.DATA;
    finish_size++;
    }
    printf("finish_size is %d \r\n",finish_size);
    dma_start_IT(&DMA_Chan0_Handle, (uint32_t)RxBuf, (uint32_t)&Uart1_handle.UARTx->DATA_DLL.DATA, sizeof(RxBuf), DMA_BURST_LEN_16);
    printf("Received %d bytes:\n", finish_size);
    for (int i = 0; i < finish_size; i++)
    {
    printf("%x ", RxBuf[i]);
    if ((i + 1) % 16 == 0)
    printf("\n");
    }
    printf("\r\n");
    }
    }

    你可以先看下这个代码