高级会员
- 积分
- 866
- 威望
- 530
- 贡献
- 140
- 兑换币
- 35
- 注册时间
- 2011-7-22
- 在线时间
- 98 小时
|
#include "exti.h"
#include "stdio.h"
#include "uart.h"
#include "led.h"
#include "dma.h"
extern u8 ImageBuf[ROW][COL]; //图像数据
extern FLAG_Type camera_status;
u8 p=0;
////////////////////////////////////
//函数名:EXIT_Init
//功 能:exit初始化
//说 明:port io端口号PTA,PTB,PTC,PTD,PTE
// index 引脚号0~31的数,视芯片针脚数而定
// irqc 中断触发类型设置
// EXTI_IRQ_DISABLE //进制外部中断
// EXTI_IRQ_DMA_RE //DMA上升沿触发
// EXTI_IRQ_DMA_FE //DMA下降沿触发
// EXTI_IRQ_DNA_EE //DMA上升或下降沿触发
// EXTI_IRQ_LZ //逻辑0状态触发
// EXTI_IRQ_RE //上升沿触发
// EXTI_IRQ_FE //下降沿触发
// EXTI_IRQ_EE //上升或下降沿触发
// EXTI_IRQ_LO //逻辑1触发
///////////////////////////////////
void EXTI_Init(GPIO_Type *port,u8 index,u8 irqc)
{
PORT_Type *p ;
switch((uint32_t)port)
{
case PTA_BASE:p=PORTA;SIM->SCGC5|=SIM_SCGC5_PORTA_MASK;NVIC_EnableIRQ(PORTA_IRQn);break; //开启PORTA口使能时钟,在设置前首先开启使能时钟参见k10手册268页,开启内核接受中断,函数来自core_cm4.h
case PTB_BASE:p=PORTB;SIM->SCGC5|=SIM_SCGC5_PORTB_MASK;NVIC_EnableIRQ(PORTB_IRQn);break; //开启PORTB口使能时钟
case PTC_BASE:p=PORTC;SIM->SCGC5|=SIM_SCGC5_PORTC_MASK;NVIC_EnableIRQ(PORTC_IRQn);break; //开启PORTC口使能时钟
case PTD_BASE:p=PORTD;SIM->SCGC5|=SIM_SCGC5_PORTD_MASK;NVIC_EnableIRQ(PORTD_IRQn);break; //开启PORTD口使能时钟
case PTE_BASE:p=PORTE;SIM->SCGC5|=SIM_SCGC5_PORTE_MASK;NVIC_EnableIRQ(PORTE_IRQn);break; //开启PORTE口使能时钟
default : break;
}
p->PCR[index]&=~(PORT_PCR_PS_MASK); // 配置为下拉电阻
p->PCR[index]|=PORT_PCR_PE_MASK;
p->PCR[index]&=~PORT_PCR_MUX_MASK; //配置为GPIO功能
p->PCR[index]|=PORT_PCR_MUX(1);
port->PDDR&=~(1<<index); //配置对应引脚
p->PCR[index]|=PORT_PCR_IRQC(irqc);//外部中断触发设置 参考k10手册238页
}
////////////////////////////////////////////
//函数名:PORTA_IRQHandler
//功 能:PORTA 外部中断服务
void PORTA_IRQHandler(void)
{
u8 i=31;
for(i=31;i>0;i--) //判断哪个引脚的中断发生,i表示哪个引脚发生的中断
{
if((PORTA->ISFR>>i)==1)break;
}
if(i==12) HREF_Interrupt();
}
////////////////////////////////////////////
//函数名:PORTC_IRQHandler
//功 能:PORTC 外部中断服务
void PORTC_IRQHandler(void)
{
u8 i=31;
for(i=31;i>0;i--) //判断哪个引脚的中断发生,i表示哪个引脚发生的中断
{
if((PORTC->ISFR>>i)==1)break;
}
if(i==18) VSYN_Interrupt();
}
////////////////////////////////////////////
//函数名:VSYN_Interrupt
//功 能:场中断处理函数
///////////////////////////////////////////
void VSYN_Interrupt(void)
{
PORTA->ISFR |=(1<<12);//just clear the flag of HERF interrupt
//PORTC->ISFR |=(1<<18);//just clear the flag of HERF interrupt
//begin to collect data during the odd field
if(camera_status.field_number%2!=0)
{
//DMA_Init(0,50,0x400FF0D0u,u32 da,1,0,0,1,0,1,100);//初始化DMA.
DMA_Init(0,50,(u32)&(PTD->PDIR),(u32)ImageBuf,1,0,0,1,0,1,COL);
//选择CH0,触发源PTB,源地址PDIR,目的地址 ImageBuf,1每次读一字节,0每次传送源地址不变 0主循环之后源目的地址不变
//1每次写目的地址加一 0表示主循环后目的地址不变 1选择正常模式 COL表示主循环次数为100次 禁止DMA硬件请求
PORTA->PCR[12]|=PORT_PCR_IRQC(EXTI_IRQ_RE);//open the HERF interrupt
camera_status.line_number = 0;//clear line counter
camera_status.vertic_syn_parity_flag = 1;//set parity flag
}
else//begin to process the data during the even field
{
DMA0->CERQ|=DMA_CERQ_CERQ(0);// DMA0请求禁止
camera_status.finish_flag = 1;
PORTA->PCR[12]&=0XFFF0FFFF;//close the HERF interrupt
PORTC->PCR[18]&=0XFFF0FFFF;//close the VSYN interrupt
camera_status.vertic_syn_parity_flag = 0;//even field
}
camera_status.field_number++;//the fact field number
}
//**************函数名HREF_Interrupt()**************//
//**************功 能?行中断处理函数**************//
void HREF_Interrupt(void)
{
PORTA->ISFR |=(1<<12);//just clear the flag of HERF interrupt
for(camera_status.line_number=0;camera_status.line_number<(5*ROW);camera_status.line_number++)
{
// if((camera_status.line_number<12) ||(camera_status.line_number>200))
// { return;}
// else
// {
if(camera_status.line_number%5==0) //隔五行 采一次
{
DMA0->SERQ|=DMA_SERQ_SERQ(0); //是所需要的行再打开DMA请求使能
// for(camera_status.column_number=0;camera_status.column_number<COL;camera_status.column_number++)
// {
// ImageBuf[camera_status.line_number][camera_status.column_number]=(PTD->PDIR);
// }
}
// }
}
//if(camera_status.line_number>=39) camera_status.line_number = 39;
}
//*********函数名:DMA0_IRQHandler*************//
//*********功 能:DMA0中断服务函数************//
void DMA0_IRQHandler(void)
{
//DMA0->SERQ|=DMA_SERQ_SERQ(0); //DMA0请求使能
DMA0->CERQ|=DMA_CERQ_CERQ(0); // DMA0请求禁止
DMA0->CINT|=DMA_CINT_CINT(0); // 清DMA中断标志
}
|
|