智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1937|回复: 9
打印 上一主题 下一主题

dma求助!

[复制链接]

4

主题

98

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5053
威望
2274
贡献
1463
兑换币
1510
注册时间
2012-10-13
在线时间
658 小时
毕业学校
北京理工大学
跳转到指定楼层
1#
发表于 2013-12-22 08:28:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hghgsdsd 于 2013-12-22 08:29 编辑

LZ大四了,帮大三学弟折腾下DMA,看到好多人都是用的OV7620摄像头,请问5116不能用吗?貌似5116没有PCLK触发源是吗?那用其他触发源可以吗?这两天试了PWM触发但就是传不出数字来.......请问下不论用什么触发源都需要对触发源做相应配置吧?比如GPIO的话要设置DMA模式、上升沿触发之类的......另外常触发源的使用有什么注意事项吗?
以下是LZ所用的代码:

//头文件
#include "includes.h"
#include <MATH.h>


//主函数
void main(void)
{
    DisableInterrupts;     //禁止总中断

    pllinit200M();     //设置系统频率为200MHz
    Modules_Initialization();
    DMA_init();
   //4 开中断
    EnableInterrupts;

    //主循环
    while(1)
   {
        BoRead();   
    //    RampTest();

        if(ccd_m())
        {
             xy_XY();
             drawline();
             arctan();
             Get_sangle();
             Fuzzy();
             control();
             speed_control();
        }

       if( BoStop==0x00 )  // 不检测
       {

       }
       else
       {
            if( pp > (150 + 20 + (2*BoStop+8)*60 ) )//if( pp > (150 + 20 + (2*BoStop+8)*60 ) )
                Arrival();
       }
   }

}
void DMA_init(void)
{
          SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK | SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK | SIM_SCGC5_PORTE_MASK;

          SIM_SCGC6|=SIM_SCGC6_DMAMUX_MASK;//打开DMA多路复用器时钟
          SIM_SCGC7|=SIM_SCGC7_DMA_MASK;//打开DMA模块时钟
          DMAMUX_CHCFG0=DMAMUX_CHCFG_SOURCE(58);//DMA通道 0对应 49 号 DMA请求,即 PORTA
          DMA_TCD0_CITER_ELINKNO=DMA_CITER_ELINKNO_CITER(10);//  当前主循环次数 ,采集 点数
          DMA_TCD0_BITER_ELINKNO=DMA_BITER_ELINKNO_BITER(10);// 起始主循环次数,采 起始主循环次数,采 起始主循环次数,采 起始主循环次数,采 起始主循环次数,采 起始主循环次数,采 起始主循环次数,采 起始主循环次数,采 起始主循环次数,采 集点数
          DMA_TCD0_SADDR=(uint32)&test2[0];// 设置源地址 GPIO 口, PORTD
          DMA_TCD0_SOFF=0;//每次传送源地址不变
          DMA_TCD0_NBYTES_MLNO=DMA_NBYTES_MLNO_NBYTES(1);//每次读取一字节
          DMA_TCD0_SLAST=0;//主循环结束后源地址不变
          DMA_TCD0_DLASTSGA=0;// 主循环结束后目的地址不调整,自动指向下一行数组第一个元素
          DMA_TCD0_DADDR=(uint8)test2;// 设置目的地址video数组第一个元素
          DMA_TCD0_DOFF=1;// 每次写目的地址加 1
          DMA_TCD0_ATTR=DMA_ATTR_SSIZE(0)+DMA_ATTR_DSIZE(0);// 源数据 8bit   目的数据8bit
          DMA_TCD0_CSR=DMA_CSR_DREQ_MASK;//主循环结束后停止硬件请求
          DMA_TCD0_CSR|=DMA_CSR_INTMAJOR_MASK;
          DMAMUX_CHCFG0|=DMAMUX_CHCFG_ENBL_MASK;//DMA通道 0使能



}
void Interrupt_row(void)//行中断
{
     int16 a;

     FTM2_C1SC &= (~FTM_CnSC_CHIE_MASK);  //关行中断
     FTM2_C1SC &=(~FTM_CnSC_CHF_MASK); //清除行中断标志位
     ii++;
   
        if(kk<ROW_MAX)       //防止数组越界
        {   if(ii==sample[kk])//ii为有效采样行时进行采样操作,否则跳过
            {   


                flag_tixian=0;
                a=180;     //174会读到行消隐区  175前面的会读到行消隐区180     
                while(a>0) { a--;}             //延时,跳过行消隐区,以便完全采集视频信号
                   test[0]=GPIOD_PDIR;
               


                kk++;

             DMA_INT|=DMA_INT_INT0_MASK;

            }
        }


}


