这两天用阿波罗F429调OV5640摄像头搞的都快抑郁了,看了几遍手册上DMA、DCMI的部分,可以读出摄像头的ID但是RGB屏上没有图像,而且感觉我自己改的和原子的例程没有对多大的区别,没办法只能用Jlink一步一步调试然后对照手册看DCMI寄存器的设置对不对,后来发现没有使能DCMI,调函数__HAL_DCMI_ENABLE(&DCMI_Handler); 使能后就可以了。 我记得调用函数HAL_XXX_Init();对外设进行初始化的时候,初始化函数中自动会使能外设。追踪DCMI的初始化函数中确实没有对DCMI进行使能,但是我发现原子例程中的官方库的初始化函数中对DCMI进行使能了,原子例程的HAL库版本是V1.4.2的,我的库版本是V1.5.1的,新的库中DCMI初始化部分应该是没有对DCMI进行使能,使用其他函数的时候应该也goto进去看一下。
我的天啊,到这你以为就完了吗?你错了。图像是有了,但是图像不是整屏刷新的,而是图像从屏底部开始向上移动到顶部的。调试了下发现DCMI没有进帧中断函数,看了HAL中DMCI的初始化函数,初始化中对行中断、帧同步中断、错误中断进行了使能,但是没有对帧中断进行使能,但是例程中V1.4.1库中初始化函数是对帧进行了使能中断的。V1.5.1的库需要手动使能帧中断。
因为DMA是一行一行对RGB屏进行填充的,所以在帧中断需要对DMA2D的行变量curllne清零使下一帧的显示从RGB屏的第一行开始,DMA中断(行中断)的回调函数中也需要判断当前行curline是否大于屏的高度,如果大于清零(不清也可以问题不大)。
调试过程中如果遇到问题一定要借助调试工具,这样就可以比较快速的找出问题至少能找到思路。 |