在上一篇中介绍了 ringbuffer 方式去实现串口收发数据的无阻塞。这里介绍另外一种实现方式 - DMA 模
式,个人感觉使用 DMA 方式在接收数据时不仅更为方便,解析帧协议更为准确(尤其是不定长帧协议),而且占
用 CPU 资源也更小。在 ringbuffer 方式下,收发数据都是基于中断实现的,因此在大数据量进行传输时,频繁
的进中断会导致系统的性能急剧下降。使用 DMA 模式在整个收发过程中只有当所有数据完成发送时才产生中断,因
此效率大大提高。在解析帧协议方面,这里充分利用了帧与帧之间的间隙,因为在实际传输中,一帧数据是连续的,
但是帧与帧之间是有间隙的,也就是存在着总线的空闲。这里利用了 STM32 的串口总线空闲中断去判断一帧的结
束,从而也实现了不定长帧的解析。
1、USART DMA 初始化
#include "includes.h"
/* 驱动层接收配置双缓冲 */
static uint8_t debug_rxBuffer[128];
static void debug_usart_nvic_init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd