2013-07-07 10:49 PM
Good day,
I have some problems with uint32_t DCMI_ReadData(void); function.I always have 0 data from that DCMI->DR register.I use STM32F4DISCOVERY board, (stm32f407vgt6 MCU).My interupt handler:void DCMI_IRQHandler(void)
{ if(DCMI_GetFlagStatus(DCMI_FLAG_VSYNCRI) == SET) { if(vsync == 0) { vsync = 1; } else { vsync = 0; } } else if(DCMI_GetFlagStatus(DCMI_FLAG_LINERI) == SET) { if(vsync == 1) { href++; } else { href = 0; } } else if(DCMI_GetFlagStatus(DCMI_FLAG_FRAMERI) == SET) { err = 1; } else if(DCMI_GetFlagStatus(DCMI_FLAG_ERRRI) == SET) { err = 2; } else if(DCMI_GetFlagStatus(DCMI_FLAG_OVFRI) == SET) { err = 3; } DCMI_ClearFlag(DCMI_FLAG_VSYNCRI); DCMI_ClearFlag(DCMI_FLAG_LINERI); DCMI_ClearFlag(DCMI_FLAG_FRAMERI); DCMI_ClearFlag(DCMI_FLAG_ERRRI); DCMI_ClearFlag(DCMI_FLAG_OVFRI); }My DCMI config:void DCMI_Config(void)
{ DCMI_InitTypeDef DCMI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //DMA_InitTypeDef DMA_InitStructure; /* Enable DCMI GPIOs clocks */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOA, ENABLE); /* Enable DCMI clock */ RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE); /* Connect DCMI pins to AF13 ************************************************/ /* PCLK */ GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_DCMI); /* D0-D7 */ GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_DCMI); GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_DCMI); GPIO_PinAFConfig(GPIOE, GPIO_PinSource0, GPIO_AF_DCMI); GPIO_PinAFConfig(GPIOE, GPIO_PinSource1, GPIO_AF_DCMI); GPIO_PinAFConfig(GPIOE, GPIO_PinSource4, GPIO_AF_DCMI); GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_DCMI); GPIO_PinAFConfig(GPIOE, GPIO_PinSource5, GPIO_AF_DCMI); GPIO_PinAFConfig(GPIOE, GPIO_PinSource6, GPIO_AF_DCMI); /* VSYNC */ GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_DCMI); /* HSYNC */ GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_DCMI); /* DCMI GPIO configuration **************************************************/ /* D0 D1(PC6/7) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; GPIO_Init(GPIOC, &GPIO_InitStructure); /* D2..D4(PE0/1/4) D6/D7(PE5/6) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6; GPIO_Init(GPIOE, &GPIO_InitStructure); /* D5(PB6), VSYNC(PB7) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_Init(GPIOB, &GPIO_InitStructure); /* PCLK(PA6) HSYNC(PA4)*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); DCMI_DeInit(); DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_Continuous; DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame; DCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_8b; DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_Low; DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Rising; DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware; DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_High; DCMI_Init(&DCMI_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = DCMI_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //----- mask interrupt for DCMI ----- DCMI_ITConfig(DCMI_IT_VSYNC, ENABLE); DCMI_ITConfig(DCMI_IT_LINE, ENABLE); DCMI_ITConfig(DCMI_IT_FRAME, ENABLE); DCMI_ITConfig(DCMI_IT_OVF, ENABLE); DCMI_ITConfig(DCMI_IT_ERR, ENABLE); // Enable DCMI Capture mode DCMI_Cmd(ENABLE); DCMI_CaptureCmd(ENABLE);}while(1)
{if(vsync&&href){sprintf(to_uart, ''\n%d %d %d'', vsync, href, DCMI_ReadData());sendstring(to_uart);}}and the output (looks like vsync, href and pclk are working correctly, I actually can calculate the pclk in href, its 320):...1 201 0
1 203 01 205 01 206 01 208 01 210 01 212 01 214 01 216 01 218 01 220 01 222 01 224 01 226 01 228 01 230 01 232 01 234 01 236 01 238 01 240 01 240 01 1 01 2 01 3 01 5 0....Can somebody explain how to read the data from DCMI->DR register??2013-07-08 01:50 AM
Problem was with the polarity of vsync signal..