void Interrupt_chang(void)//场中断
{   
     DisableInterrupts; //禁止总中断
     FTM0_C2SC &= ~FTM_CnSC_CHIE_MASK;  //关场中断
     FTM0_C2SC &=(~FTM_CnSC_CHF_MASK); //清除场中断标志位
    // gpio_reverse (PORTA, 15);


    DMA_init();
     FTM0_C1SC &=(~FTM_CnSC_CHF_MASK); //清除行中断标志位
     FTM2_C1SC |= FTM_CnSC_CHIE_MASK;   //开行同步中断
     FTM0_C2SC |= FTM_CnSC_CHIE_MASK;  //开场中断
     EnableInterrupts;  //开总中断
}



另:
能帮助LZ解决DMA问题的车友,LZ承诺提供十字弯的处理方法(视情况可提供代码或详细的讲解),以下为处理的结果:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

0

主题

14

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1832
威望
908
贡献
586
兑换币
559
注册时间
2011-11-14
在线时间
169 小时
2#
发表于 2013-12-22 11:46:02 | 只看该作者
who are you ?   lmy??
回复 支持 反对

使用道具 举报

11

主题

568

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4803

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章

QQ
威望
2487
贡献
1300
兑换币
1449
注册时间
2013-9-12
在线时间
508 小时
3#
发表于 2013-12-22 15:01:18 | 只看该作者
路径不错
回复 支持 反对

使用道具 举报

1

主题

52

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3931
威望
1780
贡献
1097
兑换币
836
注册时间
2012-3-17
在线时间
527 小时
4#
发表于 2013-12-23 20:21:36 | 只看该作者
论坛里有人发过PWM触发的DMA,搜搜找找吧!
回复 支持 反对

使用道具 举报

6

主题

152

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3996
威望
1744
贡献
1104
兑换币
1159
注册时间
2013-10-21
在线时间
574 小时
5#
发表于 2014-2-10 18:46:43 | 只看该作者
这个要设置一下触发void DMA_PORT_Init(PTxn ptxn,DMA_PORT_cfg cfg)                       //DMA端口设置
{

    SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK << (ptxn>>5));                                                               //开启PORTx端口
    GPIO_PDDR_REG(GPIOx[(ptxn>>5)]) &= ~(1 << (ptxn & 0x1f));                                                       //设置端口方向为输入
    PORT_PCR_REG(PORTX[(ptxn>>5)], (ptxn & 0x1F)) = ( 0
            | PORT_PCR_MUX(1)               // 复用GPIO
            | PORT_PCR_IRQC(cfg & 0x03 )    // 确定触发模式
            | ((cfg & 0xc0 ) >> 6)          // 开启上拉或下拉电阻,或者没有
                                                    );
    GPIO_PDDR_REG(GPIOx[(ptxn>>5)]) &= ~(1 << (ptxn && 0x1F));                                                      //输入模式
}
这个是我根据野火库改的
回复 支持 反对

使用道具 举报

6

主题

152

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3996
威望
1744
贡献
1104
兑换币
1159
注册时间
2013-10-21
在线时间
574 小时
6#
发表于 2014-2-10 18:48:32 | 只看该作者
typedef enum DMA_PORT_cfg
{
    DMA_rising          = 0x01u,            //上升沿触发
    DMA_falling         = 0x02u,            //下降沿触发
    DMA_either          = 0x03u,            //跳变沿触发

    //用最高两位标志上拉和下拉
    DMA_rising_down     = 0x81u,            //上升沿触发,源地址IO端口内部下拉
    DMA_falling_down    = 0x82u,            //下降沿触发,源地址IO端口内部下拉
    DMA_either_down     = 0x83u,            //跳变沿触发,源地址IO端口内部下拉

    DMA_rising_up       = 0xc1u,            //上升沿触发,源地址IO端口内部上拉
    DMA_falling_up      = 0xc2u,            //下降沿触发,源地址IO端口内部上拉
    DMA_either_up       = 0xc3u,            //跳变沿触发,源地址IO端口内部上拉

    //用位6来标志,传输结束后,目的地址保持不变,不恢复成原来地址
    DMA_rising_keepon          = 0x21u,     //上升沿触发                      ,目的地址保持不变
    DMA_falling_keepon         = 0x22u,     //下降沿触发                      ,目的地址保持不变
    DMA_either_keepon          = 0x23u,     //跳变沿触发                      ,目的地址保持不变

    DMA_rising_down_keepon     = 0xA1u,     //上升沿触发,源地址IO端口内部下拉,目的地址保持不变
    DMA_falling_down_keepon    = 0xA2u,     //下降沿触发,源地址IO端口内部下拉,目的地址保持不变
    DMA_either_down_keepon     = 0xA3u,     //跳变沿触发,源地址IO端口内部下拉,目的地址保持不变

    DMA_rising_up_keepon       = 0xF1u,     //上升沿触发,源地址IO端口内部上拉,目的地址保持不变
    DMA_falling_up_keepon      = 0xF2u,     //下降沿触发,源地址IO端口内部上拉,目的地址保持不变
    DMA_either_up_keepon       = 0xF3u,     //跳变沿触发,源地址IO端口内部上拉,目的地址保持不变

} DMA_PORT_cfg, DMA_Count_cfg;
回复 支持 反对

