你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
爬上阁楼的鱼 提问时间:2016-10-2 10:33 /
祝大家节日快乐^_^!!
如题  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


收藏 1 评论7 发布时间:2016-10-2 10:33

举报

7个回答
爬上阁楼的鱼 回答时间:2016-10-2 10:35:01
其实初始化还把同步错误中断和溢出中断打开啊
但实际上读寄存器发现那两个中断从来没发生过所以没有去掉
mark0668 回答时间:2016-10-2 11:18:38
能正常读到图像吗
爬上阁楼的鱼 回答时间:2016-10-2 19:05:32
mark0668 发表于 2016-10-2 11:18
能正常读到图像吗

还没加屏幕   等等试一下
Kaixa 回答时间:2016-12-21 21:38:03
你好 请问你解决了吗 我移植Mtv032到407也遇到问题 能讨论下么?
shuolang126 回答时间:2016-12-22 07:28:11
用过,买的开发版,直接使用提供的例程包,运行正常。没有像楼主这样操作寄存器!
5265325 回答时间:2016-12-22 08:48:21
:lol:lol
斜阳__ 回答时间:2016-12-22 08:54:45
帮顶         

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版