STM32串行通信DMA的使用

发布时间:2026/7/10 7:41:14
STM32串行通信DMA的使用 STM32串行通信DMA的使用1. 配置2. 代码1. 配置简单说发送端Memory地址自增打开发送模式Normal接收端地址自增关闭这里每次接收并处理1字节接收模式Normal2. 代码如果使用 printf 函数需要更改发送函数使用函数HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)#ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #define GETCHAR_PROTOTYPE int __io_getchar(FILE *f) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #define GETCHAR_PROTOTYPE int fgetc(FILE *f) #endif /* __GNUC__ */ PUTCHAR_PROTOTYPE { // HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, 0xFFFF); HAL_UART_Transmit_DMA(huart1, (uint8_t *)ch, 1); return ch; } GETCHAR_PROTOTYPE { uint8_t ch 0; // HAL_UART_Receive(huart1,(uint8_t *)ch, 1, 0xFFFF); HAL_UART_Receive_DMA(huart1,(uint8_t *)ch, 1); if (ch \r) { __io_putchar(\r); ch \n; } return __io_putchar(ch); }回调函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart-Instance USART1) // 判断串口 { HAL_UART_Transmit(huart1,aRxBuffer_1,1,100); // 返回数据 // HAL_UART_Receive_IT(huart1,aRxBuffer_1,1); // 使能串口1接收中断 // Normal模式DMA传输一次就停止必须再次开启才能收下一字节 HAL_UART_Receive_DMA(huart1, aRxBuffer_1, 1); } }发送接收函数HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)