请问有没有大神用F4 DCMI DMA推摄像头啊

2019-07-14 15:51发布


如题  DCMI中断进不去  拔插摄像头却偶尔可以进一次   开启的场中断和捕获完成中断  
直接操作寄存器居然不能进去
如:写if((DCMI->RISR&0x01)==1)    可以i进捕获完成中断
     但写if((DCMI->RISR&0x08)==1)   却进不去场中断


最关键的是不拔插摄像头居然根本不进中断




一下是中断代码
void DCMI_IRQHandler(void)
{
  while((USART1->SR&0X40)==0);                              //等待发送结束
  USART_SendData(USART1,DCMI->RISR);

  if((DCMI->RISR&0x08)==1)             //场中断
  {

    while((USART1->SR&0X40)==0);
    USART_SendData(USART1,0xaa);
    DCMI->ICR|=1<<3;                 //清中断
  }


  //if(DCMI_GetiTStatus(DCMI_IT_FRAME)==SET)//捕获到一帧图像
  if((DCMI->RISR&0x01)==1)
  {
    while((USART1->SR&0X40)==0);
    USART_SendData(USART1,0x12);

    DCMI->ICR|=1<<0;
    //DCMI_ClearITPendingBit(DCMI_IT_FRAME);//清除帧中断
    DMA2_Stream1->NDTR=60*188;           //传输长度为jpeg_buf_size*4字节
    DMA2_Stream1->CR|=1<<0;               //重新传输
  }
  //if(
  DCMI->ICR|=1<<3;
  DCMI->ICR|=1<<4;                               //硬件同步模式行中断一直置一??      

}  




然后是DCMI初始化代码
void DCMI_Init()
{
  GPIO_InitTypeDef  GPIO_InitStructure;

  DCMI_InitTypeDef  DCMI_InitStructure;

  NVIC_InitTypeDef NVIC_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB |RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOE, ENABLE);//使能PABCE时钟

  RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI,ENABLE);//使能DCMI时钟
    //PA4/6初始化设置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_6;//PA4/6 复用功能输出
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能输出
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_6;// PB6/7   复用功能输出
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
  GPIO_InitStructure.GPIO_Pin =
  GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_11;//复用功能输出
  GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化  

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;//PE5/6  复用功能输出  
  GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化



  GPIO_PinAFConfig(GPIOA,GPIO_PinSource4,GPIO_AF_DCMI);//PA4, DCMI_HSYNC

  GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_DCMI);//PA6, DCMI_PCLK   

  GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_DCMI);//PB7,DCMI_VSYNC  

  GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_DCMI);//PC6, DCMI_D0   

  GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_DCMI);//PC7, DCMI_D1  

  GPIO_PinAFConfig(GPIOC,GPIO_PinSource8,GPIO_AF_DCMI);//PC8,DCMI_D2

  GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_DCMI);//PC9, DCMI_D3

  GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_DCMI);//PC11,DCMI_D4  

  GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_DCMI);//PB6,DCMI_D5  

  GPIO_PinAFConfig(GPIOE,GPIO_PinSource5,GPIO_AF_DCMI);//PE5, DCMI_D6

  GPIO_PinAFConfig(GPIOE,GPIO_PinSource6,GPIO_AF_DCMI);//PE6, DCMI_D7

  GPIOE->MODER|=1<<7;
  GPIOE->MODER|=0<<6;
  GPIOE->OTYPER|=1<<3;
  GPIOE->UPDR|=0<<7;
  GPIOE->UPDR|=1<<6;


  DCMI_DeInit();//清除原来的设置  

  DCMI->CR|=0<<13;           //N每个像素时钟捕获8位像素数据
  DCMI->CR|=0<<12;

  DCMI->CR|=0<<7;            //场信号VSYNC低电平数据口无效

  DCMI->CR|=0<<6;            //行信号HSPOL低电平数据口无效

  DCMI->CR|=0<<5;            //像素时钟下降沿有效

  DCMI->CR|=0<<4;            //硬件同步

  DCMI->CR|=0<<3;            //未压缩的格式

  DCMI->CR|=0<<2;            //捕获完整图像

  DCMI->CR|=0<<1;            //连续模式

  //DCMI->CR|=1<<0;            //使能捕获

  DCMI->IER|=0<<4;           //禁止行中断

  DCMI->IER|=1<<3;           //开启场中断
  DCMI->IER|=1<<2;
  DCMI->IER|=1<<1;
  DCMI->IER|=1<<0;           //开启捕获完成中断

  //DCMI->MISR=0x00;

  //DCMI->MISR|=1<<3;          //不屏蔽场中断

  //DCMI->MISR|=1<<0;          //不屏蔽捕获完成中断




  DCMI_ITConfig(DCMI_IT_FRAME|DCMI_IT_VSYNC|DCMI_IT_ERR,ENABLE);//开启帧中断  
  DCMI_Cmd(ENABLE); //DCMI使能

  DCMI->CR|=1<<14;    //启动DCMI

  NVIC_InitStructure.NVIC_IRQChannel = DCMI_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;  //抢占优先级1
  NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;        //响应优先级3
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;          //IRQ通道使能
  NVIC_Init(&NVIC_InitStructure);
  //根据指定的参数初始化VIC寄存器、
  //DCMI,启动传输

}



最后是DMA2
使用的是MT9v032    8位数据一个像素,所以目标地址写的8位
DCMI_DMA_Init(image[0][0],60*188,0,1);

void DCMI_DMA_Init(uint8_t memaddr,uint16_t memsize,uint8_t memblen,uint8_t meminc)
{  

  RCC->AHB1ENR|=1<<22;    //DMA2时钟使能  

  while(DMA2_Stream1->CR&0X01); //等待DMA2_Stream1可配置  
  DMA2->LIFCR|=0X3D<<6*1;        //清空通道1上所有中断标志

  DMA2_Stream1->FCR=0X0000021; //设置为默认值



  DMA2_Stream1->AR=(u32)&DCMI->DR;//外设地址为CMI->DR

  DMA2_Stream1->M0AR=(u32)memaddr; //memaddr作为目标地址

  DMA2_Stream1->NDTR=(u16)memsize; //传输长度为memsize

  DMA2_Stream1->CR=0;         //先全部复位CR寄存器值   

  DMA2_Stream1->CR|=0<<6;     //外设到存储器模式  

  DMA2_Stream1->CR|=1<<8;     //循环模式

  DMA2_Stream1->CR|=0<<9;     //外设非增量模式

  DMA2_Stream1->CR|=meminc<<10; //存储器增量模式

  DMA2_Stream1->CR|=2<<11;      //外设数据长度:32位

  DMA2_Stream1->CR|=memblen<<13; //存储器位宽,8/16/32bit

  DMA2_Stream1->CR|=2<<16;       //高优先级

  DMA2_Stream1->CR|=0<<21;       //外设突发单次传输

  DMA2_Stream1->CR|=0<<23;       //存储器突发单次传输

  DMA2_Stream1->CR|=1<<25;       //通道1 DCMI通道  
}  

祝大家节日快乐^_^!!
求大神帮忙啊Q_Q
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。