I successfully read gray scale (luminance channel only) still images out of a 640 x 480 pixels OV camera which is a 0.3 Mega pixels like the one you mention, with an LPC1778 microntroller.
I was able to achieve a frame rate of 2 images per second at 48 MHz CPU clock.
That microcontroller doesn't have a DVP interface so I designed my software using interrupts.
I could have used DMA but didn't want to.
The main problem I faced was that I couldn't store an entire image in RAM because that microcontroller has 64 Kbytes only and I had to write the image out to an SPI interface and then to a PC.
I found an open source gray scale image codec on GitHub and converted all floating point numbers, multiplications and divisions into integer numbers, multiplications and divisions.
It was too slow using floating point numbers.
I then compared the results of my integer-operations algorithm, with the results achieved by a PC running the floating-operations algorithm and found no differences.
The only difference is that the jpeg stream in case of integer math is 10% longer because some const floating point matrix coefficients, optimized by the JPEG group back in the '90s, were rounded off to integers.
I remember that I debugged my integer-math algorithm on a PC using OpenCV to convert jpeg images into UV data.
The gray scale jpeg encoder repository is here:
My integer math algorithm is not yet on Github because I'm a bit busy.
The DVP Interface is very easy to learn.
It's just a parallel interface clocked by the external microcontroller and with 2 synchronization signals: end of pixels row and end of frame.
There's actually a third synchronization signal called E that is high for all the duration of the frame.
I don't remember if used E or not.