HAL_UARTEx_RxEventCallback() 循环DMA:数据是什么地址?
HAL_UARTEx_RxEventCallback() circular DMA: What address is the data?
我将 HAL 与 STM32F3xx 一起使用,通过 循环 DMA 实现 UART 接收。数据应该不断地接收到 huart->pRxBuffPtr
缓冲区,当新数据到达时覆盖旧数据,并且定期调用 HAL_UARTEx_RxEventCallback()
函数以在数据被覆盖之前复制出数据。 HAL_UARTEx_RxEventCallback()
函数接收一个 size
参数,当然还有一个指针 huart
,但没有直接指示新到达的数据在 huart->pRxBuffPtr
中的 DMA 位置。
我如何知道 huart->pRxBuffPtr
新到达的数据开始的位置?
感谢 Tom V 的提示。对于后代,这里是解决方案代码 - returns true 并获取下一个可用字节的函数,否则 returns false:
bool uart_receiveByte(uint8_t *pData) {
static size_t dmaTail = 0u;
bool isByteReceived = false;
// dmaHead is the next position in the buffer the DMA will write to.
// dmaTail is the next position in the buffer to be read from.
const size_t dmaHead = huart->RxXferSize - huart->hdmarx->Instance->CNDTR;
if (dmaTail != dmaHead) {
isByteReceived = true;
*pData = pRxDmaBuffer[dmaTail];
if (++dmaTail >= huart->RxXferSize) {
dmaTail = 0u;
}
}
return isByteReceived;
}
我将 HAL 与 STM32F3xx 一起使用,通过 循环 DMA 实现 UART 接收。数据应该不断地接收到 huart->pRxBuffPtr
缓冲区,当新数据到达时覆盖旧数据,并且定期调用 HAL_UARTEx_RxEventCallback()
函数以在数据被覆盖之前复制出数据。 HAL_UARTEx_RxEventCallback()
函数接收一个 size
参数,当然还有一个指针 huart
,但没有直接指示新到达的数据在 huart->pRxBuffPtr
中的 DMA 位置。
我如何知道 huart->pRxBuffPtr
新到达的数据开始的位置?
感谢 Tom V 的提示。对于后代,这里是解决方案代码 - returns true 并获取下一个可用字节的函数,否则 returns false:
bool uart_receiveByte(uint8_t *pData) {
static size_t dmaTail = 0u;
bool isByteReceived = false;
// dmaHead is the next position in the buffer the DMA will write to.
// dmaTail is the next position in the buffer to be read from.
const size_t dmaHead = huart->RxXferSize - huart->hdmarx->Instance->CNDTR;
if (dmaTail != dmaHead) {
isByteReceived = true;
*pData = pRxDmaBuffer[dmaTail];
if (++dmaTail >= huart->RxXferSize) {
dmaTail = 0u;
}
}
return isByteReceived;
}