/************************************************************************* * 蓝宙电子工作室 * * 函数名称:DMA_CH4_Handler * 功能说明:DMA通道4的中断服务函数 * 参数说明:是采集摄像头数据,本数据位摄像头AD数据,可以采集到300个点。 设置标志位能够及时搬移。 * 函数返回:无 * 修改时间:2012-3-18 已测试 * 备 注: *************************************************************************/ void DMA_CH0_Handler(void) { //DMA通道0 printf("DMA_CH0_Handler\n"); DMA_IRQ_CLEAN(DMA_CH0); //清除通道传输中断标志位 (这样才能再次进入中断) DMA_EN(DMA_CH0); //使能通道CHn 硬件请求 (这样才能继续触发DMA传输) // uart_putchar(UART0,0XAA); }
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清中断标志位 } } }
/*! * @brief 鹰眼ov7725场中断服务函数 * @since v5.0 */ void ov7725_eagle_vsync(void) { //场中断需要判断是场结束还是场开始 if(ov7725_eagle_img_flag == IMG_START) //需要开始采集图像 { ov7725_eagle_img_flag = IMG_GATHER; //标记图像采集中 disable_irq(PORTC_IRQn); DMA_EN(CAMERA_DMA_CH); //使能通道CHn 硬件请求 DMA_DADDR(CAMERA_DMA_CH) = (uint32)ov7725_eagle_img_buff; //恢复地址 } else //图像采集错误 { disable_irq(PORTC_IRQn); //关闭PTA的中断 ov7725_eagle_img_flag = IMG_FAIL; //标记图像采集失败 } }
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 ; //清除摄像头行数 } }
void PORTA_ISR(void) //场中断处理函数 { if(PORTA_ISFR & (1 << 29)) //PTA29触发中断 { switch(img_flag) { case IMG_START: img_flag = IMG_GATHER; //标记图像采集中 DMA_EN(CAMERA_DMA_CH); //使能通道CHn 硬件请求 DMA_DADDR(CAMERA_DMA_CH) = (uint32)IMG_BUFF; //恢复地址 break; default : break; } } if (PORTA_ISFR & (1 << 10)) // TAGS: 编码器引脚PTA10中断 { encoder_cnt ++; } PORTA_ISFR = ~0; //场中断里,全部都要清中断标志位 }