使用道具 举报

6

主题

152

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3996
威望
1744
贡献
1104
兑换币
1159
注册时间
2013-10-21
在线时间
574 小时
7#
发表于 2014-2-10 18:48:42 | 只看该作者
/****************初始化DMA传输*********************/
void DMA_init()
{      
        DMA_PORT_Init(PTB20,DMA_rising);//DMA端口设置
        SIM_SCGC7|=SIM_SCGC7_DMA_MASK;//打开DMA模块时钟
        SIM_SCGC6|=SIM_SCGC6_DMAMUX_MASK;//打开DMA多路复用器时钟
        DMAMUX_CHCFG0=DMAMUX_CHCFG_SOURCE(50);//DMA通道0对应51号DMA请求,即PORTB
        DMA_TCD0_CITER_ELINKNO=DMA_CITER_ELINKNO_CITER(1);//当前主循环次数,采集点数
        DMA_TCD0_BITER_ELINKNO=DMA_BITER_ELINKNO_BITER(1);//起始主循环次数,采集点数
        DMA_TCD0_SADDR=(uint32_t)&LPTMR0_CNR;                          //设置源地址GPIO口,PORTC
        DMA_TCD0_SOFF=0;                                             //每次传送源地址不变
        DMA_TCD0_NBYTES_MLNO=DMA_NBYTES_MLNO_NBYTES(1);              //每次读取一字节
        DMA_TCD0_SLAST=0;                                             //主循环结束后源地址0回写tcd
        DMA_TCD0_DLASTSGA=0;//主循环结束后目的地址0回写tcd
        DMA_TCD0_DADDR=(uint32_t)Image_Buf;//设置目的地址,video数组第一个元素
        DMA_TCD0_DOFF=1;//每次写目的地址加1
        DMA_TCD0_ATTR=DMA_ATTR_SSIZE(0)+DMA_ATTR_DSIZE(0);//源数据宽度8bit,目的数据宽度8bit使能AD0采集DMA_CSR_DREQ
        DMA_ERQ|=DMA_ERQ_ERQ0_MASK;//使能通道0硬件DMA请求
        DMAMUX_CHCFG0|=DMAMUX_CHCFG_ENBL_MASK;//DMA通道0使能
}
回复 支持 反对

使用道具 举报

6

主题

152

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3996
威望
1744
贡献
1104
兑换币
1159
注册时间
2013-10-21
在线时间
574 小时
8#
发表于 2014-2-10 18:50:19 | 只看该作者
实测可用
回复 支持 反对

使用道具 举报

6

主题

618

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6491
威望
3362
贡献
527
兑换币
2332
注册时间
2013-8-31
在线时间
1301 小时
9#
发表于 2014-4-23 21:58:53 | 只看该作者
wojiaohaomi 发表于 2014-2-10 18:48
/****************初始化DMA传输*********************/
void DMA_init()
{      

哈哈哈,搜到你的代码了。
回复 支持 反对

使用道具 举报

6

主题

618

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6491
威望
3362
贡献
527
兑换币
2332
注册时间
2013-8-31
在线时间
1301 小时
10#
发表于 2014-4-23 21:59:31 | 只看该作者
allenanswerzq 发表于 2014-4-23 21:58
哈哈哈,搜到你的代码了。

太漂亮了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-5 22:49 , Processed in 0.085912 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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