/*! * @brief 鹰眼ov7725管脚初始化(内部调用) * @since v5.0 */ void ov7725_eagle_port_init() { //DMA通道0初始化,PTC10触发源(默认上升沿),源地址为PTC_B0_IN,目的地址为:IMG_BUFF,每次传输1Byte dma_portx2buff_init(CAMERA_DMA_CH, (void *)&PTC_B0_IN, (void *)ov7725_eagle_img_buff, PTC10, DMA_BYTE1, CAMERA_DMA_NUM, DADDR_KEEPON); DMA_DIS(CAMERA_DMA_CH); disable_irq(PORTC_IRQn); //关闭PTA的中断 DMA_IRQ_CLEAN(CAMERA_DMA_CH); //清除通道传输中断标志位 DMA_IRQ_EN(CAMERA_DMA_CH); port_init(PTC10, ALT1 | DMA_FALLING | PULLUP ); //PCLK port_init(PTC9, ALT1 | IRQ_RISING | PULLUP | PF); //场中断,上拉,上降沿触发中断,带滤波 }
void ov7725_eagle_vsync(void) { //uart_putchar (UART0, 0); //场中断需要判断是场结束还是场开始 if(ov7725_eagle_img_flag == IMG_START) //需要开始采集图像 { if(PORTD_ISFR & 0x2000) //PTD13触发中断,采集的行中断 { PORTD_ISFR |= 0x2000; //写1清中断标志位 if(Sample_Flag==0) { return; } if((LinCout%(480/DATALINE)==0)&&(LinADCout<DATALINE)) { //uart_putchar (UART0, 1); systick_delay_us(8); DMA_DADDR(DMA_CH4) = (uint32_t)ov7725_eagle_img_buff[LinADCout] ; //数据存储地址变化 DMA_EN(DMA_CH4); //使能通道CHn 硬件请求 (这样才能继续触发DMA传输) DMA_IRQ_EN(DMA_CH4) ; //允许DMA通道传输 LinADCout ++ ; } LinCout++; if(LinADCout==DATALINE) { LinADCout=0; ov7725_eagle_img_flag = IMG_FINISH; Sample_Flag=0; disable_irq(PORTD_IRQn); //关闭PTd的中断 } } if(PORTD_ISFR & 0x4000) //PTD14触发中断,采集的场中断。 { PORTD_ISFR |= 0x4000; //写1清中断标志 //uart_putchar (UART0, 2); LinCout = 0 ; LinADCout=0; Sample_Flag=1; port_init(PTD13, ALT1 | IRQ_FALLING | PULLUP ); //初始化 PTD7 管脚,复用功能为GPIO ,下降沿触发中断,上拉电阻 PORTD_ISFR |= 0x2000; //写1清中断标志位 } } }
void PORTD_IRQHandler() { /*************** 摄像头变量 ***************/ if(PORTD_ISFR & 0x2000) //PTD13触发中断,采集的行中断 { PORTD_ISFR |= 0x2000; //写1清中断标志位 if(Sample_Line_flag ) { Sample_Line_flag = 0; DMA_IRQ_CLEAN(DMA_CH4); //清除通道传输中断标志位 (这样才能再次进入中断) DMA_EN(DMA_CH4); //使能通道CHn 硬件请求 (这样才能继续触发DMA传输) DMA_IRQ_EN(DMA_CH4) ; //允许DMA通道传输 Sample_Line_Count ++ ; //采样行数 } LineCount ++ ; if(*pSample_Line == LineCount ) { Sample_Line_flag = 1 ; if(*pSample_Line != 0xFFff ) { pSample_Line ++ ; } } } if(PORTD_ISFR & 0x4000) //PTD14触发中断,采集的场中断。 { PORTD_ISFR |= 0x4000; //写1清中断标志位 pSample_Line = &Sample_LineAryy[0] ; //初始化要采集的行数 LineCount = 0 ; //清除摄像头行数 } }