亿加合和智能车制作

标题: @火哥,鹰眼问题求解 [打印本页]

作者: karis    时间: 2013-4-16 18:31
标题: @火哥,鹰眼问题求解
场中断开启行中断,行中断初始化DMA,采集完后,最左边的图像有几列在最右边,[attach]44025[/attach]拍照的时候我是左边白右边黑,结果是这个样子,我设置COM4寄存器的几个级别的速度都是这样的,请问这是为什么,是因为DMA初始化占用的时间太多了吗?
void PORTA_IRQHandler(void)//功  能:PORTA 外部中断服务
{
   u8 i=14;
  if((PORTA->ISFR>>i)==1);
  {
   //if(SampleFlag==0){return;}//不足1场   
    DMA_Init(0,DMA_PORTC,GPIOD_IDR_Addr,(u32)ImageBuf[rowCnt],1,0,0,1,0,1,CAMERA_W/8);
   rowCnt++;
   if(rowCnt >=CAMERA_H)
   {
    rowCnt = 0;
    DMA0->SERQ&=~DMA_SERQ_SERQ(0);  
     LED3=!LED3;LED2=!LED2;
    NVIC_DisableIRQ(PORTA_IRQn);//行
     NVIC_DisableIRQ(PORTB_IRQn);//场
   }
   PORTA->ISFR|=(1<<i);   //清除标志位  
   }      
}
void PORTB_IRQHandler(void)//功  能:PORTB 外部中断服务
{
    u8 i=9;
   if((PORTB->ISFR>>i)==1)
  {
       rowCnt = 0;
     SampleFlag = 1;
     NVIC_EnableIRQ(PORTA_IRQn);//行
     PORTB->ISFR|=(1<<i);   //清除标志位  
  }
      
}

作者: 野火    时间: 2013-4-16 19:15
你好,请用我们最新提供的代码。
不需要用到 行中断
作者: karis    时间: 2013-4-16 19:17
野火 发表于 2013-4-16 19:15
你好,请用我们最新提供的代码。
不需要用到 行中断

我用的KEIL编译的,用场中断会出错,只有用行中断才能出图像,目前图像很清晰,也比较稳定,就是有如上问题,不知道该怎么解决
作者: 野火    时间: 2013-4-16 19:18
karis 发表于 2013-4-16 19:17
我用的KEIL编译的,用场中断会出错,只有用行中断才能出图像,目前图像很清晰,也比较稳定,就是有如上问 ...

为什么会出错?必须要用到场中断,才能稳定的……



作者: karis    时间: 2013-4-16 19:19
野火 发表于 2013-4-16 19:18
为什么会出错?必须要用到场中断,才能稳定的……

场中断信号来了开启行中断使能,行中断信号之后初始化DMA目的地址

作者: 野火    时间: 2013-4-16 19:20
karis 发表于 2013-4-16 19:19
场中断信号来了开启行中断使能,行中断信号之后初始化DMA目的地址

场中断信号来了就直接初始化DMA目的地址,DMA 计数


作者: karis    时间: 2013-4-16 19:21
野火 发表于 2013-4-16 19:20
场中断信号来了就直接初始化DMA目的地址,DMA 计数

我已开始就参考你们的历程这样写的,一直卡死,还不知道为什么,后来我换成现在的方法就这样了
作者: 野火    时间: 2013-4-16 19:25
karis 发表于 2013-4-16 19:21
我已开始就参考你们的历程这样写的,一直卡死,还不知道为什么,后来我换成现在的方法就这样了

我们很早之前提供的DMA例程,有个错误的地方。

DMA_PORTx2BUFF_Init 函数里面


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

应该改成 :


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

后缀会卡在死循环里,你看看是不是这个问题


作者: karis    时间: 2013-4-16 19:28
野火 发表于 2013-4-16 19:25
我们很早之前提供的DMA例程,有个错误的地方。

DMA_PORTx2BUFF_Init 函数里面

额……我没有用你们的DMA底层,可不可能我初始化DMA时间太长了,最后采集到下一行的像素点了?
作者: 野火    时间: 2013-4-16 19:32
karis 发表于 2013-4-16 19:19
场中断信号来了开启行中断使能,行中断信号之后初始化DMA目的地址

直接 场中断信号来了开启行中断使能,初始化DMA目的地址

行中断改成 下降沿 触发


作者: karis    时间: 2013-4-16 19:35
野火 发表于 2013-4-16 19:32
直接 场中断信号来了开启行中断使能,初始化DMA目的地址

行中断改成 下降沿 触发

因为我是开的二维数组,所以我就用行中断来中开启DMA初始化了,我试试下降沿触发
作者: karis    时间: 2013-4-16 19:39
野火 发表于 2013-4-16 19:32
直接 场中断信号来了开启行中断使能,初始化DMA目的地址

