注册 登录
查看: 353|回复: 2

[摄像头组] 请教下为什么这里 DMA 只执行一次?

[复制链接]
发表于 2014-4-10 20:05:06 | 显示全部楼层 |阅读模式
#include "include.h"
volatile uint8 YSYN=1;
volatile uint8 ROWCNT=0;
uint8 IMAGEBUFF[ROW][COL];
uint8 SAMPLEFLAG;
void ov7620_init(void)
{
   
    sccb_init();
    //-----------SCCB恢复默认出厂设置----------//
    //--PCLK:70ns   HREF:63us   VSYN:33.33ms--//
    //--原分辨率为640*480  
    //--在每两个HREF之间有1280个PCLK---U Y V Y U Y V Y
    //--在每两个VSYN之间有240个HREF    //OV7620是隔行采集
    //sccb_regWrite(0x42,0x11,0x00);   
    //sccb_regWrite(0x42,0x14,0x04);
    //sccb_regWrite(0x42,0x28,0x20);
    //---------------------------------------//
    //----------SCCB寄存器配置---------------//
    sccb_regWrite(0x42,0x11,0x03);      //地址0X11-中断四分频(640*240)   
    sccb_regWrite(0x42,0x14,0x24);      //地址0X14-QVGA(320*120)                  
    sccb_regWrite(0x42,0x28,0x20);      //地址0X28-连续采集模式(320*240)
   
    sccb_waite();
   
    port_init(PTA25 , ALT1 | PULLDOWN | IRQ_RISING | PF );    //HREF
    port_init(PTA27 , ALT1 | PULLDOWN | IRQ_RISING | PF );    //YSYNC
   
    set_vector_handler(PORTA_VECTORn , porta_handler_1 );  //这里这样定义是因为山外定义porta_handler();
    set_vector_handler( DMA0_VECTORn , dma_ch0_handler );
   
    enable_irq( PORTA_IRQn );
    //DMA_IRQ_DIS( DMA_CH0);
}
//场中断执行用户任务
void ov7620_ysync_user(void)
{
   led_turn( LED0 );
   ROWCNT = 0 ;
   SAMPLEFLAG = 1 ;
}
//行中断执行用户任务
void ov7620_href_user(void)
{
    led_turn( LED1 );
    if( !SAMPLEFLAG )    //如果行中断未触发终止函数
    {
      return;
    }                    //摄像头图像输入地址在 PTB_B0_IN  目标地址 IMAGEBUFF
                         // PTA26( PCLK ) 触发  每次传送一字节 传送 320次
    dma_portx2buff_init( DMA_CH0, ( void * )&PTB_B0_IN ,(void*) IMAGEBUFF[ROWCNT] , PTA26 , DMA_BYTE1 , 320 ,DADDR_KEEPON );
   
    DMA_EN( DMA_CH0);
    ROWCNT ++ ;
   
    if( ROWCNT == 240 )
    {
      ROWCNT = 0 ;
      DMA_DIS( DMA_CH0);
    }
}
void porta_handler_1 ( void )
{
  uint8 N;     //管脚号
  uint32 FLAG; //用以存储 PORTA 的中断号 即: PORTA_ISFR
  FLAG = PORTA_ISFR;
  
  N = 25 ;   //行中断
  if( FLAG & ( 1 << N ) );
  {
      PORTA_ISFR |= ( 1 << N ) ;
      ov7620_href_user();
  }
  
  N = 27 ;   //场中断
  if( FLAG & ( 1 << N ) );
  {
    PORTA_ISFR |= ( 1 << N ) ;
    ov7620_ysync_user();
  }
}
//DMA_CH4  中断函数
void dma_ch0_handler(void)
{
    DMA_IRQ_CLEAN( DMA_CH0 );
    DMA_IRQ_DIS( DMA_CH0 );
}
#define IMAGE_SEND
#ifdef IMAGE_SEND          //条件编译是否发送图像到上位机
                           //如果 定义了 IAMGE_SEND 那么编译图像发送函数
void image_send_to_pc(void)
{
   uint8 i;
   uint16 j;
   for( i =0 ; i < ROW ; i++ )
   {
      for( j =0 ; j<COL ; j++ )
      {
         if( IMAGEBUFF[i][j] == 0xff  )
         {
           IMAGEBUFF[i][j]-- ;
         }
         uart_putchar( UART3 , IMAGEBUFF[i][j] );
         
      }
   }
   uart_putchar( UART3 , 0Xff );
}
#endif
回复

使用道具 举报

发表于 2014-4-10 20:35:39 | 显示全部楼层
传输完后,需要再次使能硬件请求,才可以继续DMA传输的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-10 20:49:24 | 显示全部楼层
孟二冬 发表于 2014-4-10 20:35
传输完后,需要再次使能硬件请求,才可以继续DMA传输的

哦?  我看看
回复 支持 反对

使用道具 举报

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

本版积分规则

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