我使用STM32F4使用DMA UART从FPGA接收数据(现在只能从PC中继数据)。 DMA UART正常工作,但它只能在UART的缓冲区半满或满时发出中断。问题是我想知道我是否在缓冲区中获得了新数据,而不是它的一半或全部。
简而言之,我正在寻找一个寄存器,它指向UART的下一个字节应该进入DMA缓冲区的位置。有没有人知道这样的寄存器。
谢谢!
答案 0 :(得分:0)
DMA有一个CNDTR寄存器(请注意它倒计时)
答案 1 :(得分:0)
感谢您的帮助,我找到了我想要的东西。
uint32_t bytesRx DMA1_Stream1->NDTR;
和
UART_HandleTypeDef huart3;
uint32_t bytesRx = huart3.hdmarx->Instance->NDTR;
它们都用于查找已接收的字节数,观察NDTR
倒计时。
答案 2 :(得分: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);
}
答案 3 :(得分:-1)
我试图查看你的部分,但只找到了营销页面。要获得所需内容,请禁用DMA。 DMA的目的是减少中断负载,如果你的cpu无法跟上中断速率,可能会维持一个线速流。由于您希望通知中断,因此DMA非常无意义。更糟糕的是,它让你看不到中断。
经常使用US?ART有一个板载fifo,可以稍微减轻中断率,同时让你与爆发的开始或任何目的同步。
答案 4 :(得分:-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。