STM32的UART使用DMA操作不要入的坑

  • UART发送:HAL_UART_Transmit_DMA(&huat1,tx_data, 6);在完成各种初始化之后(或者是进入while之前)调用一次这个UART dma发送函数就可以不用管了。
  • 变量“tx_data”是在while()里实时更新的,这个串口dma发送函数不管你"tx_data"有没有更新,只要上一帧数据发送完毕,就接着发下一帧。
  • 所以就有问题了,有时候tx_data更新了一半,就被DMA挪走发送了。就比如说上次计算的值是1,那么 int32_t tx_data=0x0001;这次计算的值是-2,那么tx_data应该=0xFFFE,于是刚更新到0xFF,后面的两个字节“01“还没来得及更新,就被DMA挪走发送,DMA挪走的值就是”0xFF01“,结果在次级的stm32接收端总是经常出现这种特别大的错误值。
  • 为了稳妥,发送的时候不用DMA了,就用HAL_UART_Transmit();

猜你喜欢

转载自blog.csdn.net/aqwtyyh/article/details/106043951