爬上阁楼的鱼 发表于 2016-10-2 10:33:05

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

祝大家节日快乐^_^!!
如题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_InitTypeDefGPIO_InitStructure;

DCMI_InitTypeDefDCMI_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->PUPDR|=0<<7;
GPIOE->PUPDR|=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,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->PAR=(u32)&DCMI->DR;//外设地址为:DCMI->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


爬上阁楼的鱼 发表于 2016-10-2 10:35:01

其实初始化还把同步错误中断和溢出中断打开啊
但实际上读寄存器发现那两个中断从来没发生过所以没有去掉:loveliness:

mark0668 发表于 2016-10-2 11:18:38

能正常读到图像吗

爬上阁楼的鱼 发表于 2016-10-2 19:05:32

mark0668 发表于 2016-10-2 11:18
能正常读到图像吗

:shutup:还没加屏幕   等等试一下

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:lol:lol:lol:lol:lol:lol:lol:lol:lol:lol

斜阳__ 发表于 2016-12-22 08:54:45

帮顶         
页: [1]
查看完整版本: 有没有大神用F4 DCMI DMA推摄像头啊