sky-Hawk where 发表于 2012-10-16 20:19:46

PSoC3 FirstTouch Starter Kit 之DMA输出正弦波

本帖最后由 wangku001wei 于 2012-10-16 20:23 编辑

首先看原理图

该程序使用了一个clock,一个DMA,一个VDAC8,一个模拟端口
DMA组件使用硬件触发方式控制DMA传输 DMA传输方向 从RAM 到 外设
clock用于控制传输的快慢
由于一个DMA的 数据操作描述符最大可以支持127个字节,我们这次开辟的保存正选波的数组为100个字节大小
如果我们要使得输出波形的频率为1k,则clcok的频率应该为100*1k = 100k

clock的设置


DMA组件的设置

VDAC8组件的设置

输出引脚的设置


管教分配



由于使用的create1.0没有DMA配置向导用于自动生成DMA的代码 只好自己写相关的代码,create2.0程序就可以自动生成,只需要copy就行了
说明 TD,即 Transaction Descriptor,数据操作描述符

配置DMA的代码
#define DMA_BYTES_PER_BURST 1
#define DMA_REQUEST_PER_BURST 1
#define CYDEV_PERIPH_BASE CYDEV_CLKDIST_BASE
#define DMA_DST_BASE (CYDEV_PERIPH_BASE)
#define VDAC8_Data_PTR    ((reg8 *) VDAC8_viDAC8__D )   
uint8 sinArray;
uint8 Configure_DMA(void)
{
reg8 * RegPointer;

RegPointer = (reg8 *)sinArray;    // 获得数组地址

DMA_ADC_Chan = DMA_DmaInitialize(DMA_BYTES_PER_BURST,   // 每次触发传输1个字节
   DMA_REQUEST_PER_BURST, // 每次传输都必须有触发才能进行
   HI16((uint32)RegPointer),   // 源地址高16位
   HI16(DMA_DST_BASE));      // 目标地址低16位

CyDmaTdSetConfiguration(DMA_ADC_TD,      
    100,                            // 总共传输100个字节
    DMA_ADC_TD,             //TD 链中下一个传输描述符的索引, 依然为本次的DMA_ADC_TD,表明循环进行
    TD_INC_SRC_ADR);    //源地址每次递增
      
CyDmaTdSetAddress(DMA_ADC_TD,   
   LO16((uint32)RegPointer),                  // 源地址低16位
   LO16((uint32)VDAC8_Data_PTR));      // 目标地址低16位

CyDmaChSetInitialTd(DMA_ADC_Chan, DMA_ADC_TD);

CyDmaChEnable(DMA_ADC_Chan, 1);   // 参数1 表示 TD 完成后DMAC 将恢复 TD 的原始配置值。

}

主函数的代码很简单
uint8 sinArray =
{
127,134,142,150,158,166,173,181,188,195,201,207,213,219,224,229,
234,238,241,245,247,250,251,252,253,253,253,252,251,250,247,245,
241,238,234,229,224,219,213,207,201,195,188,181,173,166,158,150,
142,134,126,119,111,103, 95, 87, 80, 72, 65, 58, 52, 46, 40, 34,
29, 24, 19, 15, 12,8,6,3,2,1,0,0,0,1,2,3,
   6,8, 12, 15, 19, 24, 29, 34, 40, 46, 52, 58, 65, 72, 80, 87,
95,103,111,119
};


extern uint8 timerflag;
uint8 DMA_ADC_Chan;
uint8 DMA_ADC_TD;
uint8 Configure_DMA(void);
uint8 Start_DMA_ADC(void);

void main()
{
      uint8 count = 0;
      uint8 timercount = 0;

      VDAC8_Start();
      
      Configure_DMA();
      
      CYGlobalIntEnable;
      while(1);
}


对于create1.0 而言,需要额外注意的是,编译环境没有自动提供,CYDEV_PERIPH_BASE 和 VDAC8_Data_PTR   的定义
因此需要手工进行宏定义
#define CYDEV_PERIPH_BASE CYDEV_CLKDIST_BASE
#define VDAC8_Data_PTR    ((reg8 *) VDAC8_viDAC8__D )
而create2.0 就可以直接用这两宏定义

实际输出的波形

可以看出频率比用定时器中断控制的准确的多了

其实在调试的时候也出了很多麻烦的事情,比如说之前说的宏定义,死活不对,一怒之下直接在别的电脑上又装了个Create2.0 ,记得选择完全安装,然后板子就能识别USB驱动
仔细对比了之前从21ic的赛普拉斯论坛上下到的正弦波的例子查找不一致的地方

上传调试好的代码
Create1.0 的工程


Create 2.0的工程


赛普拉斯论坛上 PSoC小子 的工程 create 2.0 工程
原链接
http://bbs.21ic.com/viewthread.php?tid=311265&highlight=


这次 我也加一句
转载请注明出处 谢谢


Go_for_it 发表于 2013-5-23 08:52:24

wangku001wei 发表于 2013-5-22 22:38 static/image/common/back.gif
这个 我给忘了 貌似不是用的DMA吧

不知道楼主帮分析一下,DAM传送的IO口的目的地址是多少?

Go_for_it 发表于 2013-5-23 08:18:44

wangku001wei 发表于 2013-5-22 22:38 static/image/common/back.gif
这个 我给忘了 貌似不是用的DMA吧

DMA是把正弦表中的数据传到ADC点点taptap安卓中:lol

w932443004 发表于 2013-5-22 22:38:44

海日生明月 发表于 2013-5-22 20:25 static/image/common/back.gif
想请教一下楼主,我想把用外部的DAC点点taptap安卓,怎样将DMA的数据传到IO端口上?那个目的地址是啥? ...

这个 我给忘了 貌似不是用的DMA吧

Go_for_it 发表于 2013-5-22 20:25:09

想请教一下楼主,我想把用外部的DAC点点taptap安卓,怎样将DMA的数据传到IO端口上?那个目的地址是啥?:)

sky-Hawk where 发表于 2012-10-16 23:37:09

小鸟愤怒 发表于 2012-10-16 23:23 static/image/common/back.gif
恭喜,楼主用下来觉得psoc怎么样?

PS:感谢楼主的分享,持续写完一系列教程,真心不容易的,衷心感谢 ...

我觉得挺好用的 尤其是Create 2.0 比Create 1.0 编译下载速度都快多了
但是目前学的不是很深入,只能利用较简单的模块
而且内部的好多机制还不懂

sky-Hawk where 发表于 2012-10-16 23:23:34

:lol恭喜,楼主用下来觉得psoc怎么样?

PS:感谢楼主的分享,持续写完一系列教程,真心不容易的,衷心感谢:loveliness:

sky-Hawk where 发表于 2012-10-16 21:41:33

powerdruy 发表于 2012-10-16 21:37 static/image/common/back.gif
Creator2.0里有

那个我不想换成Create2.0啊 你给我发个英文原版的文档吧 就是你双击组件配置 左下角出现的文档 中午的没给例子 我觉得可能是你的 Pulse Type 设置可能有问题吧

sky-Hawk where 发表于 2012-10-16 21:39:59

powerdruy 发表于 2012-10-16 21:37 static/image/common/back.gif
Creator2.0里有

那个我不想换成Create2.0啊 你给我发个英文原版的文档吧 就是你双击组件配置 左下角出现的文档 中午的没给例子 我觉得可能是你的 Pulse Type 设置可能有问题吧

sky-Hawk where 发表于 2012-10-16 21:02:40

powerdruy 发表于 2012-10-16 20:57 static/image/common/back.gif
大神,帮我瞧瞧PrISM模块该如何使用咯,两个输出的相位感觉总是相反的啊

这是个什么模块 我在Create 1.0 里面没找到啊

sky-Hawk where 发表于 2012-10-16 20:51:22

恭喜教程完结!!!
页: [1] 2
查看完整版本: PSoC3 FirstTouch Starter Kit 之DMA输出正弦波

Baidu
map