注册 登录
查看: 473|回复: 10

这是摄像头DMA传输例程的bug吗?

[复制链接]
发表于 2014-12-11 22:53:15 | 显示全部楼层 |阅读模式
void ov7725_eagle_vsync(void)
{

    //场中断需要判断是场结束还是场开始
    if(ov7725_eagle_img_flag == IMG_START)                   //需要开始采集图像
    {
        ov7725_eagle_img_flag = IMG_GATHER;                  //标记图像采集中
        disable_irq(PORTA_IRQn);

        DMA_EN(CAMERA_DMA_CH);                  //使能通道CHn 硬件请求
        DMA_DADDR(CAMERA_DMA_CH) = (uint32)ov7725_eagle_img_buff;    //恢复地址
    }
    else                                        //图像采集错误
    {
        disable_irq(PORTA_IRQn);                        //关闭PTA的中断
        ov7725_eagle_img_flag = IMG_FAIL;                    //标记图像采集失败
    }
}

disable_irq(PORTA_IRQn);//这句已经禁止了PTA口的所有中断,当一帧图像完成,DMA也发生不了中断,所以ov7725_eagle_img_flag这个枚举变量不可能会是IMG_FINISH?
我看很久了,还是不明白,请教

回复

使用道具 举报

发表于 2014-12-11 23:05:23 | 显示全部楼层
while 发表于 2014-12-11 22:53
void ov7725_eagle_vsync(void)
{

关了场中断,还是可以触发DMA中断的啊。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-11 23:08:03 | 显示全部楼层
仰逸致 发表于 2014-12-11 23:05
关了场中断,还是可以触发DMA中断的啊。

我顺这程序读下来的,除了DMA中断使标志位是“成功”外,无其他办法了啊,但是在DMA开启前屏蔽了PTA口的所有中断啊,DMA完成后怎么触发?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-11 23:15:40 | 显示全部楼层
仰逸致 发表于 2014-12-11 23:05
关了场中断,还是可以触发DMA中断的啊。

    //场中断需要判断是场结束还是场开始
    if(ov7725_eagle_img_flag == IMG_START)                   //需要开始采集图像
    {
        ov7725_eagle_img_flag = IMG_GATHER;                  //标记图像采集中
        disable_irq(PORTA_IRQn);

        DMA_EN(CAMERA_DMA_CH);                  //使能通道CHn 硬件请求
        DMA_DADDR(CAMERA_DMA_CH) = (uint32)ov7725_eagle_img_buff;    //恢复地址
    }




主函数开始获取图像,开启了所有中断。设置标志位是"开始,"等待标志位为“成功”,当场中断来了进入上面函数,但是开启DMA前屏蔽了所有中断,是不是应该在屏蔽后再加上DMA_irq-enable()好点》?
回复 支持 反对

使用道具 举报

发表于 2014-12-12 17:04:09 来自手机 | 显示全部楼层
屏蔽的是场中断用的寄存器,不是全部
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-13 15:13:20 | 显示全部楼层
摄像头学渣 发表于 2014-12-12 17:04
屏蔽的是场中断用的寄存器,不是全部

disable_irq(PORTA_IRQn);这个语句不是屏蔽PTA口的所有中断吗,请教一下
回复 支持 反对

使用道具 举报

发表于 2014-12-13 15:35:03 | 显示全部楼层
while 发表于 2014-12-13 15:13
disable_irq(PORTA_IRQn);这个语句不是屏蔽PTA口的所有中断吗,请教一下

仅限PORTA而已,DMA依然会触发的。

点评

例程中DMA通道0初始化用PTA27上升沿作为触发源,PTA27不属于PORT模块的吗?  发表于 2014-12-13 15:42
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-13 15:43:37 | 显示全部楼层
谈丽佳 发表于 2014-12-13 15:35
仅限PORTA而已,DMA依然会触发的。

例程中DMA通道0初始化用PTA27上升沿作为触发源,PTA27不属于PORT模块的吗?
回复 支持 反对

使用道具 举报

发表于 2014-12-13 23:38:21 | 显示全部楼层
while 发表于 2014-12-13 15:43
例程中DMA通道0初始化用PTA27上升沿作为触发源,PTA27不属于PORT模块的吗?

这个不是用PORTA的寄存器触发中断,是由PTA27这个脚触发DMA寄存器工作
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-14 23:16:32 | 显示全部楼层
摄像头学渣 发表于 2014-12-13 23:38
这个不是用PORTA的寄存器触发中断,是由PTA27这个脚触发DMA寄存器工作

懂了,谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则

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