我正在使用STM32F4使用DMA UART从FPGA接收数据(现在它只能从PC中继数据)。 DMA UART正常工作,但它只能在UART的缓冲区半满或满时发出中断。问题是我想知道我是否在缓冲区中获得了新数据,而不是它的一半或全部。
总之,我正在寻找一个寄存器,它指向UART的下一个字节应该进入DMA缓冲区的位置。有没有人知道这样的寄存器。
谢谢!
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中添加几行来完成
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);
}
我试图查看你的部分,但只找到营销页面。要获得所需内容,请禁用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。