行中断改成 下降沿 触发

下降沿触发后,现在是右边的图像到左边了,,,
作者: karis    时间: 2013-4-16 19:40
野火 发表于 2013-4-16 19:32
直接 场中断信号来了开启行中断使能,初始化DMA目的地址

行中断改成 下降沿 触发

火哥,鹰眼是没有消隐信号输出的吧?所以直接场中断可以
作者: 野火    时间: 2013-4-16 19:42
karis 发表于 2013-4-16 19:40
火哥,鹰眼是没有消隐信号输出的吧?所以直接场中断可以

是的

作者: 野火    时间: 2013-4-16 19:44
karis 发表于 2013-4-16 19:39
下降沿触发后,现在是右边的图像到左边了,,,

那我也不清楚原因

作者: karis    时间: 2013-4-16 19:47
野火 发表于 2013-4-16 19:44
那我也不清楚原因

[attach]44028[/attach]刚刚看到鹰眼的介绍,我觉得可以用HSYNC作为行中断触发引脚比较合适,不知道设置那个寄存器
作者: karis    时间: 2013-4-16 19:49
野火 发表于 2013-4-16 19:44
那我也不清楚原因

找到了,是COM10寄存器,你们初始化时0x97,我改成0xD7试试
作者: karis    时间: 2013-4-16 19:57
野火 发表于 2013-4-16 19:44
那我也不清楚原因

行不通,还是老样子,而且图像不稳定了
作者: 野火    时间: 2013-4-16 20:00
karis 发表于 2013-4-16 19:57
行不通,还是老样子,而且图像不稳定了

我还是觉得 ,直接场中断采集,代码会比较稳定。
底层是由你自己写的,我不清楚DMA的配置是否对了,我们的底层是可以稳定采集的


作者: karis    时间: 2013-4-16 20:10
野火 发表于 2013-4-16 20:00
我还是觉得 ,直接场中断采集,代码会比较稳定。
底层是由你自己写的,我不清楚DMA的配置是否对了,我们 ...

恩,我再想想办法,打扰了

作者: karis    时间: 2013-4-17 06:44
野火 发表于 2013-4-16 19:15
你好,请用我们最新提供的代码。
不需要用到 行中断

这么写中断服务函数
void PORTB_IRQHandler(void)//功  能:PORTB 外部中断服务
{
    u8 i=9;
   if((PORTB->ISFR>>i)==1)
  {     
     NVIC_DisableIRQ(PORTB_IRQn);//场
     DMA_Init(0,DMA_PORTC,GPIOD_IDR_Addr,(u32)ImageBuf[0],1,0,0,1,0,1,CAMERA_SIZE);
     LED3=!LED3;LED2=!LED2;
     PORTB->ISFR|=(1<<i);   //清除标志位 参见k10手册241页
     SampleFlag = 1;  
  }     
}
老是跳到HardFault_Handler\,数组越界,看了一晚上都不知道为什么

作者: karis    时间: 2013-4-17 07:31
野火 发表于 2013-4-16 19:42
是的

刚刚那个问题解决了,把ImageBuf【0】改成ImageBuf就没事了,不过现在图像貌似有点问题,不好意思一直在骚扰你

作者: karis    时间: 2013-4-17 09:14
野火 发表于 2013-4-16 19:42
是的

现在是场中断处理有问题,一个图像分为上下两场了,都晕了。
void PORTB_IRQHandler(void)//功  能:PORTB 外部中断服务
{
    u8 i=9;
   if((PORTB->ISFR>>i)==1)
  {         
     DMA0->SERQ|=DMA_SERQ_SERQ(0);
     DMAMUX->CHCFG[0]|=(DMAMUX_CHCFG_ENBL_MASK);
     NVIC_DisableIRQ(PORTB_IRQn);//场
    DMA0->TCD[0].DADDR=DMA_DADDR_DADDR((u32)ImageBuf) ;
     DMA0->SERQ&=~DMA_SERQ_SERQ(0);
     LED3=!LED3;LED2=!LED2;
     PORTB->ISFR|=(1<<i);   //清除标志位
     SampleFlag = 1;  
  }     
}


作者: karis    时间: 2013-4-17 10:53
野火 发表于 2013-4-16 19:42
是的

用行中断,我把DMA的优先级调到最高,不出现行中断错误,只用场中断,无论怎么改变都会出现上下两场,目前图像还有点不稳定,我继续调
作者: 野火    时间: 2013-4-17 16:24
karis 发表于 2013-4-17 10:53
用行中断,我把DMA的优先级调到最高,不出现行中断错误,只用场中断,无论怎么改变都会出现上下两场, ...

