先在while(1)
里面写ov7725_eagle_get_img()
把PTB的中断打开ov7725_eagle_vsync(),然后等待场中断触发,再打开DMA中断,通过DMA接受数据。
有两个疑问,
1.感觉没有DMA中断关闭的程序,为什么每次都要开DMA啊。而且不关DMA,对其他程序没影响啊。
2.采集一副图像的时候,一直在
while(ov7725_eagle_img_flag != IMG_FINISH) //等待图像采集完毕
循环里面傻等,感觉一直在浪费单片机的资源。(虽然,现在还不知道可以用这些时间干些什么)
求解释
void ov7725_eagle_get_img()
{
ov7725_eagle_img_flag = IMG_START; //开始采集图像
PORTB_ISFR = ~0; //写1清中断标志位(必须的,不然回导致一开中断就马上触发中断)(改B)
enable_irq(PORTB_IRQn); //允许PTB的中断
while(ov7725_eagle_img_flag != IMG_FINISH) //等待图像采集完毕
{
if(ov7725_eagle_img_flag == IMG_FAIL) //假如图像采集错误,则重新开始采集
{
ov7725_eagle_img_flag = IMG_START; //开始采集图像
PORTB_ISFR = ~0; //写1清中断标志位(必须的,不然回导致一开中断就马上触发中断)
enable_irq(PORTB_IRQn); //允许PTB的中断
}
}
}
void ov7725_eagle_vsync(void)
{
//场中断需要判断是场结束还是场开始
if(ov7725_eagle_img_flag == IMG_START) //需要开始采集图像
{
ov7725_eagle_img_flag = IMG_GATHER; //标记图像采集中
disable_irq(PORTB_IRQn);
#if 1
PORTB_ISFR = 1 << PT21; //清空PCLK标志位(改PB21)
DMA_EN(CAMERA_DMA_CH); //使能通道CHn 硬件请求
PORTB_ISFR = 1 << PT21; //清空PCLK标志位(改PB21)
DMA_DADDR(CAMERA_DMA_CH) = (uint32)ov7725_eagle_img_buff; //恢复地址
#else
PORTB_ISFR = 1 << PT21; //清空PCLK标志位
dma_repeat(CAMERA_DMA_CH, (void *)&PTC_B0_IN, (void *)ov7725_eagle_img_buff,CAMERA_DMA_NUM);
#endif
}
else //图像采集错误
{
disable_irq(PORTB_IRQn); //关闭PTB的中断
ov7725_eagle_img_flag = IMG_FAIL; //标记图像采集失败
}
}
void ov7725_eagle_dma()
{
ov7725_eagle_img_flag = IMG_FINISH ;
DMA_IRQ_CLEAN(CAMERA_DMA_CH); //清除通道传输中断标志位
}