DMAC也可以和外设进行数据交互。之前我们曾使用PDC进行USART的数据回显,这次就使用DMAC完成相同的工作。而且由于DMAC有内部的缓冲区,实现起来更为简单。

一、 USART设置

因为之前已经做过相关的实验,这里不再重复。需要注意的是,要注意JP11的跳线,以选择正确的协议(RS232)。另外,如果使用硬件握手协议的话,注意设置PC端串口通信软件的线路控制信号

另外,由于不再使用手动的缓冲区和PDC,所以不需要进行相关的设置。同时,也不用再使用USART的接收超时功能。

二、 DMAC设置

本次使用的通道依然为通道0:

#define DMAC_CH 0
  1. 启用DMAC:

    // 代码略...
  2. 设置DSCR为0,以进行单次传输:

    DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_DSCR = 0;
  3. 设置SADDR以及DADDR。

    因为数据都在US_RHR和US_THR的低位上,所以将源地址和目标地址分别设为这两个寄存器的地址即可。

    DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_SADDR = &(USART1->US_RHR);
    DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_DADDR = &(USART1->US_THR);
  4. 设置CTRLA和CTRLB。

    在USART数据位为8位时,一次传输一个字节即可。

    DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CTRLA =DMAC_CTRLA_BTSIZE(16)      // 进行16次传输| DMAC_CTRLA_SRC_WIDTH_BYTE   // 一次传输一个字节| DMAC_CTRLA_DST_WIDTH_BYTE  // 同上;
    DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CTRLB =DMAC_CTRLB_FC_PER2PER_DMA_FC //外设至外设的传输| DMAC_CTRLB_SRC_INCR_FIXED   // 传输时源地址固定| DMAC_CTRLB_DST_INCR_FIXED  // 传输时目标地址固定;
  5. 设置CFG寄存器。

    因为DMAC和USART1之间有硬件握手接口,所以这里使用硬件握手接口即可(否则需要使用软件握手接口手动触发传输)。USART1的发送接口号为5,接收接口号为6:

    由于需要尽快将DMAC内部缓冲区的内容传输出去,所以一旦其数据量可以发送,就发送出去。

    DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CFG = DMAC_CFG_SRC_H2SEL_HW // 使用硬件握手| DMAC_CFG_DST_H2SEL_HW| DMAC_CFG_SRC_PER(6)       // 接口号| DMAC_CFG_DST_PER(5)| DMAC_CFG_SOD_DISABLE| DMAC_CFG_FIFOCFG_ASAP_CFG    // 尽快发送数据;
  6. 启用中断。

    在传输任务完成后,需要重新启用通道,以重新开始任务。

    DMAC->DMAC_CHER = DMAC_CHER_ENA0 << DMAC_CH;
    // NVIC中断设置的代码略...
  7. 中断处理。

    在中断中重新设置CTRLA寄存器的BTSIZE字段,再启用通道即可。

    void DMAC_Handler(void)
    {uint32_t status = DMAC->DMAC_EBCISR;// 判断是否为指定中断if (status & (DMAC_EBCISR_CBTC0 << DMAC_CH)){// 设置 CTRLADMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CTRLA &=~(uint32_t)DMAC_CTRLA_BTSIZE_Msk;DMAC->DMAC_CH_NUM[DMAC_CH].DMAC_CTRLA |= DMAC_CTRLA_BTSIZE(16);// 再次启用通道DMAC->DMAC_CHER = DMAC_CHER_ENA0 << DMAC_CH;}
    }

转载于:https://www.cnblogs.com/h46incon/p/3505400.html

