STM32HAL库学习之路(四):DMA方式实现串口数据收发

我使用的串口3进行调试

(一)、DMA方式:

在主存储器和外设之间开辟直接的数据通道,可以进行基本的数据通道,可以进行基本上不需要CPU接入的内存和外设之间的信息传递,这样不仅保证了CPU的高效率也保证了高速外设的需要,一般串口我们不推荐使用DMA方式进行串口数据的收发,因为DMA的优先级是远高于中断和不同的串口收发的。当开有多个串口工作时可能会由于优先级的问题使得其他串口的工作任务被抢占而无法是正常工作。

(二)、DMA方式所用到的HAL库函数

//发送数据
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData,
uint16_t Size, uint32_t Timeout);
//接收数据
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData,
uint16_t Size, uint32_t Timeout);
//发送中断
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *
pData, uint16_t Size);
//接收中断
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData
, uint16_t Size);
//使用DMA发送
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *
pData, uint16_t Size);
//使用DMA接收
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *
pData, uint16_t Size);
//DMA暂停
HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart);
//DMA恢复
HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart);
//DMA停止
HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart);
//串口回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

(三)、示例代码

#define UART3_DMA
uint8_t IRMA[]={"Welcome to UART3_DMA
"};//示例字符串,用来验证是否进入串口DMA
uint8_t MData;//串口3接受到的数据
#ifdef UART3_DMA
    HAL_UART_Transmit_DMA(&huart3,&IRMA,sizeof(IRMA));
    HAL_UART_Receive(&huart3, &MData, 1,0xff);//触发DMA方式串口收发,使用0xff降低DMA的发送速度
#endif
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

#ifdef UART3_DMA
  HAL_UART_Transmit(&huart3, &MData, 1,0xff);
  HAL_UART_Receive_DMA(&huart3, &MData,1);
#endif
}
经验分享 程序员 微信小程序 职场和发展