ov7670卡在DCMI——IRQHandler了

2019-07-21 02:06发布

我是用的最新版的库,所以一部分代码照着原子哥的改,一部分看的官方样例,一部分自己写的。运行时卡在了DCMI_IRQHandler,单帧获取模式无法得到任何数据。不过I2C倒是调通了,可以读写寄存器,部分代码:

uint32_t data;

int main()
{
   
    TIM3_PWM_Init();
    TIM_Init();
    usart_init();
    I2C_Init();
    dcmi_dma_init();
    __HAL_DCMI_ENABLE(&dcmi);
   ov7670_init();
    
    HAL_DCMI_Start_DMA(&dcmi,DCMI_MODE_SNAPSHOT,data,0x9600);

    while(1)
    {
    }
}

void dcmi_dma_init()
// Data: PC6,7,8,9,11  PB6,8,9
// PCLK: PA6  
// HSYNCA4
// VSYNCB7
{
    
    //DCMI对应GPIO配置
    GPIO_InitTypeDef dcmi_gpio;
    
    __DCMI_CLK_ENABLE();
    __GPIOA_CLK_ENABLE();
    __GPIOB_CLK_ENABLE();
    __GPIOC_CLK_ENABLE();
    
    dcmi_gpio.Alternate=GPIO_AF13_DCMI;
    dcmi_gpio.Mode=GPIO_MODE_AF_PP;
    dcmi_gpio.Pin=GPIO_PIN_4 | GPIO_PIN_6;
    dcmi_gpio.Pull=GPIO_PULLUP;
    dcmi_gpio.Speed=GPIO_SPEED_HIGH;
    HAL_GPIO_Init(GPIOA,&dcmi_gpio);
    
    dcmi_gpio.Pin=GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9;
    HAL_GPIO_Init(GPIOB,&dcmi_gpio);
    
    dcmi_gpio.Pin=GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_11;
    HAL_GPIO_Init(GPIOC,&dcmi_gpio);
    
    //DCMI配置
    dcmi.Instance=DCMI;
    dcmi.Init.CaptureRate=DCMI_CR_ALL_FRAME;
    dcmi.Init.HSPolarity=DCMI_HSPOLARITY_HIGH;
    dcmi.Init.PCKPolarity=DCMI_PCKPOLARITY_RISING;
    dcmi.Init.SynchroMode=DCMI_SYNCHRO_HARDWARE;
    dcmi.Init.ExtendedDataMode=DCMI_EXTEND_DATA_8B;
    dcmi.Init.VSPolarity=DCMI_VSPOLARITY_LOW;
    
    //DMA配置
    DMA_Hand.Init.Channel             = DMA_CHANNEL_1;
  DMA_Hand.Init.Direction           = DMA_MEMORY_TO_PERIPH;
  DMA_Hand.Init.PeriphInc           = DMA_PINC_DISABLE;
  DMA_Hand.Init.MemInc              = DMA_MINC_ENABLE;
  DMA_Hand.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  DMA_Hand.Init.MemDataAlignment    = DMA_MDATAALIGN_WORD;
  DMA_Hand.Init.Mode                = DMA_CIRCULAR;
  DMA_Hand.Init.Priority            = DMA_PRIORITY_HIGH;
  DMA_Hand.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;         
  DMA_Hand.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
  DMA_Hand.Init.MemBurst            = DMA_MBURST_SINGLE;
  DMA_Hand.Init.PeriphBurst         = DMA_PBURST_SINGLE;
  DMA_Hand.Instance = DMA2_Stream1;
    
    //其他配置
    __HAL_LINKDMA(&dcmi, DMA_Handle, DMA_Hand);
    HAL_NVIC_SetPriority(DCMI_IRQn, 5, 0);
  HAL_NVIC_EnableIRQ(DCMI_IRQn);  
    HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 5, 0);
  HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);

    
    //启动
    HAL_DMA_Init(dcmi.DMA_Handle);  
    HAL_DCMI_Init(&dcmi);
}


void ov7670_init()
{
    uint8_t Write=0x0a;
    uint8_t Read=0;
    uint8_t reset[2]={0x12,0x80};
    uint16_t i;
    
    //软件复位摄像头,延时600ms
    HAL_I2C_Master_Transmit(&I2cHandle,0x42,reset,2,0xf);
    delay(600);
    
    //读摄像头ID
    HAL_I2C_Master_Transmit(&I2cHandle,0x42,&Write,1,0xf);
    HAL_I2C_Master_Receive(&I2cHandle,0x43,&Read,1,0xf);
    
    //初始化寄存器
    if(Read==0x76)
    {
        for(i=0;i<176;i++)
            HAL_I2C_Master_Transmit(&I2cHandle,0x42,OV7670_RGB_reg,2,0xf);
    }
    
    //延时1s,等待摄像头稳定
    delay(1000);
}

void DCMI_IRQHandler ()
{
    HAL_DCMI_IRQHandler(&dcmi);
}

void DMA2_Stream1_IRQHandler()
{
    HAL_DMA_IRQHandler(dcmi.DMA_Handle);
    printf("DMA2 ");
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。