亿加合和智能车制作

标题: 野火K60库DMA脉冲采集问题 [打印本页]

作者: GordonFreeman    时间: 2013-4-10 23:30
标题: 野火K60库DMA脉冲采集问题
遇到一个棘手的问题想要请教火哥,我准备给车加上编码器,用DMA脉冲计数,先用FTM1_CH0输出PWM波,用PTC5做DMA_CH5脉冲计数触发源,PIT0定时采集,测试正常。然后我仍用用FTM1_CH0输出PWM波,用PTC5做DMA_CH5脉冲计数触发源,但加上了摄像头DMA采集程序,PTB19接PCLK作为触发源,用DMA_CH4通道,源地址为PTC_BYTE1_IN,即PTC8~15,此时DMA脉冲计数再也记不出数了,用livewatch查看count值一直为0,这是怎么回事???

作者: GordonFreeman    时间: 2013-4-10 23:38
摄像头DMA采集初始化
DMA_PORTx2BUFF_Init(DMA_CH4, (void *)&PTC_BYTE1_IN, Pix_Data, PTB19, DMA_BYTE1, COLUMN, DMA_rising_keepon);
脉冲计数初始化
DMA_count_Init(DMA_CH5,PTC5,0x80,DMA_rising);  
作者: 野火    时间: 2013-4-11 10:15
DMA 模块,通道是有优先权,摄像头驱动已经占用了 通道了 ,所以DMA 脉冲计数不能继续

可以等摄像头采集后,再启动DMA脉冲计数,然后在处理数据的时候进行脉冲计数,定时测量脉冲。即分时复用那样


作者: GordonFreeman    时间: 2013-4-11 12:17
我尝试使用PTD口做脉冲计数触发引脚,发现PTD口好多都好使
作者: GordonFreeman    时间: 2013-4-11 12:21
我试过PTA8和PTC5,都无法读出脉冲数
作者: GordonFreeman    时间: 2013-4-11 19:22
又有问题了,我用PD0口触发,通道为DMA_CH5好使,通道换成DMA_CH3就不行了
作者: GordonFreeman    时间: 2013-4-11 19:34
好吧,我错了,改成DMA_CH3后忘记改中断服务函数了,CH3是好使的,但是PTC5还是读不到
作者: w4540025    时间: 2013-11-28 02:05
野火 发表于 2013-4-11 10:15
DMA 模块,通道是有优先权,摄像头驱动已经占用了 通道了 ,所以DMA 脉冲计数不能继续

可以等摄像头采集 ...

野火大哥  我想问一下   在用DMA采集两路脉冲的时候   会不会有干扰或者先后顺序

作者: TuTuready    时间: 2014-3-18 22:18
野火 发表于 2013-4-11 10:15
DMA 模块,通道是有优先权,摄像头驱动已经占用了 通道了 ,所以DMA 脉冲计数不能继续

可以等摄像头采集 ...

火哥,能不能同时用两路 DMA来采脉冲呀?  困扰了好久了,我看DMA_count_Init()里面的源地址和目的地址,用的是一个固定地址呀,我修改了几次还是不好使,火哥,麻烦解答一下,万分感谢!有同样问题的可以交流一下  453926744  谢谢了 问题困扰好久了

作者: 小猴子    时间: 2014-3-26 10:48
楼主问题解决吗?希望能够贴点程序给我

作者: 擦肩的阳光    时间: 2015-4-21 19:36
TuTuready 发表于 2014-3-18 22:18
火哥,能不能同时用两路 DMA来采脉冲呀?  困扰了好久了,我看DMA_count_Init()里面的源地址和目的地址 ...

貌似是两路频率的叠加呢。

作者: yandld    时间: 2015-7-4 15:47
人家官方早就把这个问题写的很明白了
作者: 初学的菜鸟    时间: 2016-3-11 16:22
怎么用DMA脉冲计数,求楼主指点
作者: 剑指苍天11    时间: 2016-5-18 20:43
野火 发表于 2013-4-11 10:15
DMA 模块,通道是有优先权,摄像头驱动已经占用了 通道了 ,所以DMA 脉冲计数不能继续

可以等摄像头采集 ...

我的用PTc5计数值为0,能否说一下具体怎么用,这是我的库
void DMA_count_Init(DMA_CHn CHn, PTxn ptxn, u32 count, DMA_Count_cfg cfg)
{
    u8 byten = DMA_BYTE1;
    u8 BYTEs = (byten == DMA_BYTE1 ? 1 : (byten == DMA_BYTE2 ? 2 : (byten == DMA_BYTE4 ? 4 : 16 ) ) ); //计算传输字节数
    if(count > 0x7FFF )count = 0x7FFF;
    count_init[CHn] = count;

    /* 开启时钟 */
    SIM_SCGC7 |= SIM_SCGC7_DMA_MASK;                        //打开DMA模块时钟
    SIM_SCGC6 |= SIM_SCGC6_DMAMUX_MASK;                     //打开DMA多路复用器时钟

    /* 配置 DMA 通道 的 传输控制块 TCD ( Transfer Control Descriptor ) */
    DMA_SADDR(CHn) =    (u32)COUNTSADDR;                    // 设置  源地址
    DMA_DADDR(CHn) =    (u32)COUNTDADDR;                    // 设置目的地址
    DMA_SOFF(CHn)  =    0;                                  // 设置源地址不变
    DMA_DOFF(CHn)  =    0;                                  // 每次传输后,目的地址不变

    DMA_ATTR(CHn)  =    (0
                         | DMA_ATTR_SMOD(0x0)                // 源地址模数禁止  Source address modulo feature is disabled
                         | DMA_ATTR_SSIZE(byten)             // 源数据位宽 :DMA_BYTEn  。    SSIZE = 0 -> 8-bit ,SSIZE = 1 -> 16-bit ,SSIZE = 2 -> 32-bit ,SSIZE = 4 -> 16-byte
                         | DMA_ATTR_DMOD(0x0)                // 目标地址模数禁止
                         | DMA_ATTR_DSIZE(byten)             // 目标数据位宽 :DMA_BYTEn  。  设置参考  SSIZE
                        );

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

    DMA_CR &= ~DMA_CR_EMLM_MASK;                            // CR[EMLM] = 0

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

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

    /* 配置 DMA 触发源 */
    DMAMUX_CHCFG_REG(DMAMUX_BASE_PTR, CHn) = (0
            | DMAMUX_CHCFG_ENBL_MASK                        /* Enable routing of DMA request */
            | DMAMUX_CHCFG_SOURCE((ptxn >> 5) + DMA_Port_A) /* 通道触发传输源:     */
                                             );

    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));                                                      //输入模式

    /* 开启中断 */
    DMA_EN(CHn);                                    //使能通道CHn 硬件请求
    DMA_IRQ_EN(CHn);                                //允许DMA通道传输
}







欢迎光临 亿加合和智能车制作 (http://www.znczz.com/) Powered by Discuz! X3.2