最重要的过程便是程序的调试了。断点的设置是关键,位置设置合适的断点可以帮你理清程序流程,找出错误。如下我在main.c里面设置了3个断点,在isr.c里面设置了2个,都是关键的位置。按顺序分别记为1,2,3,4,5号断点。
图一,main.c里的断点
图二,isr.c里的断点
程序从上电启动开始运行crt0.s到进入main.c这是一个固定的流程,然后运行到1号断点,停止。随后将进入摄像头的初始化和设置语句。
从1号断点到2号断点之间是完成ov7620初始化和工作模式设置的过程。在此过程中由于没有开中断(摄像头都没设置好当然不能开),任何中断都进不来,第二条程序线是不存在的。所以2号断点是一个关键点,从它开始程序开始变成双线执行。程序会随时被中断(PCLK触发)而进入到4号断点。(F10,F11就知道)执行到DMA_EN(DMA_CH0)的时候,灰度值数据开始从E端口的低8位((void *)&PTE_BYTE0_IN)传输到内存中的IMG_BUFF(通过DMA_CH0),这句代码在ov7620.c中,是OV7620_init中的一个语句(F11,进去看看。也就是说怎么传早就设置好了,现在只要使能通道就可以*^_^*)
DMA_PORTx2BUFF_Init(DMA_CH0,(void *)&PTE_BYTE0_IN, IMG_BUFF, PCLK, DMA_BYTE1, 320 , DMA_rising_keepon);
5号断点是采完一幅图像的判断点,并将标志位IMG_finsh置1,这时当程序再运行到3号断点时就会进入下面的图像处理模块。
这里的keepon保证了传输320字节(一行)后下次传输的地址是IMG_BUFF+320,而不会恢复成IMG_BUFF。即下一次数据会存放在第二行。它keepon的是结束的地址而不是最初的地址。
昨天看到陈正冲一句话:键盘上F10,F11要锃亮铮亮。与大家共勉。
顺便纠正一个野火的错误(不知道改了没有):
CPSIE i是开中断而不是关,CPSID i才是关。(enable啊!怎么会是关?)野火书和库的注释在这一点都是错的。官方写的arm_cm4.h不会错,可以查看。
官方arm_cm4.h: