10回答

0收藏

[原创] PSoC3 FirstTouch Starter Kit 之DMA输出正弦波

英飞凌 英飞凌 9094 人阅读 | 10 人回复 | 2012-10-16

本帖最后由 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[100];
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[100] =
{
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 的工程
myDMA-1.0.rar (729.18 KB, 下载次数: 13)


Create 2.0的工程
myDMA-2.0.rar (565.03 KB, 下载次数: 58)


赛普拉斯论坛上 PSoC小子 的工程 create 2.0 工程
原链接
http://bbs.21ic.com/viewthread.php?tid=311265&highlight=
Sine_Generator_Use_DMA.cywrk.Archive01.zip (596.05 KB, 下载次数: 41)


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


分享到:
回复

使用道具 举报

回答|共 10 个

倒序浏览

沙发

小菜儿

发表于 2012-10-16 20:51:22 | 只看该作者

恭喜教程完结!!!
板凳

w932443004

发表于 2012-10-16 21:02:40 | 只看该作者

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

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

w932443004

发表于 2012-10-16 21:39:59 | 只看该作者

powerdruy 发表于 2012-10-16 21:37
Creator2.0里有

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

w932443004

发表于 2012-10-16 21:41:33 | 只看该作者

powerdruy 发表于 2012-10-16 21:37
Creator2.0里有

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

小鸟_愤怒

发表于 2012-10-16 23:23:34 | 只看该作者

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

PS:感谢楼主的分享,持续写完一系列教程,真心不容易的,衷心感谢
静心  简单  认真  专注
7#

w932443004

发表于 2012-10-16 23:37:09 | 只看该作者

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

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

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

Go_for_it

发表于 2013-5-22 20:25:09 | 只看该作者

想请教一下楼主,我想把用外部的DAC芯片,怎样将DMA的数据传到IO端口上?那个目的地址是啥?
9#

w932443004

发表于 2013-5-22 22:38:44 | 只看该作者

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

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

Go_for_it

发表于 2013-5-23 08:18:44 | 只看该作者

wangku001wei 发表于 2013-5-22 22:38
这个 我给忘了 貌似不是用的DMA吧

DMA是把正弦表中的数据传到ADC芯片中
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条