0

我正在使用 STM_HAL 库实现 UART-DMA,我想知道消息大小是由硬件计算的(例如计算时钟滴答直到线路空闲)还是通过某种程序方法(类似 strlen)。所以如果Size

HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) 

由硬件计算,我可以以纯 HEX 格式发送数据,但如果它是通过类似的方式计算的,如果数据是并且必须以 ASCII 格式发送数据strline,我可能会收到问题。0x00

我试图在 Keil 中对生成的代码进行一些研究但失败了(也许我没有足够努力)所以也许有人可以帮助我。

4

1 回答 1

1

如果您使用的是UART DMA,它是由硬件计算的。

如果您检查HAL_UARTEx_RxEventCallback使用 ide 的调用层次结构,您可以看到 Size 变量是如何计算的。

该函数按以下流程执行。(根据HAL Driver的版本,可能会略有不同)

  1. UART 空闲中断发生
  2. 称呼HAL_UART_IRQHandler()
  3. 如果启用了 DMA 模块,则调用HAL_UARTEx_RxEventCallback(huart, (huart->RxXferSize - huart->RxXferCount))

因此,Size变量计算为(huart->RxXferSize - huart->RxXferCount)

  • huart->RxXferSize是初始化 RX DMA 时的设定值。
  • huart->RxXferCount(huart->hdmarx)->Instance->NDTR

NDTR 是硬件计算出来的值,是 DMA 将数据传输到内存后剩余的缓冲区大小!!

于 2022-02-01T18:34:26.333 回答