智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2271|回复: 5
打印 上一主题 下一主题

想用DMA定时触发采集模拟摄像头二值化后的数据········

[复制链接]

7

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
威望
217
贡献
99
兑换币
121
注册时间
2013-6-1
在线时间
36 小时
毕业学校
燕山大学
跳转到指定楼层
1#
发表于 2013-11-13 21:02:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天想用PIT触发k60的DMA,k60上的是eDMA,不知道哪个寄存器能设置PITn与DMAn通道的映射,还是他们之间的映射是固定的,比如PIT0就对应channal0 ,1对1,2对2,3对3额·····






59

主题

1029

帖子

0

精华

版主

有什么需帮助的?

Rank: 9Rank: 9Rank: 9

积分
15187

热心会员奖章论坛元老奖章优秀会员奖章在线王奖章

威望
11108
贡献
1419
兑换币
1728
注册时间
2011-12-18
在线时间
1330 小时
2#
发表于 2013-11-14 10:00:22 | 只看该作者
首先你要使能DMAMUX中的周期触发功能,DMAMUX->CHCFG[x] |= DMAMUX_CHCFG_TRIG_MASK
才能用PIT定时作为DMA的触发源,默认是PIT0~3对应DMA的前4个通道。
使用LPLD的固件库的话,直接在DMA配置时使能初期触发就行。
调用DMA_PeriodicTriggerEnable = TRUE;
回复 支持 反对

使用道具 举报

7

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
威望
217
贡献
99
兑换币
121
注册时间
2013-6-1
在线时间
36 小时
毕业学校
燕山大学
3#
 楼主| 发表于 2013-11-14 13:36:08 | 只看该作者
洋葱圈 发表于 2013-11-14 10:00
首先你要使能DMAMUX中的周期触发功能,DMAMUX->CHCFG[x] |= DMAMUX_CHCFG_TRIG_MASK
才能用PIT定时作为DMA ...

我用的是PIT0然后也已经初始化了~想用它触发DMA0,我有个疑问~~数据手册上说PIT在它计数值到0的时候,会产生一个DMA触发脉冲,能产生一个中断,那这个触发的脉冲和中断是一起产生的吗? 我的DMA 肿么也进不了中断·····

SIM_SCGC7 |= SIM_SCGC7_DMA_MASK;                        //打开DMA模块时钟
    SIM_SCGC6 |= SIM_SCGC6_DMAMUX_MASK;                     //打开DMA多路复用器时钟
    DMAMUX_CHCFG_REG(DMAMUX_BASE_PTR, CHn) = (0
            | DMAMUX_CHCFG_ENBL_MASK                        /* Enable routing of DMA request */
            | DMAMUX_CHCFG_TRIG_MASK                        /* Trigger Mode: Periodic   PIT周期触发传输模式   通道1对应PIT1,必须使能PIT1,且配置相应的PIT定时触发 */
            //| DMAMUX_CHCFG_SOURCE((ptxn >> 5) + DMA_Port_A) /* 通道触发传输源:     */
                                             );



    /* 配置 DMA 通道 的 传输控制块 TCD ( Transfer Control Descriptor ) */
    DMA_SADDR(CHn) =    (u32)SADDR;                         // 设置  源地址
    DMA_DADDR(CHn) =    (u32)DADDR;                         // 设置目的地址

    DMA_SOFF(CHn)  =     0;                              // 设置源地址偏移 = 0x0, 即不变
    DMA_DOFF(CHn)  =     BYTEs;                              // 每次传输后,目的地址加 BYTEs

    DMA_ATTR(CHn)  =    0;

    DMA_CITER_ELINKNO(CHn)  = DMA_CITER_ELINKNO_CITER(count); //当前主循环次数
    DMA_BITER_ELINKNO(CHn)  = DMA_BITER_ELINKYES_BITER(count);//起始主循环次数

    DMA_CSR(CHn)=0;                             //csr  active位清零
    DMA_CR = 2;                            // CR[EMLM] = 0禁止副循环映射,调试模式下继续运行

    //当CR[EMLM] = 0 时:
    DMA_NBYTES_MLNO(CHn) =   DMA_NBYTES_MLNO_NBYTES(BYTEs); // 通道每次传输字节数,这里设置为BYTEs个字节。注:值为0表示传输4GB */


    /* 配置 DMA 传输结束后的操作 */
    DMA_SLAST(CHn)      =   0;                              //调整  源地址的附加值,主循环结束后恢复  源地址
    DMA_DLAST_SGA(CHn)  =   -1; //调整目的地址的附加值,主循环结束后恢复目的地址或者保持地址
    DMA_CSR(CHn)        =   (0
                             | DMA_CSR_DREQ_MASK            //主循环结束后停止硬件请求
                             | DMA_CSR_INTMAJOR_MASK        //主循环结束后产生中断
                            );





/*  配置输入源   */
    SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK << ((((u32)SADDR) & 0x1ff)>>6));             //开启PORTx端口
    switch(byten)
    {
    case DMA_BYTE1:
        *((u8 *)((u32)SADDR + 4)) = 0;   //设置为输入方向。为什么加4?PDIR地址加4后,就变成对应的PDDR地址
        break;
    case DMA_BYTE2:
        *((u16 *)((u32)SADDR + 4)) = 0;
        break;
    case DMA_BYTE4:
        *((u32 *)((u32)SADDR + 4)) = 0;
        break;
    default:
        assert_failed(__FILE__, __LINE__);
        break;
    }

    /*  输入源管脚选择功能脚  */
    n = (u8)(((u32)SADDR - ((u32)(&PTA_BYTE0_IN))) & 0x3f);         //最小的引脚号
    tmp = n + (BYTEs << 3);                                         //最大的引脚号
    for(i = n; i < tmp; i++)
    {
        PORT_PCR_REG(PORTX[   ((((u32)SADDR)&0x1ff)>>6)    ], i) = (0
                | PORT_PCR_MUX(1)
                | GPI_DOWN             //输入源应该下拉,默认读取到的是0
                      );
    }

//   DMA_EN(DMA_CHn);

     DMA_ERQ |= (DMA_ERQ_ERQ0_MASK<<(CHn)) ;
     enable_irq((CHn) + 0);                              //允许DMA通道传输




求大神~~~~~please
回复 支持 反对

使用道具 举报

59

主题

1029

帖子

0

精华

版主

有什么需帮助的?

Rank: 9Rank: 9Rank: 9

积分
15187

热心会员奖章论坛元老奖章优秀会员奖章在线王奖章

威望
11108
贡献
1419
兑换币
1728
注册时间
2011-12-18
在线时间
1330 小时
4#
发表于 2013-11-14 14:22:51 | 只看该作者
使用PIT做触发源就不必使能PIT中断了,你可以用库函数来编程试试,LPLD各驱动库之间的耦合性很低,你可以进行分别配置。
回复 支持 反对

使用道具 举报

7

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
388
威望
217
贡献
99
兑换币
121
注册时间
2013-6-1
在线时间
36 小时
毕业学校
燕山大学
5#
 楼主| 发表于 2013-11-14 15:22:16 | 只看该作者
额,我把中断使能屏蔽了也是进不去~~~伤心的说·······额,我用LPLD的库试试吧
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

高级会员

Rank: 4

积分
501
威望
246
贡献
145
兑换币
155
注册时间
2013-11-3
在线时间
55 小时
6#
发表于 2014-4-14 17:25:47 | 只看该作者
楼主这个问题解决了吗?数据手册是什么手册,能发一份看看不
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2025-1-7 22:43 , Processed in 0.054707 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表