SAM4E单片机之旅——21、DMAC之USART回显相关推荐

  1. SAM4E单片机之旅——13、LCD之ASF初步

    在Atmel Studio 6中,集成了Atmel Software Framework(ASF框架).通过它提供的库,可以很快速地完成新的项目. 这次的最终目标使用ASF在LCD上显示出文字&quo ...

  2. SAM4E单片机之旅——10、UART与MCK之PLL

    为使用更更高的波特率,则需要更更高的外设时钟的频率.这个时候就需要用到锁相环(PLL)了.锁相环可以对输入的时钟进行分频.升频后进行输出.MCK可以使用的锁相环为PLLA,而PLLA的输入时钟为MAI ...

  3. Linux 之旅 21:编译安装软件

    Linux 之旅 21:编译安装软件 图源:pexcel 开源软件的安装与升级 可执行文件 通常,源代码只有被编译成二进制的可执行文件后才能在操作系统上被用户直接运行,比如: [icexmoon@xy ...

  4. 单片机c语言中io取反,单片机小白学步(21) IO口:基本的LED和按键操作

    原标题:单片机小白学步(21) IO口:基本的LED和按键操作 本篇我们先介绍最基础的几个IO口操作.学完本篇,大家要能自己独立完成下面几个实验. 1.点亮 2.一个按键控制LED,按下灯亮,释放灯灭 ...

  5. 从51开始的单片机之旅(一)----流水灯、矩形键盘、电子时钟

    说一下个人的学习经历 我做过的项目: 今天先把当初做的89E51总结出来 先说下89E51 一.流水灯.数码管 二.矩阵键盘,蜂鸣器和电子时钟 结语: 说一下个人的学习经历 我是大二开始进入学校电子设 ...

  6. 从51开始的单片机之旅(二)----LCD1602液晶、ADC0809、DAC0832

    说在前面 上篇已经把流水灯.矩形键盘.电子时钟已经总结完了,今天来总结89E51的LCD1602液晶.ADC0809.DAC0832的相关内容 说在前面 一.基本原理介绍 二.原器件介绍 三.设计及接 ...

  7. [Nodejs学习之旅2-1] 模块机制

    CommonJs规范 在介绍Nodejs的模块机制之前,我们得先了解一下CommonJS规范.因为Node应用是由模块组合而成,像我们经常会用到的underscore.loadash.axios等都是 ...

  8. 弹性法计算方法的mck法_SAM4E单片机之旅——9、UART与MCK之MAINCK

    为得到更高的带宽,需要使用更高的波特率.UART波特率的计算已经介绍过了,现在就尝试下调整外设的时钟频率.可以有多种方法调整外设时钟(MCK)的频率,这里先介绍先主要时钟(MAINCK)的设置,其中包 ...

  9. 小黑星巴克冰镇浓缩leetcode之旅:21. 合并两个有序链表

    小黑的答案 # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): ...

  10. Python学习之旅-21

    一.try-except 有时候我们写程序的时候,会出现一些错误或异常,导致程序终止.例如,做除法时,除数为0,会引起一个ZeroDivisionError 例子: a=10 b=0 c=a/b pr ...

最新文章

  1. Java 事件适配器 Adapter
  2. 模p加法和模p乘法学习
  3. 解决布线困难的小方法-----无线路由器变身交换机
  4. 用WinZip Pro创建Zip文件
  5. python项目需求文档模板_Python+docxtpl+plotly实现模板word文档图表生成
  6. google退出中国市场是战略性错误
  7. Python 小练习_battleship
  8. 数字孪生|成熟度评价
  9. 变速器 美国sram速联和日本shimano洗马路对比
  10. 如果你有想珍惜的人,一定要送TA这个礼物!绝美又有内涵
  11. 【图像识别】【读论文】模式识别方法概论模式识别及其在图像处理中的应用
  12. 万科又出新招,小市民只有看热闹的份
  13. 全国计算机二级c++上机试题.cpp,计算机二级考试C++上机考试试题
  14. CLion下开发OpenGL项目,忘记进入glad.c文件造成的问题
  15. Java中当被除数比除数小时为什么计算结果都为0?
  16. 新手版-如何在win10上运行ie9(ps:如何在win10上运行win7系统)
  17. CSS设置多张网络图片垂直居中展示
  18. 美团2018校招笔试
  19. getshell.php,PHPYUN设计缺陷导致轻易Getshell
  20. 【Day4】语音识别(音频转文字)

热门文章

  1. 添加企业微信免验证设置
  2. 前端自动化测试 之 视觉测试
  3. 驱动里面如何操作regulator
  4. HTML|颜色的设置方法
  5. 前方荆棘遍地,愿砥砺前行
  6. “蔚来杯“2022牛客暑期多校训练营5 A题: Don‘t Starve
  7. 搜索计算机文件夹的记录怎么删除,Win7如何删除“我的电脑”搜索栏里面的搜索记录...
  8. 【Python百日进阶-Web开发-Feffery】Day344 - fac数据展示02:AntdBadge徽标数
  9. C++Primer Excise Ch1
  10. 西电数据挖掘实验3——复杂网络社团检测