智能车制作

标题: DMA问题 [打印本页]

作者: 武靖    时间: 2014-2-13 15:44
标题: DMA问题
    User_Def_DMA_Init.Channelx          =DMA_CH1;               //设置为通道1
    User_Def_DMA_Init.Peri_DmaReq       =PORTC_DMAREQ;          //IO C 产生DMA请求
    User_Def_DMA_Init.Minor_loop_Length =H;                     //主循环次数
    User_Def_DMA_Init.Source_Addr       =(uint32_t)&GPIOD_PDIR; //设置源地址
    User_Def_DMA_Init.Dest_Addr         =(uint32_t)Pix_Data;    //目的地址为Pix_Data的首地址
    User_Def_DMA_Init.Dma_irqc          =1;                     //采集结束触发中断
    User_Def_DMA_Init.isr_func          =dma1_isr;              //自定义通道1中断服务子程序
DMA为什么触发不了中断子程序


作者: wojiaohaomi    时间: 2014-2-13 16:20
本帖最后由 wojiaohaomi 于 2014-2-13 16:29 编辑

这个要设置一下触发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));                                                      //输入模式
}


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;
/****************初始化DMA传输*********************/
void DMA_init()
{      
        DMA_PORT_Init(PTC20,DMA_rising);//DMA端口设置
        SIM_SCGC7|=SIM_SCGC7_DMA_MASK;//打开DMA模块时钟
        SIM_SCGC6|=SIM_SCGC6_DMAMUX_MASK;//打开DMA多路复用器时钟
        DMAMUX_CHCFG0=DMAMUX_CHCFG_SOURCE(51);//DMA通道0对应51号DMA请求,即PORTC
        DMA_TCD0_CITER_ELINKNO=DMA_CITER_ELINKNO_CITER(1);//当前主循环次数,采集点数
        DMA_TCD0_BITER_ELINKNO=DMA_BITER_ELINKNO_BITER(1);//起始主循环次数,采集点数
        DMA_TCD0_SADDR=(uint32_t)&GPIOD_PDIR ;                          //设置源地址GPIO口,GPIOD_PDIR
        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使能

没有dma中断,自己加

作者: wojiaohaomi    时间: 2014-2-13 16:22
试试这个代码吧,我触发成功了的。加油!
作者: 武靖    时间: 2014-2-13 17:00
wojiaohaomi 发表于 2014-2-13 16:22
试试这个代码吧,我触发成功了的。加油!

这是什么库,我用的拉普兰德V2库,不知道一样不一样,这个是在哪里设置的?

作者: wojiaohaomi    时间: 2014-2-13 18:08
这个是野火修改后的




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2