DMA UART缓冲区指针

问题描述 投票:0回答:5

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

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

谢谢!

c microcontroller stm32 hal stm32f4
5个回答
0
投票

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


0
投票

谢谢你的帮助,我找到了我想要的东西。

uint32_t bytesRx DMA1_Stream1->NDTR;

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

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


0
投票

一种方法是轮询和检查串行Rx缓冲区的数据,或检查hdmarx-> Instance-> CNDTR的值,如果从缓冲区大小的默认值更改。

第二种选择是使用IDLE中断来知道是否收到数据,这可以通过在HAL_UART_IRQHandler中添加几行来完成

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);
}

-1
投票

我试图查看你的部分,但只找到营销页面。要获得所需内容,请禁用DMA。 DMA的目的是减少中断负载,如果你的cpu无法跟上中断速率,可能会维持一个线速流。由于您希望通知中断,因此DMA是无意义的。更糟糕的是,它让你看不到中断。

通常是US?ART有一个板载fifo,可以稍微减轻中断率,同时让你与爆发的开始或任何你的目的同步。


-1
投票

你使用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。

© www.soinside.com 2019 - 2024. All rights reserved.