如题 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_Ge
tiTStatus(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