调试摄像头的时候,一开始不要用太长的排线,否则出现不稳定情况,就不知道是硬件还是软件问题

作者: 野火    时间: 2013-4-17 16:25
karis 发表于 2013-4-17 09:14
现在是场中断处理有问题,一个图像分为上下两场了,都晕了。
void PORTB_IRQHandler(void)//功  能:POR ...

开场中断前,必须清中断标志位,否则分开两幅图像



作者: karis    时间: 2013-4-18 12:34
野火 发表于 2013-4-17 16:25
开场中断前,必须清中断标志位,否则分开两幅图像

每次场中断结束都清过中断标志的呀
作者: 野火    时间: 2013-4-18 13:34
karis 发表于 2013-4-18 12:34
每次场中断结束都清过中断标志的呀

开中断前 必须 清中断。
结束的时候 ,如果关了中断,那清不清中断也没什么影响


作者: karis    时间: 2013-4-18 20:37
野火 发表于 2013-4-18 13:34
开中断前 必须 清中断。
结束的时候 ,如果关了中断,那清不清中断也没什么影响

好吧,今天跑车的时候跟平衡组的撞了一下,鹰眼坏了,他就这么坏了
作者: 野火    时间: 2013-4-18 22:23
karis 发表于 2013-4-18 20:37
好吧,今天跑车的时候跟平衡组的撞了一下,鹰眼坏了,他就这么坏了

图像不稳定,如何跑车?
坏了,如何坏?现象如何?


作者: karis    时间: 2013-4-19 00:31
野火 发表于 2013-4-18 22:23
图像不稳定,如何跑车?
坏了,如何坏?现象如何?

初始化失败,就是一直卡在写SCCB那边。。。
作者: 野火    时间: 2013-4-19 11:33
karis 发表于 2013-4-19 00:31
初始化失败,就是一直卡在写SCCB那边。。。

你好,可能是 sccb 通信不好,因为用 gpio管脚来模拟时序的。
建议用我们的工程来进行测试吧】


作者: karis    时间: 2013-4-19 15:39
野火 发表于 2013-4-19 11:33
你好,可能是 sccb 通信不好,因为用 gpio管脚来模拟时序的。
建议用我们的工程来进行测试吧】

额,以前都好好的啊,就是撞了一下后不行了。
作者: 把球给我。。    时间: 2014-6-13 16:22
野火 发表于 2013-4-16 19:18
为什么会出错?必须要用到场中断,才能稳定的……

如果不用行中断,场中断和PCLK应该设为上升沿触发么?

作者: ws15101    时间: 2016-3-27 17:40
本帖最后由 ws15101 于 2016-3-27 17:44 编辑
野火 发表于 2013-4-16 19:15
你好,请用我们最新提供的代码。
不需要用到 行中断

火哥,我鹰眼用了行中断之后输出错误,OLED显示全白,求指教void chang_irq(void)
{
    if(LPLD_GPIO_IsPinxExt(PORTA, GPIO_Pin29))        //场中断
    {
          Pic_complete = 0;        //开始采集
          LPLD_GPIO_ClearIntFlag(PORTA);  //清除场中断标志
          //LPLD_DMA_LoadDstAddr(CAMERA_DMA_CH, (uint32)ov7725_eagle_img_buff);//恢复地址
          row_a = 0;
          row_c = 0;
          LPLD_GPIO_DisableIrq(vsync_irq);  //关闭场中断
          LPLD_GPIO_EnableIrq(href_irq);   //开启行中断

         // LPLD_DMA_EnableReq(CAMERA_DMA_CH);      //使能DMA硬件请求         
    }
}

void hang_irq(void)

{
    if(LPLD_GPIO_IsPinxExt(PORTA, GPIO_Pin28))        //行中断
    {
          LPLD_GPIO_ClearIntFlag(PORTA);  //清除行中断标志


          if(row_a == Pic_Get[row_c])
          {
              LPLD_DMA_EnableReq(CAMERA_DMA_CH);      //使能DMA硬件请求
              LPLD_DMA_LoadDstAddr(CAMERA_DMA_CH, (uint32)(ov7725_eagle_img_buff + row_c * 10));//恢复地址
              row_c++;
              if(row_c>=CAMERA_H)
              {
                  LPLD_GPIO_DisableIrq(href_irq);  //关闭行中断
                  LPLD_GPIO_EnableIrq(vsync_irq);   //开启场中断
                  Pic_complete = 1;
              }

          }
        row_a++;                    
        LPLD_DMA_DisableReq(CAMERA_DMA_CH); //禁用通道0 DMA请求  
    }

}


作者: LVSHUIYY    时间: 2017-2-7 10:39
您好。您这个问题怎么解决的,我也困恼了几天了





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