void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi) { /* DCMI clock enable */ __DCMI_CLK_ENABLE(); /* DCMI GPIOs configuration */ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.Pull = GPIO_PULLDOWN; GPIO_InitStructure.Speed = GPIO_SPEED_LOW; GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.Alternate = GPIO_AF13_DCMI; for (int i=0; i<NUM_DCMI_PINS; i++) { GPIO_InitStructure.Pin = dcmi_pins[i].pin; HAL_GPIO_Init(dcmi_pins[i].port, &GPIO_InitStructure); } }
/** * @brief Initializes the DCMI MSP. * @param None * @retval None */ static void DCMI_MspInit(void) { static DMA_HandleTypeDef hdma; GPIO_InitTypeDef GPIO_Init_Structure; DCMI_HandleTypeDef *hdcmi = &hdcmi_eval; /*** Enable peripherals and GPIO clocks ***/ /* Enable DCMI clock */ __DCMI_CLK_ENABLE(); /* Enable DMA2 clock */ __DMA2_CLK_ENABLE(); /* Enable GPIO clocks */ __GPIOA_CLK_ENABLE(); __GPIOH_CLK_ENABLE(); __GPIOI_CLK_ENABLE(); /*** Configure the GPIO ***/ /* Configure DCMI GPIO as alternate function */ GPIO_Init_Structure.Pin = GPIO_PIN_6; GPIO_Init_Structure.Mode = GPIO_MODE_AF_PP; GPIO_Init_Structure.Pull = GPIO_PULLUP; GPIO_Init_Structure.Speed = GPIO_SPEED_HIGH; GPIO_Init_Structure.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOA, &GPIO_Init_Structure); GPIO_Init_Structure.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 |\ GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14; GPIO_Init_Structure.Mode = GPIO_MODE_AF_PP; GPIO_Init_Structure.Pull = GPIO_PULLUP; GPIO_Init_Structure.Speed = GPIO_SPEED_HIGH; GPIO_Init_Structure.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOH, &GPIO_Init_Structure); GPIO_Init_Structure.Pin = GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 |\ GPIO_PIN_7; GPIO_Init_Structure.Mode = GPIO_MODE_AF_PP; GPIO_Init_Structure.Pull = GPIO_PULLUP; GPIO_Init_Structure.Speed = GPIO_SPEED_HIGH; GPIO_Init_Structure.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOI, &GPIO_Init_Structure); /*** Configure the DMA streams ***/ /* Configure the DMA handler for Transmission process */ hdma.Init.Channel = DMA_CHANNEL_1; hdma.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma.Init.PeriphInc = DMA_PINC_DISABLE; hdma.Init.MemInc = DMA_MINC_ENABLE; hdma.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; hdma.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; hdma.Init.Mode = DMA_CIRCULAR; hdma.Init.Priority = DMA_PRIORITY_HIGH; hdma.Init.FIFOMode = DMA_FIFOMODE_DISABLE; hdma.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; hdma.Init.MemBurst = DMA_MBURST_SINGLE; hdma.Init.PeriphBurst = DMA_PBURST_SINGLE; hdma.Instance = DMA2_Stream1; /* Associate the initialized DMA handle to the DCMI handle */ __HAL_LINKDMA(hdcmi, DMA_Handle, hdma); /*** Configure the NVIC for DCMI and DMA ***/ /* NVIC configuration for DCMI transfer complete interrupt */ HAL_NVIC_SetPriority(DCMI_IRQn, 5, 0); HAL_NVIC_EnableIRQ(DCMI_IRQn); /* NVIC configuration for DMA2 transfer complete interrupt */ HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 5, 0); HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn); /* Configure the DMA stream */ HAL_DMA_Init(hdcmi->DMA_Handle); }
void DcmiDma_Init(void) { /* DMA and DCMI interrupts */ DMA2->LIFCR = 0xffffffff; /* Make sure all the IF are cleared */ DCMI->ICR = 0x1f; #if DEB_INT HAL_NVIC_SetPriority(DCMI_IRQn, 5, 0); /* Enable interrupts */ HAL_NVIC_EnableIRQ(DCMI_IRQn); HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 5, 0); HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn); #endif __DMA2_CLK_ENABLE(); __DCMI_CLK_ENABLE(); /* DMA2 configuration and intialization */ DMA2_Stream1->CR &= 0xf0100000; while(DMA2_Stream1->CR & 1); /* Wait until DMA is disabled */ DMA2_Stream1->NDTR = (uint32_t)(IMG_W*IMG_H/2);/* Number of data transfers */ DMA2_Stream1->PAR = (uint32_t)(&(DCMI->DR)); #ifndef NO_SDRAM DMA2_Stream1->M0AR = (uint32_t)(dcmi_buff); /* DMA address registers */ DMA2_Stream1->M1AR = (uint32_t)(dcmi_buff); #else DMA2_Stream1->M0AR = (uint32_t)(&(dcmi_buff[0])); /* DMA address registers */ DMA2_Stream1->M1AR = (uint32_t)(&(dcmi_buff[0])); #endif DMA2_Stream1->CR |= /* Channel [0,7] */ 1<<25| \ /* Mburst */ 0<<23| \ /* Pburst */ 0<<21| \ /* Current target */ 0<<19| \ /* Double buffer */ 0<<18| \ /* Priority [0,3] */ 2<<16| \ /* Per inc offset (0= %Psize) */ 1<<15| \ /* Mem size (0b10=32bits) */ 2<<13| \ /* Periph size (0b10=32bits) */ 2<<11| \ /* Memory increment */ 1<<10| \ /* Periph increment */ 0<< 9| \ /* Circular mode */ 1<< 8| \ /* Dir (0b00 == P2M) */ 0<< 6| \ /* Periph flow controller */ 0<< 5| \ /* Transfer complete IE */ 0<< 4| \ /* Half transfer IE */ 0<< 3| \ /* Transfer error IE */ 0<< 2| \ /* Direct mode error IE */ 0<< 1| \ /* Stream EN/Ready */ 0<< 0; DMA2_Stream1->FCR |= /* FIFO error IE */ 0<< 7| \ /* Direct mode disable */ 1<< 2| \ /* FIFO thres (1/4)*(X+1)*/ 3<< 0; DMA2_Stream1->CR |= 1; /* Enable */ while(!(DMA2_Stream1->CR & 1)); /* Wait until DMA is enabled */ /* DCMI configuration and intialization */ DCMI->CR &= 0xffffb000; /* Clear all non-reserved bits */ while(DCMI->CR & 0x00004000); /* Wait until peripheral is disabled */ DCMI->CR |= /* Extended data 00 = 8 bit*/ 0<<10| \ /* Frame capture 00 = all */ 0<< 9| \ /* VSPOL*/ 1<< 7| \ /* HSPOL */ 0<< 6| \ /* PCK polarity */ 1<< 5| \ /* Embedded syncro */ 0<< 4| \ /* JPEG */ 0<< 3| \ /* Crop*/ 0<< 2| \ /* Capture mode, 0 = continuous */ 0<< 1| \ /* Capture enable */ 1<< 0; DCMI->IER = /* LINE_IE */ 0<< 4| \ /* VSYNC_IE */ 0<< 3| \ /* ERR_IE */ 0<< 2| \ /* OVR_IE */ 0<< 1| \ /* FRAME_IE */ 0<< 0; DCMI->CR |= 0x00004000; /* Enable DCMI */ while(!(DCMI->CR & 0x00004000)); /* Wait until enabled */ }
void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi) { GPIO_InitTypeDef GPIO_InitStruct; if(hdcmi->Instance==DCMI) { /* USER CODE BEGIN DCMI_MspInit 0 */ /* USER CODE END DCMI_MspInit 0 */ /* Peripheral clock enable */ __DCMI_CLK_ENABLE(); /**DCMI GPIO Configuration PE4 ------> DCMI_D4 PE5 ------> DCMI_D6 PE6 ------> DCMI_D7 PA4 ------> DCMI_HSYNC PA6 ------> DCMI_PIXCK PC6 ------> DCMI_D0 PC7 ------> DCMI_D1 PC8 ------> DCMI_D2 PC9 ------> DCMI_D3 PB6 ------> DCMI_D5 PB7 ------> DCMI_VSYNC */ GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* Peripheral DMA init*/ 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_HALFWORD; hdma_dcmi.Init.Mode = DMA_NORMAL; hdma_dcmi.Init.Priority = DMA_PRIORITY_VERY_HIGH; hdma_dcmi.Init.FIFOMode = DMA_FIFOMODE_ENABLE; hdma_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; hdma_dcmi.Init.MemBurst = DMA_MBURST_SINGLE; hdma_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE; HAL_DMA_Init(&hdma_dcmi); __HAL_LINKDMA(hdcmi,DMA_Handle,hdma_dcmi); /* Peripheral interrupt init*/ HAL_NVIC_SetPriority(DCMI_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DCMI_IRQn); /* USER CODE BEGIN DCMI_MspInit 1 */ /* USER CODE END DCMI_MspInit 1 */ } }
void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi) { GPIO_InitTypeDef GPIO_InitStruct; if(hdcmi->Instance==DCMI) { /* USER CODE BEGIN DCMI_MspInit 0 */ /* USER CODE END DCMI_MspInit 0 */ /* Peripheral clock enable */ __DCMI_CLK_ENABLE(); /**DCMI GPIO Configuration PE5 ------> DCMI_D6 PE6 ------> DCMI_D7 PD3 ------> DCMI_D5 PG9 ------> DCMI_VSYNC PH14 ------> DCMI_D4 PH12 ------> DCMI_D3 PA4 ------> DCMI_HSYNC PH9 ------> DCMI_D0 PH11 ------> DCMI_D2 PA6 ------> DCMI_PIXCLK PH10 ------> DCMI_D1 */ GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_3; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_12|GPIO_PIN_9|GPIO_PIN_11 |GPIO_PIN_10; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USER CODE BEGIN DCMI_MspInit 1 */ /* USER CODE END DCMI_MspInit 1 */ } }