F/W : DCMI hdcmi.Instance = DCMI; hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE; hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING; hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW; hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW; hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME; hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B; DCMI->ESUR = 0xFFFFFFFF; // 0xFFFFFFFF, 0xB0B0B0B0 DCMI->ESCR = 0xB69D80AB; // 0xB69D80AB, 0xB0b0b0b0 HAL_DCMI_Init(&hdcmi); // TW9912 HAL_NVIC_SetPriority(DCMI_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DCMI_IRQn); void TW9912_DMA_Config(uint32_t DMA_Memory0BaseAddr,uint32_t DMA_BufferSize) { #if 1 /* ????DMA??DCMI?¬Ý??????*/ /* ???DMA*/ __HAL_RCC_DMA2_CLK_ENABLE(); hdma_dcmi.Instance = DMA2_Stream1; hdma_dcmi.Init.Channel = DMA_CHANNEL_1; hdma_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_dcmi.Init.PeriphInc = DMA_PINC_DISABLE; hdma_dcmi.Init.MemInc = DMA_MINC_ENABLE; //???????????? hdma_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; hdma_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; hdma_dcmi.Init.Mode = DMA_NORMAL; hdma_dcmi.Init.Priority = DMA_PRIORITY_HIGH; hdma_dcmi.Init.FIFOMode = DMA_FIFOMODE_ENABLE; hdma_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; hdma_dcmi.Init.MemBurst = DMA_MBURST_INC4; hdma_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE; /*DMA?¬Ø????? */ __HAL_LINKDMA(&hdcmi, DMA_Handle, hdma_dcmi); HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn); HAL_DMA_Init(&hdma_dcmi); __HAL_DCMI_DISABLE_IT(&hdcmi, DCMI_IT_ERR|DCMI_IT_OVR|DCMI_IT_FRAME); __HAL_DCMI_ENABLE_IT(&hdcmi, DCMI_IT_VSYNC|DCMI_IT_LINE); //???DCMI??????? HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_SNAPSHOT, (uint32_t)DMA_Memory0BaseAddr,DMA_BufferSize); //HAL_DCMI_EnableCrop(&hdcmi); //HAL_DCMI_ConfigCrop(&hdcmi, 16, 20, PAL_WIDTH*2-1, PAL_HEIGHT-1); __HAL_DCMI_ENABLE(&hdcmi); } void DMA2_Stream1_IRQHandler(void) { // static uint8_t cstatus = 0, sts_k; // I2C_Read(TW9912_DEVICE_ADDRESS, TYPE_8BIT_ADDRESS, 0x01, &cstatus,1); // sts_k = cstatus; cap_start = 0; HAL_DCMI_Stop(&hdcmi); HAL_DMA_IRQHandler(&hdma_dcmi); capture_done = 1; } void DCMI_IRQHandler(void) { //static uint16_t l_cnt=0, v_cnt=0; //static uint8_t cstatus = 0, sts_k; if (DCMI->MISR & DCMI_IT_LINE ) // 0x10 { __HAL_DCMI_CLEAR_FLAG(&hdcmi, DCMI_FLAG_LINERI); } if (DCMI->MISR & DCMI_IT_VSYNC ) // 0x08 { __HAL_DCMI_CLEAR_FLAG(&hdcmi, DCMI_FLAG_VSYNCRI); } if (DCMI->MISR & DCMI_IT_FRAME ) { __HAL_DCMI_CLEAR_FLAG(&hdcmi, DCMI_FLAG_FRAMERI); } if (DCMI->MISR & DCMI_IT_ERR ) __HAL_DCMI_CLEAR_FLAG(&hdcmi, DCMI_FLAG_ERRRI); } if (DCMI->MISR & DCMI_IT_OVR ) { __HAL_DCMI_CLEAR_FLAG(&hdcmi, DCMI_FLAG_OVRRI); } } // main.c TW9912_Init(); MX_DCMI_Init(); capture_done = 0; TW9912_DMA_Config((uint32_t) LCD_FRAME_BUFFER_LAYER1,(uint32_t) 1588*240); while(1) { if(capture_done == 1) { capture_done = 0; TW9912_DMA_Config((uint32_t) LCD_FRAME_BUFFER_LAYER1,(uint32_t) 1588*240); } }