[研电赛技术支持] USBFS/HS Firmware Library User Guide

[复制链接]
4923|76
 楼主| 和下土 发表于 2020-11-28 23:50 | 显示全部楼层
 楼主| 和下土 发表于 2020-11-28 23:56 | 显示全部楼层
基本的配置流程是在基本传输的配置流程基础上添加相关不连续传输的配置,包括传输数
据量 n,地址跳转偏移,不连续传输使能,以及选定源地址不连续还是目的地址不连续。
可以直接调用 DMA_NonSeqInit 函数实现不连续传输的配置。
 楼主| 和下土 发表于 2020-11-28 23:56 | 显示全部楼层
 楼主| 和下土 发表于 2020-11-28 23:57 | 显示全部楼层
重复传输
该传输可以指定数量的数据后,源地址或目标地址将回到初始配置的地址。当一段指定
ram 或者连续几个寄存器与存储器之间的数据交换,可选择重复传输模式。
重复传输的具体样例可以参照 DDL 的 DMA 模块样例 dmac_repeat。
基本的配置流程是在基本传输的配置流程基础上添加相关重复传输的配置,包括重复数据
量 n,重复传输使能,以及选定源地址重复还是目的地址重复。可以直接调用
DMA_RepeatInit 函数实现不连续传输的配置
 楼主| 和下土 发表于 2020-11-28 23:58 | 显示全部楼层
 楼主| 和下土 发表于 2020-11-28 23:58 | 显示全部楼层
连锁传输
该传输当一个描述符的最后一次传输结束时,LLP 指定的下一个描述符将被从存储器中载
入通道配置寄存器。等待下一次传输请求输入,开始新描述符的第一次传输。或者根据寄
存器 DMA_CHxCTLx.LLPRUN 的设置,在载入新描述符后直接开始第一次传输。
 楼主| 和下土 发表于 2020-11-28 23:59 | 显示全部楼层
连锁传输的具体样例可以参照 DDL 的 DMA 模块样例 dmac_link_list_pointer
 楼主| 和下土 发表于 2020-11-29 11:36 | 显示全部楼层
 楼主| 和下土 发表于 2020-11-29 11:38 | 显示全部楼层
传输提前终止
传输过程中通道使能寄存器 DMA_CHEN.CHENx 保持有效,非连锁传输时,数据控制寄
存器 DMA_DTCTLx 设定的传输次数完成后自动置为无效,连锁传输时,最后一次传输的
传输次数完成后自动置为无效。传输过程中如果软件写 DMA_CHENCLR.CHENCLRx 为
1,则 DMA 将在完成当次数据读写后终止传输。
 楼主| 和下土 发表于 2020-11-29 11:43 | 显示全部楼层
4 样例代码
4.1 代码介绍
用户可根据上述的工作流程编写自己的代码来学习验证该模块,也可以直接通过华大半导体的
网站下载到设备驱动库(Device Driver Library, DDL)的样例代码并使用其中的 DMA 的样例
进行验证
 楼主| 和下土 发表于 2020-11-29 11:43 | 显示全部楼层
以下部分简要介绍本 AN 基于 DDL 的 DMA 模块样例 dmac_base 代码所涉及的各项配置。
1) 初始化 LED
  1. /* Initialize LED */
  2. LedInit();
 楼主| 和下土 发表于 2020-11-29 11:44 | 显示全部楼层
使能 DMA 外设时钟:CLK_FcgPeriphClockCmd(CLK_FCG_DMA, Enable);
 楼主| 和下土 发表于 2020-11-29 11:44 | 显示全部楼层
初始化 DMA 配置:
  1. /* Config DMA */
  2. stcDmaChCfg.u32DataWidth = DMA_DATAWIDTH_32BIT;
  3. stcDmaChCfg.u32BlockSize = DMA_BLKSIZE;
  4. stcDmaChCfg.u32TransferCnt = DMA_TRNCNT;
  5. stcDmaChCfg.u32SrcAddr = (uint32_t)(&u32SrcBuf[0]);
  6. stcDmaChCfg.u32DesAddr = (uint32_t)(&u32DstBuf[0]);
  7. stcDmaChCfg.u32SrcInc = DMA_SRCADDRINC_INC;
  8. stcDmaChCfg.u32DesInc = DMA_DESADDRINC_INC;
  9. DMA_ChannelCfg(DMA_CH, &stcDmaChCfg);
 楼主| 和下土 发表于 2020-11-29 11:45 | 显示全部楼层
使能 DMA 及其通
  1. /* Enable DMA. */
  2. DMA_Cmd(Enable);
  3. /* Enable DMA channel0. */
  4. DMA_ChannelCmd(DMA_CH ,Enable);
道:
 楼主| 和下土 发表于 2020-11-29 11:46 | 显示全部楼层
设置 DMA 触发源:
  1. /* Enable AOS clock */
  2. CLK_FcgPeriphClockCmd(CLK_FCG_AOS, Enable);
  3. /* Set DMA trigger source */
  4. DMA_SetTriggerSrc(DMA_CH, EVT_AOS_STRG);AOS_SW_Trigger();
 楼主| 和下土 发表于 2020-11-29 11:47 | 显示全部楼层
比较 DMA 源、目标缓存数据:
  1. u8CmpRet = memcmp(u32DstBuf, u32ExpectDstBufData, sizeof(u32DstBuf));
  2. if(0 == u8CmpRet)
  3. {
  4. LED_G_ON(); /* Meet the expected */
  5. }
  6. else
  7. {
  8. LED_R_ON(); /* Don't meet the expected */
  9. }
 楼主| 和下土 发表于 2020-11-29 11:48 | 显示全部楼层
代码运行
用户可以通过华大半导体的网站下载到 HC32M120 的 DDL 的样例代码(dmac_base),并配
合评估用板(EV-HC32M120-LQFP48-050-V1.1)运行相关代码学习使用 DMA 模块。
 楼主| 和下土 发表于 2020-11-29 11:48 | 显示全部楼层
以下部分主要介绍如何在评估板上运行 DMA 样例代码并观察结果:
- 确认安装正确的 IAR EWARM v7.7 工具(请从 IAR 官方网站下载相应的安装包,并参考用
户手册进行安装)。
- 从华大半导体网站下载 HC32M120 DDL 代码。
 楼主| 和下土 发表于 2020-11-29 11:49 | 显示全部楼层
- 下载并运行 dmac\ dmac_base\中的工程文件:
1) 打开 dmac_base\工程,并打开‘main.c’如下视图:
 楼主| 和下土 发表于 2020-11-29 11:49 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部