25、USART 的 DMA 模式

 

     在上一篇中介绍了 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            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值