查看: 7089|回复: 10

PSoC3 FirstTouch Starter Kit 之DMA输出正弦波

[复制链接]
  • TA的每日心情
    奋斗
    2018-8-29 20:40
  • 签到天数: 1341 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2012-10-16 20:19:46 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 wangku001wei 于 2012-10-16 20:23 编辑

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

    clock的设置
    QQ截图20121016020451.jpg
    QQ截图20121016020502.jpg
    DMA组件的设置
    QQ截图20121016020514.jpg
    VDAC8组件的设置
    QQ截图20121016020521.jpg
    输出引脚的设置
    QQ截图20121016020527.jpg
    QQ截图20121016020531.jpg
    管教分配
    QQ截图20121016020547.jpg


    由于使用的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 就可以直接用这两宏定义

    实际输出的波形
    IMG_4491.JPG
    可以看出频率比用定时器中断控制的准确的多了

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

    上传调试好的代码
    Create1.0 的工程
    myDMA-1.0.rar (729.18 KB, 下载次数: 13)
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-9-28 10:10
  • 签到天数: 1018 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2012-10-16 20:51:22 | 显示全部楼层
    恭喜教程完结!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-8-29 20:40
  • 签到天数: 1341 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2012-10-16 21:02:40 | 显示全部楼层
    powerdruy 发表于 2012-10-16 20:57
    大神,帮我瞧瞧PrISM模块该如何使用咯,两个输出的相位感觉总是相反的啊

    这是个什么模块 我在Create 1.0 里面没找到啊
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-8-29 20:40
  • 签到天数: 1341 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2012-10-16 21:39:59 | 显示全部楼层
    powerdruy 发表于 2012-10-16 21:37
    Creator2.0里有

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-8-29 20:40
  • 签到天数: 1341 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2012-10-16 21:41:33 | 显示全部楼层
    powerdruy 发表于 2012-10-16 21:37
    Creator2.0里有

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-11-4 19:13
  • 签到天数: 281 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2012-10-16 23:23:34 | 显示全部楼层
    恭喜,楼主用下来觉得psoc怎么样?

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-8-29 20:40
  • 签到天数: 1341 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2012-10-16 23:37:09 | 显示全部楼层
    小鸟愤怒 发表于 2012-10-16 23:23
    恭喜,楼主用下来觉得psoc怎么样?

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    2013-5-19 08:32
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2013-5-22 20:25:09 | 显示全部楼层
    想请教一下楼主,我想把用外部的DAC芯片,怎样将DMA的数据传到IO端口上?那个目的地址是啥?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-8-29 20:40
  • 签到天数: 1341 天

    连续签到: 1 天

    [LV.10]以坛为家III

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

    这个 我给忘了 貌似不是用的DMA吧
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2013-5-19 08:32
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2013-5-23 08:18:44 | 显示全部楼层
    wangku001wei 发表于 2013-5-22 22:38
    这个 我给忘了 貌似不是用的DMA吧

    DMA是把正弦表中的数据传到ADC芯片中
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-4-28 18:17 , Processed in 0.207842 second(s), 33 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.