UART-DMA

目录

  • CubeMX配置
    • UART
    • DMA
    • 其他
  • 思路框架
  • 核心代码
  • 实验结果

CubeMX配置

UART

  • 波特率:115200bps
  • 字长:8Bits(including Parity)
  • 校验位:无
  • 停止位:1

配置截图
UART.png

DMA

  • DMA1-Stream0
    • 外设目标UART1-TX
    • 方向Memory-to-Peripheral
    • 优先级Medium
    • 模式Circle
  • DMA2-Stream0
    • 外设目标UART1-RX
    • 方向Peripheral-to-Memory
    • 优先级Medium
    • 模式Circle

在使用H7系列的时候要注意!

使用DMA传输时要注意总线域和存储器间的访问问题,否则会直接卡死
集体参看前面的一篇专门讨论H7的文章

TX-DMA.png

RX-DMA.png

其他

时钟树配置(外部时钟源)

ClockTree.png


思路框架

  • 开一个6字节缓存

前4个是数据字符,后两个是”\r\n”换行符

  • 开启DMA循环接收模式(循环长度4)
  • 开启DMA循环发送模式(循环长度6)

这样就可以实现重复读取串口数据放在缓存区的前4个字节空间,不影响最后的两个换行符


核心代码

主函数

1
2
3
char uartCache[6] = "JRY!\r\n"; //缓存
HAL_UART_Receive_DMA(&huart1,(uint8_t *)uartCache,4); //DMA接收开启
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)uartCache,6); //DMA发送开启

自定义传输完成回调函数操作

1
2
3
4
5
6
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
if(huart == &huart1)
{ //实现示意灯反转
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
}
}

附:UART-DMA中断回调函数接口

1
2
3
4
__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart); //传输完成回调
__weak void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart); //传输一半回调
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); //接收完成回调
__weak void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart); //接收一半回调

实验结果

  • 系统刚启动,循环输出初始字符

起始输出.png

  • 写入1

写1.png

  • 再写入23

写23.png

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2022-2023 RY.J
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信