STM32串行通信DMA的使用
- [1. 配置](#1. 配置)
- [2. 代码](#2. 代码)
1. 配置
简单说
- 发送端Memory地址自增打开;
- 发送模式Normal;
- 接收端地址自增关闭,这里每次接收并处理1字节;
- 接收模式Normal;


2. 代码
如果使用 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)