DMA UART 缓冲区指针

DMA UART Buffer pointer

我正在使用 STM32F4 通过 DMA UART 从 FPGA 接收数据(现在它仅中继来自 PC 的数据)。 DMA UART 正常工作,但它只能在 UART 的缓冲区半满或满时发出中断。问题是我想知道我是否在缓冲区中获得了新数据而不是一半或全部。

简而言之,我正在寻找一个寄存器,它指向 UART 的下一个字节应该进入 DMA 缓冲区的位置。有没有人知道这样的寄存器。

谢谢!

我试图查找您的部分,但只找到了营销页面。要得到你想要的,禁用 DMA。 DMA 的目的是减轻中断负载,如果您的 cpu 跟不上中断速率,也许可以维持线速流。由于您需要中断以进行通知,因此 DMA 有点毫无意义。更糟糕的是,它让您看不到中断。

通常 US?ART 有一个板载 fifo,它可以在一定程度上降低中断率,同时让您与突发事件的开始或任何您的目的同步。

您使用 HAL 吗? 我们使用此代码来了解我们收到了多少字节:

UART_HandleTypeDef              *pHandleUart;
(...)
static uint8_t Uart_RxBufferPointerCheck(void)
{
    uint8_t returnValue = 0;

    rxUartBuffer.last = ( (uint16_t)UART_MAX_BUFFER_LENGTH - Uart_Dma_GetPeripheralNumberOfData() );

    if ( rxUartBuffer.last >= rxUartBuffer.first )
    {
        returnValue = 1;
    }

    return ( returnValue );
}

static uint16_t Uart_Dma_GetPeripheralNumberOfData(void)
{
    return (uint16_t) pHandleUart->hdmarx->Instance->NDTR;
}   

rxUartBuffer.first 在我们读取这些字节时被修改。 此代码适用于 F7 uC,希望它也适用于 F4。

DMA 有一个 CNDTR 寄存器(注意它是倒计时的)

感谢您的帮助,我找到了我要找的东西。

uint32_t bytesRx DMA1_Stream1->NDTR;

UART_HandleTypeDef huart3;
uint32_t bytesRx = huart3.hdmarx->Instance->NDTR;

它们都用于查找已接收的字节数,观察 NDTR 倒计时。

一种方法是轮询并检查串行 Rx 缓冲区的数据,或者检查 hdmarx->Instance->CNDTR 的值(如果缓冲区大小的默认值发生变化) .

第二个选项是使用 IDLE 中断来了解是否接收到数据,这可以通过在 HAL_UART_IRQHandler[=11 中添加几行来完成=]

if((__HAL_UART_GET_IT(huart, UART_IT_IDLE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_IDLE) != RESET))
{ 
    __HAL_UART_CLEAR_IT(huart, UART_CLEAR_IDLEF);
}