/**************************************************************************
** 创建日期: 2012-11-2 *
** 文件名 : isr.c *
** 版本 : *
** 平台 : 羽良工作室MK60DN512ZVLQ10最小系统板 *
** 函数列表: *
** 功能描述: OV7620摄像头数据采集 *
** 创建者 : 羽良工作室 yullion.taobao.com *
** 修改历史: *
** @版权所有: 羽良工作室 yullion.taobao.com *
** 淘宝店: yullion.taobao.com *
**************************************************************************/
/*******************************************************************************************
欢迎光临淘宝店 羽良工作室 yullion.taobao.com
K60淘宝链接 http://item.taobao.com/item.htm?spm=a1z10.1.w4.18.rMwvaU&id=21039172293
********************************************************************************************/
#include "common.h"
#include "include.h"
#include "isr.h"
volatile u8 pit_flag = 0;
volatile u32 dma_int_count = 0;
/******************************************************************************/
unsigned char Pix_Data[V][H] = {0}; //采集V行 H列的图像数据
unsigned char V_Cnt=0; //行采集计数
unsigned char Is_SendPhoto=0; //图像发送标志
unsigned char FieldCounter=1; //判断奇偶场
/******************************************************************************/
#ifdef TIAOSHI //调试模式
//串口调试时执行的程序段,发送出所有的图像数据
/*************************************************************************
* 函数名称:DMA_CH4_Handler
* 功能说明:DMA通道4的中断服务函数
* 参数说明:无
* 函数返回:无
* 修改时间:
* 备 注:
*************************************************************************/
void DMA_CH4_Handler(void)
{
DMA_IRQ_CLEAN(DMA_CH4); //清除通道传输中断标志位 (这样才能再次进入中断)
DMA_DIS(DMA_CH4); //采集完H个数据后进入这个DMA中断,停止DMA传输。行中断中打开DMA传输
/********************/
//串口调试用到
if(V_Cnt == 240)
Is_SendPhoto = 1;
/*******************/
}
/************************************************************************/
//晓克添加
//行中断处理函数
void PORTA_IRQHandler()
{
if((PORTA_ISFR & (1<<29))) //PTA29触发中断,行中断
{
PORTA_ISFR |= (1<<29); //写1清中断标志位
/**************用户任务**************************************************/
if((++V_Cnt)%6 == 0) //判断该行数据是否需要,根据自己需要的行数自己设定判别条件
{
DMA_EN(DMA_CH4); //使能通道CHn 硬件请求
}
//可以在这里判断需要的数据是否已经采集完,可以设置一个标志位
/****************
*这里也可以进行数据处理
*****************/
/************************************************************************/
}
}
//场中断处理函数
void PORTB_IRQHandler()
{
if(PORTB_ISFR & (1<<0)) //PTB0触发中断,场中断
{
PORTB_ISFR |= (1<<0); //写1清中断标志位
Is_SendPhoto = 0; //发送图像标志,串口调试要用
/**************用户任务**************************************************/
//奇偶场判别
/*
FieldCounter++;
if(FieldCounter>= 2)
{
FieldCounter = 0;
}
*/
//奇场 采集图像
// if(FieldCounter == 0)
// {
DMA_PORTx2BUFF_Init (DMA_CH4, (void *)&PTD_BYTE0_IN, Pix_Data, PTC0, DMA_BYTE1, H, DMA_rising_keepon);
//DMA通道4初始化,PTC0上升沿触发DMA传输,源地址为PTD_BYTE0_IN,目的地址为:Pix_Data ,每次传输1Byte,传输H次后停止传输,目的地址保持不变,关闭通道CHn 硬件请求
enable_irq(87); //使能PORTA中断,即开启行中断,PORTA的ISR中断号为87
V_Cnt=0; //行采集计数清零
Is_SendPhoto = 0; //发送图像标志
// }
//偶场
/* else
{
DMA_DIS(DMA_CH4); //停止DMA传输
disable_irq(87); //关闭PORTA中断,即关闭行中断,PORTA的ISR中断号为87
disable_irq(88);
Is_SendPhoto = 1; //发送图像标志
/***************图像处理代码******************/
//这里可以调用图像处理函数
//这里调用舵机电机控制函数
/*********************************************/
// }
/************************************************************************/
}
}
#else //正常模式
//正常运行时程序段
/*************************************************************************
* 函数名称:DMA_CH4_Handler
* 功能说明:DMA通道4的中断服务函数
* 参数说明:无
* 函数返回:无
* 修改时间:
* 备 注:
*************************************************************************/
void DMA_CH4_Handler(void)
{
DMA_IRQ_CLEAN(DMA_CH4); //清除通道传输中断标志位 (这样才能再次进入中断)
DMA_DIS(DMA_CH4); //采集完H个数据后进入这个DMA中断,停止DMA传输。行中断中打开DMA传输
}
/************************************************************************/
//晓克添加
//行中断处理函数
void PORTA_IRQHandler()
{
if((PORTA_ISFR & (1<<29))) //PTA29触发中断,行中断
{
PORTA_ISFR |= (1<<29); //写1清中断标志位
/**************用户任务**************************************************/
if((++V_Cnt)%4 == 0) //判断该行数据是否需要,根据自己需要的行数自己设定判别条件
{
DMA_EN(DMA_CH4); //使能通道CHn 硬件请求
}
//可以在这里判断需要的数据是否已经采集完,可以设置一个标志位
/****************
*这里也可以进行数据处理
*****************/
/************************************************************************/
}
}
//场中断处理函数
void PORTB_IRQHandler()
{
if(PORTB_ISFR & (1<<0)) //PTB0触发中断,场中断
{
PORTB_ISFR |= (1<<0); //写1清中断标志位
/**************用户任务**************************************************/
//奇偶场判别
FieldCounter++;
if(FieldCounter>= 2)
{
FieldCounter = 0;
}
//奇场 采集图像
if(FieldCounter == 0)
{
DMA_PORTx2BUFF_Init (DMA_CH4, (void *)&PTD_BYTE0_IN, Pix_Data, PTC0, DMA_BYTE1, H, DMA_rising_keepon);
//DMA通道4初始化,PTC0上升沿触发DMA传输,源地址为PTD_BYTE0_IN,目的地址为:Pix_Data ,每次传输1Byte,传输H次后停止传输,目的地址保持不变,关闭通道CHn 硬件请求
enable_irq(87); //使能PORTA中断,即开启行中断,PORTA的ISR中断号为87
V_Cnt=0; //行采集计数清零
}
//偶场
else
{
DMA_DIS(DMA_CH4); //停止DMA传输