From f5241008aa90d0c34a930de6b2c6b28bcea1367d Mon Sep 17 00:00:00 2001 From: SeekFree <1325536866@qq.com> Date: Mon, 10 Jan 2022 19:19:12 +0800 Subject: [PATCH] =?UTF-8?q?V1.2.2=20=20=20=20=20=E5=BD=93=E6=91=84?= =?UTF-8?q?=E5=83=8F=E5=A4=B4=E5=9B=BE=E5=83=8F=E5=87=BA=E7=8E=B0=E5=81=B6?= =?UTF-8?q?=E5=8F=91=E6=80=A7=E9=94=99=E4=BD=8D=E7=9A=84=E6=83=85=E5=86=B5?= =?UTF-8?q?=EF=BC=8C=E4=BC=9A=E9=87=8D=E6=96=B0=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?DMA=E4=BD=BF=E5=BE=97=E4=B8=8B=E6=AC=A1=E9=87=87=E9=9B=86?= =?UTF-8?q?=E5=9B=BE=E5=83=8F=E8=87=AA=E5=8A=A8=E6=81=A2=E5=A4=8D=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=E3=80=82=20=20=20=20=20=E6=80=BB=E9=92=BB=E9=A3=8E?= =?UTF-8?q?=E6=91=84=E5=83=8F=E5=A4=B4=E5=83=8F=E7=B4=A0=E6=97=B6=E9=92=9F?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=BA=E4=B8=8A=E5=8D=87=E6=B2=BF=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=20=20=20=20=20=E6=91=84=E5=83=8F=E5=A4=B4=E5=8E=BB?= =?UTF-8?q?=E6=8E=89=E6=A0=87=E5=BF=97=E4=BD=8D=E6=B8=85=E9=9B=B6=E6=89=8D?= =?UTF-8?q?=E7=BB=A7=E7=BB=AD=E9=87=87=E9=9B=86=E4=B8=8B=E4=B8=80=E5=B9=85?= =?UTF-8?q?=E5=9B=BE=E5=83=8F=E7=9A=84=E9=80=BB=E8=BE=91=EF=BC=8C=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E5=87=BA=E7=8E=B0=E5=B8=A7=E7=8E=87=E5=87=8F=E5=8D=8A?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Example/ADC_Demo/Libraries/doc/version.txt | 5 +++ .../seekfree_peripheral/SEEKFREE_7725.c | 27 +++++++++--- .../seekfree_peripheral/SEEKFREE_7725_UART.c | 29 +++++++++---- .../seekfree_peripheral/SEEKFREE_MT9V03X.c | 42 +++++++++++++------ .../Libraries/doc/version.txt | 5 +++ .../seekfree_peripheral/SEEKFREE_7725.c | 27 +++++++++--- .../seekfree_peripheral/SEEKFREE_7725_UART.c | 29 +++++++++---- .../seekfree_peripheral/SEEKFREE_MT9V03X.c | 42 +++++++++++++------ .../Dual_Core_Demo/Libraries/doc/version.txt | 5 +++ .../seekfree_peripheral/SEEKFREE_7725.c | 27 +++++++++--- .../seekfree_peripheral/SEEKFREE_7725_UART.c | 29 +++++++++---- .../seekfree_peripheral/SEEKFREE_MT9V03X.c | 42 +++++++++++++------ Example/EEPROM_Demo/Libraries/doc/version.txt | 5 +++ .../seekfree_peripheral/SEEKFREE_7725.c | 27 +++++++++--- .../seekfree_peripheral/SEEKFREE_7725_UART.c | 29 +++++++++---- .../seekfree_peripheral/SEEKFREE_MT9V03X.c | 42 +++++++++++++------ .../Encoder_Demo/Libraries/doc/version.txt | 5 +++ .../seekfree_peripheral/SEEKFREE_7725.c | 27 +++++++++--- .../seekfree_peripheral/SEEKFREE_7725_UART.c | 29 +++++++++---- .../seekfree_peripheral/SEEKFREE_MT9V03X.c | 42 +++++++++++++------ Example/FFT_Demo/Libraries/doc/version.txt | 5 +++ .../seekfree_peripheral/SEEKFREE_7725.c | 27 +++++++++--- .../seekfree_peripheral/SEEKFREE_7725_UART.c | 29 +++++++++---- .../seekfree_peripheral/SEEKFREE_MT9V03X.c | 42 +++++++++++++------ .../Libraries/doc/version.txt | 5 +++ .../seekfree_peripheral/SEEKFREE_7725.c | 27 +++++++++--- .../seekfree_peripheral/SEEKFREE_7725_UART.c | 29 +++++++++---- .../seekfree_peripheral/SEEKFREE_MT9V03X.c | 42 +++++++++++++------ .../Libraries/doc/version.txt | 5 +++ .../seekfree_peripheral/SEEKFREE_7725.c | 27 +++++++++--- .../seekfree_peripheral/SEEKFREE_7725_UART.c | 29 +++++++++---- .../seekfree_peripheral/SEEKFREE_MT9V03X.c | 42 +++++++++++++------ .../LED_Blink_Demo/Libraries/doc/version.txt | 5 +++ .../seekfree_peripheral/SEEKFREE_7725.c | 27 +++++++++--- .../seekfree_peripheral/SEEKFREE_7725_UART.c | 29 +++++++++---- .../seekfree_peripheral/SEEKFREE_MT9V03X.c | 42 +++++++++++++------ Example/PIT_Demo/Libraries/doc/version.txt | 5 +++ .../seekfree_peripheral/SEEKFREE_7725.c | 27 +++++++++--- .../seekfree_peripheral/SEEKFREE_7725_UART.c | 29 +++++++++---- .../seekfree_peripheral/SEEKFREE_MT9V03X.c | 42 +++++++++++++------ Example/PWM_Demo/Libraries/doc/version.txt | 5 +++ .../seekfree_peripheral/SEEKFREE_7725.c | 27 +++++++++--- .../seekfree_peripheral/SEEKFREE_7725_UART.c | 29 +++++++++---- .../seekfree_peripheral/SEEKFREE_MT9V03X.c | 42 +++++++++++++------ Example/Printf_Demo/Libraries/doc/version.txt | 5 +++ .../seekfree_peripheral/SEEKFREE_7725.c | 27 +++++++++--- .../seekfree_peripheral/SEEKFREE_7725_UART.c | 29 +++++++++---- .../seekfree_peripheral/SEEKFREE_MT9V03X.c | 42 +++++++++++++------ .../Libraries/doc/version.txt | 5 +++ .../seekfree_peripheral/SEEKFREE_7725.c | 27 +++++++++--- .../seekfree_peripheral/SEEKFREE_7725_UART.c | 29 +++++++++---- .../seekfree_peripheral/SEEKFREE_MT9V03X.c | 42 +++++++++++++------ .../Systick_Demo/Libraries/doc/version.txt | 5 +++ .../seekfree_peripheral/SEEKFREE_7725.c | 27 +++++++++--- .../seekfree_peripheral/SEEKFREE_7725_UART.c | 29 +++++++++---- .../seekfree_peripheral/SEEKFREE_MT9V03X.c | 42 +++++++++++++------ Example/UART_Demo/Libraries/doc/version.txt | 5 +++ .../seekfree_peripheral/SEEKFREE_7725.c | 27 +++++++++--- .../seekfree_peripheral/SEEKFREE_7725_UART.c | 29 +++++++++---- .../seekfree_peripheral/SEEKFREE_MT9V03X.c | 42 +++++++++++++------ .../Libraries/doc/version.txt | 5 +++ .../seekfree_peripheral/SEEKFREE_7725.c | 27 +++++++++--- .../seekfree_peripheral/SEEKFREE_7725_UART.c | 29 +++++++++---- .../seekfree_peripheral/SEEKFREE_MT9V03X.c | 42 +++++++++++++------ 64 files changed, 1264 insertions(+), 384 deletions(-) diff --git a/Example/ADC_Demo/Libraries/doc/version.txt b/Example/ADC_Demo/Libraries/doc/version.txt index 9d395a4..e09b8d6 100644 --- a/Example/ADC_Demo/Libraries/doc/version.txt +++ b/Example/ADC_Demo/Libraries/doc/version.txt @@ -1,3 +1,8 @@ +V1.2.2 + 当摄像头图像出现偶发性错位的情况,会重新初始化DMA使得下次采集图像自动恢复正常。 + 总钻风摄像头像素时钟修改为上升沿触发 + 摄像头去掉标志位清零才继续采集下一幅图像的逻辑,避免出现帧率减半的问题 + V1.2.1 解决printf关闭的时候,编译报错的问题 diff --git a/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c index 7b82110..0679b38 100644 --- a/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c +++ b/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -180,7 +180,8 @@ uint8 ov7725_init(void) -uint8 ov7725_finish_flag = 0; +uint8 ov7725_finish_flag = 0; +uint8 ov7725_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -191,8 +192,14 @@ uint8 ov7725_finish_flag = 0; void ov7725_vsync(void) { CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); - - if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_dma_init_flag) + { + ov7725_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_DMA_CH); + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), camera_buffer_addr, OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + dma_start(OV7725_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_DMA_CH, camera_buffer_addr); dma_start(OV7725_DMA_CH); @@ -210,8 +217,18 @@ void ov7725_vsync(void) void ov7725_dma(void) { CLEAR_DMA_FLAG(OV7725_DMA_CH); - ov7725_finish_flag = 1; - dma_stop(OV7725_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH)) + {//图像有错位 + ov7725_finish_flag = 0; + dma_stop(OV7725_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH); + ov7725_dma_init_flag = 1; + } + else + { + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); + } } diff --git a/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c b/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c index 75d2688..c61278e 100644 --- a/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c +++ b/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c @@ -260,7 +260,8 @@ void ov7725_uart_init(void) restoreInterrupts(interrupt_state); } - +uint8 ov7725_uart_finish_flag = 0; +uint8 ov7725_uart_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -271,16 +272,20 @@ void ov7725_uart_init(void) void ov7725_uart_vsync(void) { CLEAR_GPIO_FLAG(OV7725_UART_VSYNC_PIN); - - if(!ov7725_uart_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_uart_dma_init_flag) + { + ov7725_uart_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_UART_DMA_CH); + eru_dma_init(OV7725_UART_DMA_CH, GET_PORT_IN_ADDR(OV7725_UART_DATA_PIN), camera_buffer_addr, OV7725_UART_PCLK_PIN, FALLING, OV7725_UART_DMA_NUM); + dma_start(OV7725_UART_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_UART_DMA_CH, camera_buffer_addr); dma_start(OV7725_UART_DMA_CH); } } - -uint8 ov7725_uart_finish_flag = 0; //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头DMA完成中断 // @param NULL @@ -291,8 +296,18 @@ uint8 ov7725_uart_finish_flag = 0; void ov7725_uart_dma(void) { CLEAR_DMA_FLAG(OV7725_UART_DMA_CH); - ov7725_uart_finish_flag = 1; - dma_stop(OV7725_UART_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH)) + {//图像有错位 + ov7725_uart_finish_flag = 0; + dma_stop(OV7725_UART_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH); + ov7725_uart_dma_init_flag = 1; + } + else + { + ov7725_uart_finish_flag = 1; + dma_stop(OV7725_UART_DMA_CH); + } } diff --git a/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 9ae7d25..f468206 100644 --- a/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/ADC_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -307,15 +307,16 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); } -uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -327,7 +328,14 @@ void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); mt9v03x_dma_int_num = 0; - if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(mt9v03x_dma_init_flag) + { + mt9v03x_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H); + dma_start(MT9V03X_DMA_CH); + } + else { if(1 == link_list_num) { @@ -335,11 +343,10 @@ void mt9v03x_vsync(void) DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr); } dma_start(MT9V03X_DMA_CH); + } - } - //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -350,14 +357,25 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); - mt9v03x_dma_int_num++; - if(mt9v03x_dma_int_num >= link_list_num) - { - //采集完成 - mt9v03x_dma_int_num = 0; - mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH)) + {//图像有错位 + mt9v03x_finish_flag = 0; dma_stop(MT9V03X_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH); + mt9v03x_dma_init_flag = 1; + } + else + { + mt9v03x_dma_int_num++; + + if(mt9v03x_dma_int_num >= link_list_num) + { + //采集完成 + mt9v03x_dma_int_num = 0; + mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } } diff --git a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/doc/version.txt b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/doc/version.txt index 9d395a4..e09b8d6 100644 --- a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/doc/version.txt +++ b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/doc/version.txt @@ -1,3 +1,8 @@ +V1.2.2 + 当摄像头图像出现偶发性错位的情况,会重新初始化DMA使得下次采集图像自动恢复正常。 + 总钻风摄像头像素时钟修改为上升沿触发 + 摄像头去掉标志位清零才继续采集下一幅图像的逻辑,避免出现帧率减半的问题 + V1.2.1 解决printf关闭的时候,编译报错的问题 diff --git a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c index 7b82110..0679b38 100644 --- a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c +++ b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -180,7 +180,8 @@ uint8 ov7725_init(void) -uint8 ov7725_finish_flag = 0; +uint8 ov7725_finish_flag = 0; +uint8 ov7725_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -191,8 +192,14 @@ uint8 ov7725_finish_flag = 0; void ov7725_vsync(void) { CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); - - if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_dma_init_flag) + { + ov7725_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_DMA_CH); + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), camera_buffer_addr, OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + dma_start(OV7725_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_DMA_CH, camera_buffer_addr); dma_start(OV7725_DMA_CH); @@ -210,8 +217,18 @@ void ov7725_vsync(void) void ov7725_dma(void) { CLEAR_DMA_FLAG(OV7725_DMA_CH); - ov7725_finish_flag = 1; - dma_stop(OV7725_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH)) + {//图像有错位 + ov7725_finish_flag = 0; + dma_stop(OV7725_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH); + ov7725_dma_init_flag = 1; + } + else + { + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); + } } diff --git a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c index 75d2688..c61278e 100644 --- a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c +++ b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c @@ -260,7 +260,8 @@ void ov7725_uart_init(void) restoreInterrupts(interrupt_state); } - +uint8 ov7725_uart_finish_flag = 0; +uint8 ov7725_uart_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -271,16 +272,20 @@ void ov7725_uart_init(void) void ov7725_uart_vsync(void) { CLEAR_GPIO_FLAG(OV7725_UART_VSYNC_PIN); - - if(!ov7725_uart_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_uart_dma_init_flag) + { + ov7725_uart_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_UART_DMA_CH); + eru_dma_init(OV7725_UART_DMA_CH, GET_PORT_IN_ADDR(OV7725_UART_DATA_PIN), camera_buffer_addr, OV7725_UART_PCLK_PIN, FALLING, OV7725_UART_DMA_NUM); + dma_start(OV7725_UART_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_UART_DMA_CH, camera_buffer_addr); dma_start(OV7725_UART_DMA_CH); } } - -uint8 ov7725_uart_finish_flag = 0; //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头DMA完成中断 // @param NULL @@ -291,8 +296,18 @@ uint8 ov7725_uart_finish_flag = 0; void ov7725_uart_dma(void) { CLEAR_DMA_FLAG(OV7725_UART_DMA_CH); - ov7725_uart_finish_flag = 1; - dma_stop(OV7725_UART_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH)) + {//图像有错位 + ov7725_uart_finish_flag = 0; + dma_stop(OV7725_UART_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH); + ov7725_uart_dma_init_flag = 1; + } + else + { + ov7725_uart_finish_flag = 1; + dma_stop(OV7725_UART_DMA_CH); + } } diff --git a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 9ae7d25..f468206 100644 --- a/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/Cpu1_Handles_Interrupts_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -307,15 +307,16 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); } -uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -327,7 +328,14 @@ void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); mt9v03x_dma_int_num = 0; - if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(mt9v03x_dma_init_flag) + { + mt9v03x_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H); + dma_start(MT9V03X_DMA_CH); + } + else { if(1 == link_list_num) { @@ -335,11 +343,10 @@ void mt9v03x_vsync(void) DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr); } dma_start(MT9V03X_DMA_CH); + } - } - //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -350,14 +357,25 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); - mt9v03x_dma_int_num++; - if(mt9v03x_dma_int_num >= link_list_num) - { - //采集完成 - mt9v03x_dma_int_num = 0; - mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH)) + {//图像有错位 + mt9v03x_finish_flag = 0; dma_stop(MT9V03X_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH); + mt9v03x_dma_init_flag = 1; + } + else + { + mt9v03x_dma_int_num++; + + if(mt9v03x_dma_int_num >= link_list_num) + { + //采集完成 + mt9v03x_dma_int_num = 0; + mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } } diff --git a/Example/Dual_Core_Demo/Libraries/doc/version.txt b/Example/Dual_Core_Demo/Libraries/doc/version.txt index 9d395a4..e09b8d6 100644 --- a/Example/Dual_Core_Demo/Libraries/doc/version.txt +++ b/Example/Dual_Core_Demo/Libraries/doc/version.txt @@ -1,3 +1,8 @@ +V1.2.2 + 当摄像头图像出现偶发性错位的情况,会重新初始化DMA使得下次采集图像自动恢复正常。 + 总钻风摄像头像素时钟修改为上升沿触发 + 摄像头去掉标志位清零才继续采集下一幅图像的逻辑,避免出现帧率减半的问题 + V1.2.1 解决printf关闭的时候,编译报错的问题 diff --git a/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c index 7b82110..0679b38 100644 --- a/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c +++ b/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -180,7 +180,8 @@ uint8 ov7725_init(void) -uint8 ov7725_finish_flag = 0; +uint8 ov7725_finish_flag = 0; +uint8 ov7725_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -191,8 +192,14 @@ uint8 ov7725_finish_flag = 0; void ov7725_vsync(void) { CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); - - if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_dma_init_flag) + { + ov7725_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_DMA_CH); + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), camera_buffer_addr, OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + dma_start(OV7725_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_DMA_CH, camera_buffer_addr); dma_start(OV7725_DMA_CH); @@ -210,8 +217,18 @@ void ov7725_vsync(void) void ov7725_dma(void) { CLEAR_DMA_FLAG(OV7725_DMA_CH); - ov7725_finish_flag = 1; - dma_stop(OV7725_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH)) + {//图像有错位 + ov7725_finish_flag = 0; + dma_stop(OV7725_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH); + ov7725_dma_init_flag = 1; + } + else + { + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); + } } diff --git a/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c b/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c index 75d2688..c61278e 100644 --- a/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c +++ b/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c @@ -260,7 +260,8 @@ void ov7725_uart_init(void) restoreInterrupts(interrupt_state); } - +uint8 ov7725_uart_finish_flag = 0; +uint8 ov7725_uart_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -271,16 +272,20 @@ void ov7725_uart_init(void) void ov7725_uart_vsync(void) { CLEAR_GPIO_FLAG(OV7725_UART_VSYNC_PIN); - - if(!ov7725_uart_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_uart_dma_init_flag) + { + ov7725_uart_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_UART_DMA_CH); + eru_dma_init(OV7725_UART_DMA_CH, GET_PORT_IN_ADDR(OV7725_UART_DATA_PIN), camera_buffer_addr, OV7725_UART_PCLK_PIN, FALLING, OV7725_UART_DMA_NUM); + dma_start(OV7725_UART_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_UART_DMA_CH, camera_buffer_addr); dma_start(OV7725_UART_DMA_CH); } } - -uint8 ov7725_uart_finish_flag = 0; //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头DMA完成中断 // @param NULL @@ -291,8 +296,18 @@ uint8 ov7725_uart_finish_flag = 0; void ov7725_uart_dma(void) { CLEAR_DMA_FLAG(OV7725_UART_DMA_CH); - ov7725_uart_finish_flag = 1; - dma_stop(OV7725_UART_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH)) + {//图像有错位 + ov7725_uart_finish_flag = 0; + dma_stop(OV7725_UART_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH); + ov7725_uart_dma_init_flag = 1; + } + else + { + ov7725_uart_finish_flag = 1; + dma_stop(OV7725_UART_DMA_CH); + } } diff --git a/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 9ae7d25..f468206 100644 --- a/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/Dual_Core_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -307,15 +307,16 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); } -uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -327,7 +328,14 @@ void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); mt9v03x_dma_int_num = 0; - if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(mt9v03x_dma_init_flag) + { + mt9v03x_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H); + dma_start(MT9V03X_DMA_CH); + } + else { if(1 == link_list_num) { @@ -335,11 +343,10 @@ void mt9v03x_vsync(void) DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr); } dma_start(MT9V03X_DMA_CH); + } - } - //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -350,14 +357,25 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); - mt9v03x_dma_int_num++; - if(mt9v03x_dma_int_num >= link_list_num) - { - //采集完成 - mt9v03x_dma_int_num = 0; - mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH)) + {//图像有错位 + mt9v03x_finish_flag = 0; dma_stop(MT9V03X_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH); + mt9v03x_dma_init_flag = 1; + } + else + { + mt9v03x_dma_int_num++; + + if(mt9v03x_dma_int_num >= link_list_num) + { + //采集完成 + mt9v03x_dma_int_num = 0; + mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } } diff --git a/Example/EEPROM_Demo/Libraries/doc/version.txt b/Example/EEPROM_Demo/Libraries/doc/version.txt index 9d395a4..e09b8d6 100644 --- a/Example/EEPROM_Demo/Libraries/doc/version.txt +++ b/Example/EEPROM_Demo/Libraries/doc/version.txt @@ -1,3 +1,8 @@ +V1.2.2 + 当摄像头图像出现偶发性错位的情况,会重新初始化DMA使得下次采集图像自动恢复正常。 + 总钻风摄像头像素时钟修改为上升沿触发 + 摄像头去掉标志位清零才继续采集下一幅图像的逻辑,避免出现帧率减半的问题 + V1.2.1 解决printf关闭的时候,编译报错的问题 diff --git a/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c index 7b82110..0679b38 100644 --- a/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c +++ b/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -180,7 +180,8 @@ uint8 ov7725_init(void) -uint8 ov7725_finish_flag = 0; +uint8 ov7725_finish_flag = 0; +uint8 ov7725_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -191,8 +192,14 @@ uint8 ov7725_finish_flag = 0; void ov7725_vsync(void) { CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); - - if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_dma_init_flag) + { + ov7725_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_DMA_CH); + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), camera_buffer_addr, OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + dma_start(OV7725_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_DMA_CH, camera_buffer_addr); dma_start(OV7725_DMA_CH); @@ -210,8 +217,18 @@ void ov7725_vsync(void) void ov7725_dma(void) { CLEAR_DMA_FLAG(OV7725_DMA_CH); - ov7725_finish_flag = 1; - dma_stop(OV7725_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH)) + {//图像有错位 + ov7725_finish_flag = 0; + dma_stop(OV7725_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH); + ov7725_dma_init_flag = 1; + } + else + { + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); + } } diff --git a/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c b/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c index 75d2688..c61278e 100644 --- a/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c +++ b/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c @@ -260,7 +260,8 @@ void ov7725_uart_init(void) restoreInterrupts(interrupt_state); } - +uint8 ov7725_uart_finish_flag = 0; +uint8 ov7725_uart_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -271,16 +272,20 @@ void ov7725_uart_init(void) void ov7725_uart_vsync(void) { CLEAR_GPIO_FLAG(OV7725_UART_VSYNC_PIN); - - if(!ov7725_uart_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_uart_dma_init_flag) + { + ov7725_uart_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_UART_DMA_CH); + eru_dma_init(OV7725_UART_DMA_CH, GET_PORT_IN_ADDR(OV7725_UART_DATA_PIN), camera_buffer_addr, OV7725_UART_PCLK_PIN, FALLING, OV7725_UART_DMA_NUM); + dma_start(OV7725_UART_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_UART_DMA_CH, camera_buffer_addr); dma_start(OV7725_UART_DMA_CH); } } - -uint8 ov7725_uart_finish_flag = 0; //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头DMA完成中断 // @param NULL @@ -291,8 +296,18 @@ uint8 ov7725_uart_finish_flag = 0; void ov7725_uart_dma(void) { CLEAR_DMA_FLAG(OV7725_UART_DMA_CH); - ov7725_uart_finish_flag = 1; - dma_stop(OV7725_UART_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH)) + {//图像有错位 + ov7725_uart_finish_flag = 0; + dma_stop(OV7725_UART_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH); + ov7725_uart_dma_init_flag = 1; + } + else + { + ov7725_uart_finish_flag = 1; + dma_stop(OV7725_UART_DMA_CH); + } } diff --git a/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 9ae7d25..f468206 100644 --- a/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/EEPROM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -307,15 +307,16 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); } -uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -327,7 +328,14 @@ void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); mt9v03x_dma_int_num = 0; - if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(mt9v03x_dma_init_flag) + { + mt9v03x_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H); + dma_start(MT9V03X_DMA_CH); + } + else { if(1 == link_list_num) { @@ -335,11 +343,10 @@ void mt9v03x_vsync(void) DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr); } dma_start(MT9V03X_DMA_CH); + } - } - //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -350,14 +357,25 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); - mt9v03x_dma_int_num++; - if(mt9v03x_dma_int_num >= link_list_num) - { - //采集完成 - mt9v03x_dma_int_num = 0; - mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH)) + {//图像有错位 + mt9v03x_finish_flag = 0; dma_stop(MT9V03X_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH); + mt9v03x_dma_init_flag = 1; + } + else + { + mt9v03x_dma_int_num++; + + if(mt9v03x_dma_int_num >= link_list_num) + { + //采集完成 + mt9v03x_dma_int_num = 0; + mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } } diff --git a/Example/Encoder_Demo/Libraries/doc/version.txt b/Example/Encoder_Demo/Libraries/doc/version.txt index 9d395a4..e09b8d6 100644 --- a/Example/Encoder_Demo/Libraries/doc/version.txt +++ b/Example/Encoder_Demo/Libraries/doc/version.txt @@ -1,3 +1,8 @@ +V1.2.2 + 当摄像头图像出现偶发性错位的情况,会重新初始化DMA使得下次采集图像自动恢复正常。 + 总钻风摄像头像素时钟修改为上升沿触发 + 摄像头去掉标志位清零才继续采集下一幅图像的逻辑,避免出现帧率减半的问题 + V1.2.1 解决printf关闭的时候,编译报错的问题 diff --git a/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c index 7b82110..0679b38 100644 --- a/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c +++ b/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -180,7 +180,8 @@ uint8 ov7725_init(void) -uint8 ov7725_finish_flag = 0; +uint8 ov7725_finish_flag = 0; +uint8 ov7725_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -191,8 +192,14 @@ uint8 ov7725_finish_flag = 0; void ov7725_vsync(void) { CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); - - if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_dma_init_flag) + { + ov7725_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_DMA_CH); + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), camera_buffer_addr, OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + dma_start(OV7725_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_DMA_CH, camera_buffer_addr); dma_start(OV7725_DMA_CH); @@ -210,8 +217,18 @@ void ov7725_vsync(void) void ov7725_dma(void) { CLEAR_DMA_FLAG(OV7725_DMA_CH); - ov7725_finish_flag = 1; - dma_stop(OV7725_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH)) + {//图像有错位 + ov7725_finish_flag = 0; + dma_stop(OV7725_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH); + ov7725_dma_init_flag = 1; + } + else + { + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); + } } diff --git a/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c b/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c index 75d2688..c61278e 100644 --- a/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c +++ b/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c @@ -260,7 +260,8 @@ void ov7725_uart_init(void) restoreInterrupts(interrupt_state); } - +uint8 ov7725_uart_finish_flag = 0; +uint8 ov7725_uart_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -271,16 +272,20 @@ void ov7725_uart_init(void) void ov7725_uart_vsync(void) { CLEAR_GPIO_FLAG(OV7725_UART_VSYNC_PIN); - - if(!ov7725_uart_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_uart_dma_init_flag) + { + ov7725_uart_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_UART_DMA_CH); + eru_dma_init(OV7725_UART_DMA_CH, GET_PORT_IN_ADDR(OV7725_UART_DATA_PIN), camera_buffer_addr, OV7725_UART_PCLK_PIN, FALLING, OV7725_UART_DMA_NUM); + dma_start(OV7725_UART_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_UART_DMA_CH, camera_buffer_addr); dma_start(OV7725_UART_DMA_CH); } } - -uint8 ov7725_uart_finish_flag = 0; //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头DMA完成中断 // @param NULL @@ -291,8 +296,18 @@ uint8 ov7725_uart_finish_flag = 0; void ov7725_uart_dma(void) { CLEAR_DMA_FLAG(OV7725_UART_DMA_CH); - ov7725_uart_finish_flag = 1; - dma_stop(OV7725_UART_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH)) + {//图像有错位 + ov7725_uart_finish_flag = 0; + dma_stop(OV7725_UART_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH); + ov7725_uart_dma_init_flag = 1; + } + else + { + ov7725_uart_finish_flag = 1; + dma_stop(OV7725_UART_DMA_CH); + } } diff --git a/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 9ae7d25..f468206 100644 --- a/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/Encoder_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -307,15 +307,16 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); } -uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -327,7 +328,14 @@ void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); mt9v03x_dma_int_num = 0; - if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(mt9v03x_dma_init_flag) + { + mt9v03x_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H); + dma_start(MT9V03X_DMA_CH); + } + else { if(1 == link_list_num) { @@ -335,11 +343,10 @@ void mt9v03x_vsync(void) DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr); } dma_start(MT9V03X_DMA_CH); + } - } - //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -350,14 +357,25 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); - mt9v03x_dma_int_num++; - if(mt9v03x_dma_int_num >= link_list_num) - { - //采集完成 - mt9v03x_dma_int_num = 0; - mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH)) + {//图像有错位 + mt9v03x_finish_flag = 0; dma_stop(MT9V03X_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH); + mt9v03x_dma_init_flag = 1; + } + else + { + mt9v03x_dma_int_num++; + + if(mt9v03x_dma_int_num >= link_list_num) + { + //采集完成 + mt9v03x_dma_int_num = 0; + mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } } diff --git a/Example/FFT_Demo/Libraries/doc/version.txt b/Example/FFT_Demo/Libraries/doc/version.txt index 9d395a4..e09b8d6 100644 --- a/Example/FFT_Demo/Libraries/doc/version.txt +++ b/Example/FFT_Demo/Libraries/doc/version.txt @@ -1,3 +1,8 @@ +V1.2.2 + 当摄像头图像出现偶发性错位的情况,会重新初始化DMA使得下次采集图像自动恢复正常。 + 总钻风摄像头像素时钟修改为上升沿触发 + 摄像头去掉标志位清零才继续采集下一幅图像的逻辑,避免出现帧率减半的问题 + V1.2.1 解决printf关闭的时候,编译报错的问题 diff --git a/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c index 7b82110..0679b38 100644 --- a/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c +++ b/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -180,7 +180,8 @@ uint8 ov7725_init(void) -uint8 ov7725_finish_flag = 0; +uint8 ov7725_finish_flag = 0; +uint8 ov7725_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -191,8 +192,14 @@ uint8 ov7725_finish_flag = 0; void ov7725_vsync(void) { CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); - - if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_dma_init_flag) + { + ov7725_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_DMA_CH); + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), camera_buffer_addr, OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + dma_start(OV7725_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_DMA_CH, camera_buffer_addr); dma_start(OV7725_DMA_CH); @@ -210,8 +217,18 @@ void ov7725_vsync(void) void ov7725_dma(void) { CLEAR_DMA_FLAG(OV7725_DMA_CH); - ov7725_finish_flag = 1; - dma_stop(OV7725_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH)) + {//图像有错位 + ov7725_finish_flag = 0; + dma_stop(OV7725_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH); + ov7725_dma_init_flag = 1; + } + else + { + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); + } } diff --git a/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c b/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c index 75d2688..c61278e 100644 --- a/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c +++ b/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c @@ -260,7 +260,8 @@ void ov7725_uart_init(void) restoreInterrupts(interrupt_state); } - +uint8 ov7725_uart_finish_flag = 0; +uint8 ov7725_uart_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -271,16 +272,20 @@ void ov7725_uart_init(void) void ov7725_uart_vsync(void) { CLEAR_GPIO_FLAG(OV7725_UART_VSYNC_PIN); - - if(!ov7725_uart_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_uart_dma_init_flag) + { + ov7725_uart_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_UART_DMA_CH); + eru_dma_init(OV7725_UART_DMA_CH, GET_PORT_IN_ADDR(OV7725_UART_DATA_PIN), camera_buffer_addr, OV7725_UART_PCLK_PIN, FALLING, OV7725_UART_DMA_NUM); + dma_start(OV7725_UART_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_UART_DMA_CH, camera_buffer_addr); dma_start(OV7725_UART_DMA_CH); } } - -uint8 ov7725_uart_finish_flag = 0; //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头DMA完成中断 // @param NULL @@ -291,8 +296,18 @@ uint8 ov7725_uart_finish_flag = 0; void ov7725_uart_dma(void) { CLEAR_DMA_FLAG(OV7725_UART_DMA_CH); - ov7725_uart_finish_flag = 1; - dma_stop(OV7725_UART_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH)) + {//图像有错位 + ov7725_uart_finish_flag = 0; + dma_stop(OV7725_UART_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH); + ov7725_uart_dma_init_flag = 1; + } + else + { + ov7725_uart_finish_flag = 1; + dma_stop(OV7725_UART_DMA_CH); + } } diff --git a/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 9ae7d25..f468206 100644 --- a/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/FFT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -307,15 +307,16 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); } -uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -327,7 +328,14 @@ void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); mt9v03x_dma_int_num = 0; - if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(mt9v03x_dma_init_flag) + { + mt9v03x_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H); + dma_start(MT9V03X_DMA_CH); + } + else { if(1 == link_list_num) { @@ -335,11 +343,10 @@ void mt9v03x_vsync(void) DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr); } dma_start(MT9V03X_DMA_CH); + } - } - //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -350,14 +357,25 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); - mt9v03x_dma_int_num++; - if(mt9v03x_dma_int_num >= link_list_num) - { - //采集完成 - mt9v03x_dma_int_num = 0; - mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH)) + {//图像有错位 + mt9v03x_finish_flag = 0; dma_stop(MT9V03X_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH); + mt9v03x_dma_init_flag = 1; + } + else + { + mt9v03x_dma_int_num++; + + if(mt9v03x_dma_int_num >= link_list_num) + { + //采集完成 + mt9v03x_dma_int_num = 0; + mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } } diff --git a/Example/GPIO_Interrupt_Demo/Libraries/doc/version.txt b/Example/GPIO_Interrupt_Demo/Libraries/doc/version.txt index 9d395a4..e09b8d6 100644 --- a/Example/GPIO_Interrupt_Demo/Libraries/doc/version.txt +++ b/Example/GPIO_Interrupt_Demo/Libraries/doc/version.txt @@ -1,3 +1,8 @@ +V1.2.2 + 当摄像头图像出现偶发性错位的情况,会重新初始化DMA使得下次采集图像自动恢复正常。 + 总钻风摄像头像素时钟修改为上升沿触发 + 摄像头去掉标志位清零才继续采集下一幅图像的逻辑,避免出现帧率减半的问题 + V1.2.1 解决printf关闭的时候,编译报错的问题 diff --git a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c index 7b82110..0679b38 100644 --- a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c +++ b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -180,7 +180,8 @@ uint8 ov7725_init(void) -uint8 ov7725_finish_flag = 0; +uint8 ov7725_finish_flag = 0; +uint8 ov7725_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -191,8 +192,14 @@ uint8 ov7725_finish_flag = 0; void ov7725_vsync(void) { CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); - - if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_dma_init_flag) + { + ov7725_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_DMA_CH); + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), camera_buffer_addr, OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + dma_start(OV7725_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_DMA_CH, camera_buffer_addr); dma_start(OV7725_DMA_CH); @@ -210,8 +217,18 @@ void ov7725_vsync(void) void ov7725_dma(void) { CLEAR_DMA_FLAG(OV7725_DMA_CH); - ov7725_finish_flag = 1; - dma_stop(OV7725_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH)) + {//图像有错位 + ov7725_finish_flag = 0; + dma_stop(OV7725_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH); + ov7725_dma_init_flag = 1; + } + else + { + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); + } } diff --git a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c index 75d2688..c61278e 100644 --- a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c +++ b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c @@ -260,7 +260,8 @@ void ov7725_uart_init(void) restoreInterrupts(interrupt_state); } - +uint8 ov7725_uart_finish_flag = 0; +uint8 ov7725_uart_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -271,16 +272,20 @@ void ov7725_uart_init(void) void ov7725_uart_vsync(void) { CLEAR_GPIO_FLAG(OV7725_UART_VSYNC_PIN); - - if(!ov7725_uart_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_uart_dma_init_flag) + { + ov7725_uart_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_UART_DMA_CH); + eru_dma_init(OV7725_UART_DMA_CH, GET_PORT_IN_ADDR(OV7725_UART_DATA_PIN), camera_buffer_addr, OV7725_UART_PCLK_PIN, FALLING, OV7725_UART_DMA_NUM); + dma_start(OV7725_UART_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_UART_DMA_CH, camera_buffer_addr); dma_start(OV7725_UART_DMA_CH); } } - -uint8 ov7725_uart_finish_flag = 0; //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头DMA完成中断 // @param NULL @@ -291,8 +296,18 @@ uint8 ov7725_uart_finish_flag = 0; void ov7725_uart_dma(void) { CLEAR_DMA_FLAG(OV7725_UART_DMA_CH); - ov7725_uart_finish_flag = 1; - dma_stop(OV7725_UART_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH)) + {//图像有错位 + ov7725_uart_finish_flag = 0; + dma_stop(OV7725_UART_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH); + ov7725_uart_dma_init_flag = 1; + } + else + { + ov7725_uart_finish_flag = 1; + dma_stop(OV7725_UART_DMA_CH); + } } diff --git a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 9ae7d25..f468206 100644 --- a/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/GPIO_Interrupt_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -307,15 +307,16 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); } -uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -327,7 +328,14 @@ void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); mt9v03x_dma_int_num = 0; - if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(mt9v03x_dma_init_flag) + { + mt9v03x_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H); + dma_start(MT9V03X_DMA_CH); + } + else { if(1 == link_list_num) { @@ -335,11 +343,10 @@ void mt9v03x_vsync(void) DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr); } dma_start(MT9V03X_DMA_CH); + } - } - //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -350,14 +357,25 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); - mt9v03x_dma_int_num++; - if(mt9v03x_dma_int_num >= link_list_num) - { - //采集完成 - mt9v03x_dma_int_num = 0; - mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH)) + {//图像有错位 + mt9v03x_finish_flag = 0; dma_stop(MT9V03X_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH); + mt9v03x_dma_init_flag = 1; + } + else + { + mt9v03x_dma_int_num++; + + if(mt9v03x_dma_int_num >= link_list_num) + { + //采集完成 + mt9v03x_dma_int_num = 0; + mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } } diff --git a/Example/Interrupt_Priority_Set_Demo/Libraries/doc/version.txt b/Example/Interrupt_Priority_Set_Demo/Libraries/doc/version.txt index 9d395a4..e09b8d6 100644 --- a/Example/Interrupt_Priority_Set_Demo/Libraries/doc/version.txt +++ b/Example/Interrupt_Priority_Set_Demo/Libraries/doc/version.txt @@ -1,3 +1,8 @@ +V1.2.2 + 当摄像头图像出现偶发性错位的情况,会重新初始化DMA使得下次采集图像自动恢复正常。 + 总钻风摄像头像素时钟修改为上升沿触发 + 摄像头去掉标志位清零才继续采集下一幅图像的逻辑,避免出现帧率减半的问题 + V1.2.1 解决printf关闭的时候,编译报错的问题 diff --git a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c index 7b82110..0679b38 100644 --- a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c +++ b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -180,7 +180,8 @@ uint8 ov7725_init(void) -uint8 ov7725_finish_flag = 0; +uint8 ov7725_finish_flag = 0; +uint8 ov7725_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -191,8 +192,14 @@ uint8 ov7725_finish_flag = 0; void ov7725_vsync(void) { CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); - - if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_dma_init_flag) + { + ov7725_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_DMA_CH); + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), camera_buffer_addr, OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + dma_start(OV7725_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_DMA_CH, camera_buffer_addr); dma_start(OV7725_DMA_CH); @@ -210,8 +217,18 @@ void ov7725_vsync(void) void ov7725_dma(void) { CLEAR_DMA_FLAG(OV7725_DMA_CH); - ov7725_finish_flag = 1; - dma_stop(OV7725_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH)) + {//图像有错位 + ov7725_finish_flag = 0; + dma_stop(OV7725_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH); + ov7725_dma_init_flag = 1; + } + else + { + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); + } } diff --git a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c index 75d2688..c61278e 100644 --- a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c +++ b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c @@ -260,7 +260,8 @@ void ov7725_uart_init(void) restoreInterrupts(interrupt_state); } - +uint8 ov7725_uart_finish_flag = 0; +uint8 ov7725_uart_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -271,16 +272,20 @@ void ov7725_uart_init(void) void ov7725_uart_vsync(void) { CLEAR_GPIO_FLAG(OV7725_UART_VSYNC_PIN); - - if(!ov7725_uart_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_uart_dma_init_flag) + { + ov7725_uart_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_UART_DMA_CH); + eru_dma_init(OV7725_UART_DMA_CH, GET_PORT_IN_ADDR(OV7725_UART_DATA_PIN), camera_buffer_addr, OV7725_UART_PCLK_PIN, FALLING, OV7725_UART_DMA_NUM); + dma_start(OV7725_UART_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_UART_DMA_CH, camera_buffer_addr); dma_start(OV7725_UART_DMA_CH); } } - -uint8 ov7725_uart_finish_flag = 0; //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头DMA完成中断 // @param NULL @@ -291,8 +296,18 @@ uint8 ov7725_uart_finish_flag = 0; void ov7725_uart_dma(void) { CLEAR_DMA_FLAG(OV7725_UART_DMA_CH); - ov7725_uart_finish_flag = 1; - dma_stop(OV7725_UART_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH)) + {//图像有错位 + ov7725_uart_finish_flag = 0; + dma_stop(OV7725_UART_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH); + ov7725_uart_dma_init_flag = 1; + } + else + { + ov7725_uart_finish_flag = 1; + dma_stop(OV7725_UART_DMA_CH); + } } diff --git a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 9ae7d25..f468206 100644 --- a/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/Interrupt_Priority_Set_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -307,15 +307,16 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); } -uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -327,7 +328,14 @@ void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); mt9v03x_dma_int_num = 0; - if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(mt9v03x_dma_init_flag) + { + mt9v03x_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H); + dma_start(MT9V03X_DMA_CH); + } + else { if(1 == link_list_num) { @@ -335,11 +343,10 @@ void mt9v03x_vsync(void) DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr); } dma_start(MT9V03X_DMA_CH); + } - } - //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -350,14 +357,25 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); - mt9v03x_dma_int_num++; - if(mt9v03x_dma_int_num >= link_list_num) - { - //采集完成 - mt9v03x_dma_int_num = 0; - mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH)) + {//图像有错位 + mt9v03x_finish_flag = 0; dma_stop(MT9V03X_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH); + mt9v03x_dma_init_flag = 1; + } + else + { + mt9v03x_dma_int_num++; + + if(mt9v03x_dma_int_num >= link_list_num) + { + //采集完成 + mt9v03x_dma_int_num = 0; + mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } } diff --git a/Example/LED_Blink_Demo/Libraries/doc/version.txt b/Example/LED_Blink_Demo/Libraries/doc/version.txt index 9d395a4..e09b8d6 100644 --- a/Example/LED_Blink_Demo/Libraries/doc/version.txt +++ b/Example/LED_Blink_Demo/Libraries/doc/version.txt @@ -1,3 +1,8 @@ +V1.2.2 + 当摄像头图像出现偶发性错位的情况,会重新初始化DMA使得下次采集图像自动恢复正常。 + 总钻风摄像头像素时钟修改为上升沿触发 + 摄像头去掉标志位清零才继续采集下一幅图像的逻辑,避免出现帧率减半的问题 + V1.2.1 解决printf关闭的时候,编译报错的问题 diff --git a/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c index 7b82110..0679b38 100644 --- a/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c +++ b/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -180,7 +180,8 @@ uint8 ov7725_init(void) -uint8 ov7725_finish_flag = 0; +uint8 ov7725_finish_flag = 0; +uint8 ov7725_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -191,8 +192,14 @@ uint8 ov7725_finish_flag = 0; void ov7725_vsync(void) { CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); - - if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_dma_init_flag) + { + ov7725_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_DMA_CH); + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), camera_buffer_addr, OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + dma_start(OV7725_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_DMA_CH, camera_buffer_addr); dma_start(OV7725_DMA_CH); @@ -210,8 +217,18 @@ void ov7725_vsync(void) void ov7725_dma(void) { CLEAR_DMA_FLAG(OV7725_DMA_CH); - ov7725_finish_flag = 1; - dma_stop(OV7725_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH)) + {//图像有错位 + ov7725_finish_flag = 0; + dma_stop(OV7725_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH); + ov7725_dma_init_flag = 1; + } + else + { + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); + } } diff --git a/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c b/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c index 75d2688..c61278e 100644 --- a/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c +++ b/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c @@ -260,7 +260,8 @@ void ov7725_uart_init(void) restoreInterrupts(interrupt_state); } - +uint8 ov7725_uart_finish_flag = 0; +uint8 ov7725_uart_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -271,16 +272,20 @@ void ov7725_uart_init(void) void ov7725_uart_vsync(void) { CLEAR_GPIO_FLAG(OV7725_UART_VSYNC_PIN); - - if(!ov7725_uart_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_uart_dma_init_flag) + { + ov7725_uart_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_UART_DMA_CH); + eru_dma_init(OV7725_UART_DMA_CH, GET_PORT_IN_ADDR(OV7725_UART_DATA_PIN), camera_buffer_addr, OV7725_UART_PCLK_PIN, FALLING, OV7725_UART_DMA_NUM); + dma_start(OV7725_UART_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_UART_DMA_CH, camera_buffer_addr); dma_start(OV7725_UART_DMA_CH); } } - -uint8 ov7725_uart_finish_flag = 0; //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头DMA完成中断 // @param NULL @@ -291,8 +296,18 @@ uint8 ov7725_uart_finish_flag = 0; void ov7725_uart_dma(void) { CLEAR_DMA_FLAG(OV7725_UART_DMA_CH); - ov7725_uart_finish_flag = 1; - dma_stop(OV7725_UART_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH)) + {//图像有错位 + ov7725_uart_finish_flag = 0; + dma_stop(OV7725_UART_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH); + ov7725_uart_dma_init_flag = 1; + } + else + { + ov7725_uart_finish_flag = 1; + dma_stop(OV7725_UART_DMA_CH); + } } diff --git a/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 9ae7d25..f468206 100644 --- a/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/LED_Blink_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -307,15 +307,16 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); } -uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -327,7 +328,14 @@ void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); mt9v03x_dma_int_num = 0; - if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(mt9v03x_dma_init_flag) + { + mt9v03x_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H); + dma_start(MT9V03X_DMA_CH); + } + else { if(1 == link_list_num) { @@ -335,11 +343,10 @@ void mt9v03x_vsync(void) DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr); } dma_start(MT9V03X_DMA_CH); + } - } - //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -350,14 +357,25 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); - mt9v03x_dma_int_num++; - if(mt9v03x_dma_int_num >= link_list_num) - { - //采集完成 - mt9v03x_dma_int_num = 0; - mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH)) + {//图像有错位 + mt9v03x_finish_flag = 0; dma_stop(MT9V03X_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH); + mt9v03x_dma_init_flag = 1; + } + else + { + mt9v03x_dma_int_num++; + + if(mt9v03x_dma_int_num >= link_list_num) + { + //采集完成 + mt9v03x_dma_int_num = 0; + mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } } diff --git a/Example/PIT_Demo/Libraries/doc/version.txt b/Example/PIT_Demo/Libraries/doc/version.txt index 9d395a4..e09b8d6 100644 --- a/Example/PIT_Demo/Libraries/doc/version.txt +++ b/Example/PIT_Demo/Libraries/doc/version.txt @@ -1,3 +1,8 @@ +V1.2.2 + 当摄像头图像出现偶发性错位的情况,会重新初始化DMA使得下次采集图像自动恢复正常。 + 总钻风摄像头像素时钟修改为上升沿触发 + 摄像头去掉标志位清零才继续采集下一幅图像的逻辑,避免出现帧率减半的问题 + V1.2.1 解决printf关闭的时候,编译报错的问题 diff --git a/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c index 7b82110..0679b38 100644 --- a/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c +++ b/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -180,7 +180,8 @@ uint8 ov7725_init(void) -uint8 ov7725_finish_flag = 0; +uint8 ov7725_finish_flag = 0; +uint8 ov7725_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -191,8 +192,14 @@ uint8 ov7725_finish_flag = 0; void ov7725_vsync(void) { CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); - - if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_dma_init_flag) + { + ov7725_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_DMA_CH); + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), camera_buffer_addr, OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + dma_start(OV7725_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_DMA_CH, camera_buffer_addr); dma_start(OV7725_DMA_CH); @@ -210,8 +217,18 @@ void ov7725_vsync(void) void ov7725_dma(void) { CLEAR_DMA_FLAG(OV7725_DMA_CH); - ov7725_finish_flag = 1; - dma_stop(OV7725_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH)) + {//图像有错位 + ov7725_finish_flag = 0; + dma_stop(OV7725_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH); + ov7725_dma_init_flag = 1; + } + else + { + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); + } } diff --git a/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c b/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c index 75d2688..c61278e 100644 --- a/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c +++ b/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c @@ -260,7 +260,8 @@ void ov7725_uart_init(void) restoreInterrupts(interrupt_state); } - +uint8 ov7725_uart_finish_flag = 0; +uint8 ov7725_uart_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -271,16 +272,20 @@ void ov7725_uart_init(void) void ov7725_uart_vsync(void) { CLEAR_GPIO_FLAG(OV7725_UART_VSYNC_PIN); - - if(!ov7725_uart_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_uart_dma_init_flag) + { + ov7725_uart_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_UART_DMA_CH); + eru_dma_init(OV7725_UART_DMA_CH, GET_PORT_IN_ADDR(OV7725_UART_DATA_PIN), camera_buffer_addr, OV7725_UART_PCLK_PIN, FALLING, OV7725_UART_DMA_NUM); + dma_start(OV7725_UART_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_UART_DMA_CH, camera_buffer_addr); dma_start(OV7725_UART_DMA_CH); } } - -uint8 ov7725_uart_finish_flag = 0; //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头DMA完成中断 // @param NULL @@ -291,8 +296,18 @@ uint8 ov7725_uart_finish_flag = 0; void ov7725_uart_dma(void) { CLEAR_DMA_FLAG(OV7725_UART_DMA_CH); - ov7725_uart_finish_flag = 1; - dma_stop(OV7725_UART_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH)) + {//图像有错位 + ov7725_uart_finish_flag = 0; + dma_stop(OV7725_UART_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH); + ov7725_uart_dma_init_flag = 1; + } + else + { + ov7725_uart_finish_flag = 1; + dma_stop(OV7725_UART_DMA_CH); + } } diff --git a/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 9ae7d25..f468206 100644 --- a/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/PIT_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -307,15 +307,16 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); } -uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -327,7 +328,14 @@ void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); mt9v03x_dma_int_num = 0; - if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(mt9v03x_dma_init_flag) + { + mt9v03x_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H); + dma_start(MT9V03X_DMA_CH); + } + else { if(1 == link_list_num) { @@ -335,11 +343,10 @@ void mt9v03x_vsync(void) DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr); } dma_start(MT9V03X_DMA_CH); + } - } - //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -350,14 +357,25 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); - mt9v03x_dma_int_num++; - if(mt9v03x_dma_int_num >= link_list_num) - { - //采集完成 - mt9v03x_dma_int_num = 0; - mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH)) + {//图像有错位 + mt9v03x_finish_flag = 0; dma_stop(MT9V03X_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH); + mt9v03x_dma_init_flag = 1; + } + else + { + mt9v03x_dma_int_num++; + + if(mt9v03x_dma_int_num >= link_list_num) + { + //采集完成 + mt9v03x_dma_int_num = 0; + mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } } diff --git a/Example/PWM_Demo/Libraries/doc/version.txt b/Example/PWM_Demo/Libraries/doc/version.txt index 9d395a4..e09b8d6 100644 --- a/Example/PWM_Demo/Libraries/doc/version.txt +++ b/Example/PWM_Demo/Libraries/doc/version.txt @@ -1,3 +1,8 @@ +V1.2.2 + 当摄像头图像出现偶发性错位的情况,会重新初始化DMA使得下次采集图像自动恢复正常。 + 总钻风摄像头像素时钟修改为上升沿触发 + 摄像头去掉标志位清零才继续采集下一幅图像的逻辑,避免出现帧率减半的问题 + V1.2.1 解决printf关闭的时候,编译报错的问题 diff --git a/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c index 7b82110..0679b38 100644 --- a/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c +++ b/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -180,7 +180,8 @@ uint8 ov7725_init(void) -uint8 ov7725_finish_flag = 0; +uint8 ov7725_finish_flag = 0; +uint8 ov7725_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -191,8 +192,14 @@ uint8 ov7725_finish_flag = 0; void ov7725_vsync(void) { CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); - - if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_dma_init_flag) + { + ov7725_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_DMA_CH); + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), camera_buffer_addr, OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + dma_start(OV7725_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_DMA_CH, camera_buffer_addr); dma_start(OV7725_DMA_CH); @@ -210,8 +217,18 @@ void ov7725_vsync(void) void ov7725_dma(void) { CLEAR_DMA_FLAG(OV7725_DMA_CH); - ov7725_finish_flag = 1; - dma_stop(OV7725_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH)) + {//图像有错位 + ov7725_finish_flag = 0; + dma_stop(OV7725_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH); + ov7725_dma_init_flag = 1; + } + else + { + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); + } } diff --git a/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c b/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c index 75d2688..c61278e 100644 --- a/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c +++ b/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c @@ -260,7 +260,8 @@ void ov7725_uart_init(void) restoreInterrupts(interrupt_state); } - +uint8 ov7725_uart_finish_flag = 0; +uint8 ov7725_uart_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -271,16 +272,20 @@ void ov7725_uart_init(void) void ov7725_uart_vsync(void) { CLEAR_GPIO_FLAG(OV7725_UART_VSYNC_PIN); - - if(!ov7725_uart_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_uart_dma_init_flag) + { + ov7725_uart_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_UART_DMA_CH); + eru_dma_init(OV7725_UART_DMA_CH, GET_PORT_IN_ADDR(OV7725_UART_DATA_PIN), camera_buffer_addr, OV7725_UART_PCLK_PIN, FALLING, OV7725_UART_DMA_NUM); + dma_start(OV7725_UART_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_UART_DMA_CH, camera_buffer_addr); dma_start(OV7725_UART_DMA_CH); } } - -uint8 ov7725_uart_finish_flag = 0; //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头DMA完成中断 // @param NULL @@ -291,8 +296,18 @@ uint8 ov7725_uart_finish_flag = 0; void ov7725_uart_dma(void) { CLEAR_DMA_FLAG(OV7725_UART_DMA_CH); - ov7725_uart_finish_flag = 1; - dma_stop(OV7725_UART_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH)) + {//图像有错位 + ov7725_uart_finish_flag = 0; + dma_stop(OV7725_UART_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH); + ov7725_uart_dma_init_flag = 1; + } + else + { + ov7725_uart_finish_flag = 1; + dma_stop(OV7725_UART_DMA_CH); + } } diff --git a/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 9ae7d25..f468206 100644 --- a/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/PWM_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -307,15 +307,16 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); } -uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -327,7 +328,14 @@ void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); mt9v03x_dma_int_num = 0; - if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(mt9v03x_dma_init_flag) + { + mt9v03x_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H); + dma_start(MT9V03X_DMA_CH); + } + else { if(1 == link_list_num) { @@ -335,11 +343,10 @@ void mt9v03x_vsync(void) DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr); } dma_start(MT9V03X_DMA_CH); + } - } - //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -350,14 +357,25 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); - mt9v03x_dma_int_num++; - if(mt9v03x_dma_int_num >= link_list_num) - { - //采集完成 - mt9v03x_dma_int_num = 0; - mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH)) + {//图像有错位 + mt9v03x_finish_flag = 0; dma_stop(MT9V03X_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH); + mt9v03x_dma_init_flag = 1; + } + else + { + mt9v03x_dma_int_num++; + + if(mt9v03x_dma_int_num >= link_list_num) + { + //采集完成 + mt9v03x_dma_int_num = 0; + mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } } diff --git a/Example/Printf_Demo/Libraries/doc/version.txt b/Example/Printf_Demo/Libraries/doc/version.txt index 9d395a4..e09b8d6 100644 --- a/Example/Printf_Demo/Libraries/doc/version.txt +++ b/Example/Printf_Demo/Libraries/doc/version.txt @@ -1,3 +1,8 @@ +V1.2.2 + 当摄像头图像出现偶发性错位的情况,会重新初始化DMA使得下次采集图像自动恢复正常。 + 总钻风摄像头像素时钟修改为上升沿触发 + 摄像头去掉标志位清零才继续采集下一幅图像的逻辑,避免出现帧率减半的问题 + V1.2.1 解决printf关闭的时候,编译报错的问题 diff --git a/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c index 7b82110..0679b38 100644 --- a/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c +++ b/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -180,7 +180,8 @@ uint8 ov7725_init(void) -uint8 ov7725_finish_flag = 0; +uint8 ov7725_finish_flag = 0; +uint8 ov7725_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -191,8 +192,14 @@ uint8 ov7725_finish_flag = 0; void ov7725_vsync(void) { CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); - - if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_dma_init_flag) + { + ov7725_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_DMA_CH); + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), camera_buffer_addr, OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + dma_start(OV7725_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_DMA_CH, camera_buffer_addr); dma_start(OV7725_DMA_CH); @@ -210,8 +217,18 @@ void ov7725_vsync(void) void ov7725_dma(void) { CLEAR_DMA_FLAG(OV7725_DMA_CH); - ov7725_finish_flag = 1; - dma_stop(OV7725_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH)) + {//图像有错位 + ov7725_finish_flag = 0; + dma_stop(OV7725_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH); + ov7725_dma_init_flag = 1; + } + else + { + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); + } } diff --git a/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c b/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c index 75d2688..c61278e 100644 --- a/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c +++ b/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c @@ -260,7 +260,8 @@ void ov7725_uart_init(void) restoreInterrupts(interrupt_state); } - +uint8 ov7725_uart_finish_flag = 0; +uint8 ov7725_uart_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -271,16 +272,20 @@ void ov7725_uart_init(void) void ov7725_uart_vsync(void) { CLEAR_GPIO_FLAG(OV7725_UART_VSYNC_PIN); - - if(!ov7725_uart_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_uart_dma_init_flag) + { + ov7725_uart_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_UART_DMA_CH); + eru_dma_init(OV7725_UART_DMA_CH, GET_PORT_IN_ADDR(OV7725_UART_DATA_PIN), camera_buffer_addr, OV7725_UART_PCLK_PIN, FALLING, OV7725_UART_DMA_NUM); + dma_start(OV7725_UART_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_UART_DMA_CH, camera_buffer_addr); dma_start(OV7725_UART_DMA_CH); } } - -uint8 ov7725_uart_finish_flag = 0; //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头DMA完成中断 // @param NULL @@ -291,8 +296,18 @@ uint8 ov7725_uart_finish_flag = 0; void ov7725_uart_dma(void) { CLEAR_DMA_FLAG(OV7725_UART_DMA_CH); - ov7725_uart_finish_flag = 1; - dma_stop(OV7725_UART_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH)) + {//图像有错位 + ov7725_uart_finish_flag = 0; + dma_stop(OV7725_UART_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH); + ov7725_uart_dma_init_flag = 1; + } + else + { + ov7725_uart_finish_flag = 1; + dma_stop(OV7725_UART_DMA_CH); + } } diff --git a/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 9ae7d25..f468206 100644 --- a/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/Printf_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -307,15 +307,16 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); } -uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -327,7 +328,14 @@ void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); mt9v03x_dma_int_num = 0; - if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(mt9v03x_dma_init_flag) + { + mt9v03x_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H); + dma_start(MT9V03X_DMA_CH); + } + else { if(1 == link_list_num) { @@ -335,11 +343,10 @@ void mt9v03x_vsync(void) DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr); } dma_start(MT9V03X_DMA_CH); + } - } - //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -350,14 +357,25 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); - mt9v03x_dma_int_num++; - if(mt9v03x_dma_int_num >= link_list_num) - { - //采集完成 - mt9v03x_dma_int_num = 0; - mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH)) + {//图像有错位 + mt9v03x_finish_flag = 0; dma_stop(MT9V03X_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH); + mt9v03x_dma_init_flag = 1; + } + else + { + mt9v03x_dma_int_num++; + + if(mt9v03x_dma_int_num >= link_list_num) + { + //采集完成 + mt9v03x_dma_int_num = 0; + mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } } diff --git a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/doc/version.txt b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/doc/version.txt index 9d395a4..e09b8d6 100644 --- a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/doc/version.txt +++ b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/doc/version.txt @@ -1,3 +1,8 @@ +V1.2.2 + 当摄像头图像出现偶发性错位的情况,会重新初始化DMA使得下次采集图像自动恢复正常。 + 总钻风摄像头像素时钟修改为上升沿触发 + 摄像头去掉标志位清零才继续采集下一幅图像的逻辑,避免出现帧率减半的问题 + V1.2.1 解决printf关闭的时候,编译报错的问题 diff --git a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c index 7b82110..0679b38 100644 --- a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c +++ b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -180,7 +180,8 @@ uint8 ov7725_init(void) -uint8 ov7725_finish_flag = 0; +uint8 ov7725_finish_flag = 0; +uint8 ov7725_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -191,8 +192,14 @@ uint8 ov7725_finish_flag = 0; void ov7725_vsync(void) { CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); - - if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_dma_init_flag) + { + ov7725_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_DMA_CH); + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), camera_buffer_addr, OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + dma_start(OV7725_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_DMA_CH, camera_buffer_addr); dma_start(OV7725_DMA_CH); @@ -210,8 +217,18 @@ void ov7725_vsync(void) void ov7725_dma(void) { CLEAR_DMA_FLAG(OV7725_DMA_CH); - ov7725_finish_flag = 1; - dma_stop(OV7725_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH)) + {//图像有错位 + ov7725_finish_flag = 0; + dma_stop(OV7725_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH); + ov7725_dma_init_flag = 1; + } + else + { + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); + } } diff --git a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c index 75d2688..c61278e 100644 --- a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c +++ b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c @@ -260,7 +260,8 @@ void ov7725_uart_init(void) restoreInterrupts(interrupt_state); } - +uint8 ov7725_uart_finish_flag = 0; +uint8 ov7725_uart_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -271,16 +272,20 @@ void ov7725_uart_init(void) void ov7725_uart_vsync(void) { CLEAR_GPIO_FLAG(OV7725_UART_VSYNC_PIN); - - if(!ov7725_uart_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_uart_dma_init_flag) + { + ov7725_uart_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_UART_DMA_CH); + eru_dma_init(OV7725_UART_DMA_CH, GET_PORT_IN_ADDR(OV7725_UART_DATA_PIN), camera_buffer_addr, OV7725_UART_PCLK_PIN, FALLING, OV7725_UART_DMA_NUM); + dma_start(OV7725_UART_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_UART_DMA_CH, camera_buffer_addr); dma_start(OV7725_UART_DMA_CH); } } - -uint8 ov7725_uart_finish_flag = 0; //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头DMA完成中断 // @param NULL @@ -291,8 +296,18 @@ uint8 ov7725_uart_finish_flag = 0; void ov7725_uart_dma(void) { CLEAR_DMA_FLAG(OV7725_UART_DMA_CH); - ov7725_uart_finish_flag = 1; - dma_stop(OV7725_UART_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH)) + {//图像有错位 + ov7725_uart_finish_flag = 0; + dma_stop(OV7725_UART_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH); + ov7725_uart_dma_init_flag = 1; + } + else + { + ov7725_uart_finish_flag = 1; + dma_stop(OV7725_UART_DMA_CH); + } } diff --git a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 9ae7d25..f468206 100644 --- a/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/Specifies_Variable_Or_Code_Location_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -307,15 +307,16 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); } -uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -327,7 +328,14 @@ void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); mt9v03x_dma_int_num = 0; - if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(mt9v03x_dma_init_flag) + { + mt9v03x_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H); + dma_start(MT9V03X_DMA_CH); + } + else { if(1 == link_list_num) { @@ -335,11 +343,10 @@ void mt9v03x_vsync(void) DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr); } dma_start(MT9V03X_DMA_CH); + } - } - //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -350,14 +357,25 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); - mt9v03x_dma_int_num++; - if(mt9v03x_dma_int_num >= link_list_num) - { - //采集完成 - mt9v03x_dma_int_num = 0; - mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH)) + {//图像有错位 + mt9v03x_finish_flag = 0; dma_stop(MT9V03X_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH); + mt9v03x_dma_init_flag = 1; + } + else + { + mt9v03x_dma_int_num++; + + if(mt9v03x_dma_int_num >= link_list_num) + { + //采集完成 + mt9v03x_dma_int_num = 0; + mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } } diff --git a/Example/Systick_Demo/Libraries/doc/version.txt b/Example/Systick_Demo/Libraries/doc/version.txt index 9d395a4..e09b8d6 100644 --- a/Example/Systick_Demo/Libraries/doc/version.txt +++ b/Example/Systick_Demo/Libraries/doc/version.txt @@ -1,3 +1,8 @@ +V1.2.2 + 当摄像头图像出现偶发性错位的情况,会重新初始化DMA使得下次采集图像自动恢复正常。 + 总钻风摄像头像素时钟修改为上升沿触发 + 摄像头去掉标志位清零才继续采集下一幅图像的逻辑,避免出现帧率减半的问题 + V1.2.1 解决printf关闭的时候,编译报错的问题 diff --git a/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c index 7b82110..0679b38 100644 --- a/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c +++ b/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -180,7 +180,8 @@ uint8 ov7725_init(void) -uint8 ov7725_finish_flag = 0; +uint8 ov7725_finish_flag = 0; +uint8 ov7725_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -191,8 +192,14 @@ uint8 ov7725_finish_flag = 0; void ov7725_vsync(void) { CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); - - if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_dma_init_flag) + { + ov7725_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_DMA_CH); + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), camera_buffer_addr, OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + dma_start(OV7725_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_DMA_CH, camera_buffer_addr); dma_start(OV7725_DMA_CH); @@ -210,8 +217,18 @@ void ov7725_vsync(void) void ov7725_dma(void) { CLEAR_DMA_FLAG(OV7725_DMA_CH); - ov7725_finish_flag = 1; - dma_stop(OV7725_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH)) + {//图像有错位 + ov7725_finish_flag = 0; + dma_stop(OV7725_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH); + ov7725_dma_init_flag = 1; + } + else + { + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); + } } diff --git a/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c b/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c index 75d2688..c61278e 100644 --- a/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c +++ b/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c @@ -260,7 +260,8 @@ void ov7725_uart_init(void) restoreInterrupts(interrupt_state); } - +uint8 ov7725_uart_finish_flag = 0; +uint8 ov7725_uart_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -271,16 +272,20 @@ void ov7725_uart_init(void) void ov7725_uart_vsync(void) { CLEAR_GPIO_FLAG(OV7725_UART_VSYNC_PIN); - - if(!ov7725_uart_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_uart_dma_init_flag) + { + ov7725_uart_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_UART_DMA_CH); + eru_dma_init(OV7725_UART_DMA_CH, GET_PORT_IN_ADDR(OV7725_UART_DATA_PIN), camera_buffer_addr, OV7725_UART_PCLK_PIN, FALLING, OV7725_UART_DMA_NUM); + dma_start(OV7725_UART_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_UART_DMA_CH, camera_buffer_addr); dma_start(OV7725_UART_DMA_CH); } } - -uint8 ov7725_uart_finish_flag = 0; //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头DMA完成中断 // @param NULL @@ -291,8 +296,18 @@ uint8 ov7725_uart_finish_flag = 0; void ov7725_uart_dma(void) { CLEAR_DMA_FLAG(OV7725_UART_DMA_CH); - ov7725_uart_finish_flag = 1; - dma_stop(OV7725_UART_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH)) + {//图像有错位 + ov7725_uart_finish_flag = 0; + dma_stop(OV7725_UART_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH); + ov7725_uart_dma_init_flag = 1; + } + else + { + ov7725_uart_finish_flag = 1; + dma_stop(OV7725_UART_DMA_CH); + } } diff --git a/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 9ae7d25..f468206 100644 --- a/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/Systick_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -307,15 +307,16 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); } -uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -327,7 +328,14 @@ void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); mt9v03x_dma_int_num = 0; - if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(mt9v03x_dma_init_flag) + { + mt9v03x_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H); + dma_start(MT9V03X_DMA_CH); + } + else { if(1 == link_list_num) { @@ -335,11 +343,10 @@ void mt9v03x_vsync(void) DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr); } dma_start(MT9V03X_DMA_CH); + } - } - //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -350,14 +357,25 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); - mt9v03x_dma_int_num++; - if(mt9v03x_dma_int_num >= link_list_num) - { - //采集完成 - mt9v03x_dma_int_num = 0; - mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH)) + {//图像有错位 + mt9v03x_finish_flag = 0; dma_stop(MT9V03X_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH); + mt9v03x_dma_init_flag = 1; + } + else + { + mt9v03x_dma_int_num++; + + if(mt9v03x_dma_int_num >= link_list_num) + { + //采集完成 + mt9v03x_dma_int_num = 0; + mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } } diff --git a/Example/UART_Demo/Libraries/doc/version.txt b/Example/UART_Demo/Libraries/doc/version.txt index 9d395a4..e09b8d6 100644 --- a/Example/UART_Demo/Libraries/doc/version.txt +++ b/Example/UART_Demo/Libraries/doc/version.txt @@ -1,3 +1,8 @@ +V1.2.2 + 当摄像头图像出现偶发性错位的情况,会重新初始化DMA使得下次采集图像自动恢复正常。 + 总钻风摄像头像素时钟修改为上升沿触发 + 摄像头去掉标志位清零才继续采集下一幅图像的逻辑,避免出现帧率减半的问题 + V1.2.1 解决printf关闭的时候,编译报错的问题 diff --git a/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c index 7b82110..0679b38 100644 --- a/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c +++ b/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -180,7 +180,8 @@ uint8 ov7725_init(void) -uint8 ov7725_finish_flag = 0; +uint8 ov7725_finish_flag = 0; +uint8 ov7725_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -191,8 +192,14 @@ uint8 ov7725_finish_flag = 0; void ov7725_vsync(void) { CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); - - if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_dma_init_flag) + { + ov7725_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_DMA_CH); + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), camera_buffer_addr, OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + dma_start(OV7725_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_DMA_CH, camera_buffer_addr); dma_start(OV7725_DMA_CH); @@ -210,8 +217,18 @@ void ov7725_vsync(void) void ov7725_dma(void) { CLEAR_DMA_FLAG(OV7725_DMA_CH); - ov7725_finish_flag = 1; - dma_stop(OV7725_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH)) + {//图像有错位 + ov7725_finish_flag = 0; + dma_stop(OV7725_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH); + ov7725_dma_init_flag = 1; + } + else + { + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); + } } diff --git a/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c b/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c index 75d2688..c61278e 100644 --- a/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c +++ b/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c @@ -260,7 +260,8 @@ void ov7725_uart_init(void) restoreInterrupts(interrupt_state); } - +uint8 ov7725_uart_finish_flag = 0; +uint8 ov7725_uart_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -271,16 +272,20 @@ void ov7725_uart_init(void) void ov7725_uart_vsync(void) { CLEAR_GPIO_FLAG(OV7725_UART_VSYNC_PIN); - - if(!ov7725_uart_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_uart_dma_init_flag) + { + ov7725_uart_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_UART_DMA_CH); + eru_dma_init(OV7725_UART_DMA_CH, GET_PORT_IN_ADDR(OV7725_UART_DATA_PIN), camera_buffer_addr, OV7725_UART_PCLK_PIN, FALLING, OV7725_UART_DMA_NUM); + dma_start(OV7725_UART_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_UART_DMA_CH, camera_buffer_addr); dma_start(OV7725_UART_DMA_CH); } } - -uint8 ov7725_uart_finish_flag = 0; //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头DMA完成中断 // @param NULL @@ -291,8 +296,18 @@ uint8 ov7725_uart_finish_flag = 0; void ov7725_uart_dma(void) { CLEAR_DMA_FLAG(OV7725_UART_DMA_CH); - ov7725_uart_finish_flag = 1; - dma_stop(OV7725_UART_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH)) + {//图像有错位 + ov7725_uart_finish_flag = 0; + dma_stop(OV7725_UART_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH); + ov7725_uart_dma_init_flag = 1; + } + else + { + ov7725_uart_finish_flag = 1; + dma_stop(OV7725_UART_DMA_CH); + } } diff --git a/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 9ae7d25..f468206 100644 --- a/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Example/UART_Demo/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -307,15 +307,16 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); } -uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -327,7 +328,14 @@ void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); mt9v03x_dma_int_num = 0; - if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(mt9v03x_dma_init_flag) + { + mt9v03x_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H); + dma_start(MT9V03X_DMA_CH); + } + else { if(1 == link_list_num) { @@ -335,11 +343,10 @@ void mt9v03x_vsync(void) DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr); } dma_start(MT9V03X_DMA_CH); + } - } - //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -350,14 +357,25 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); - mt9v03x_dma_int_num++; - if(mt9v03x_dma_int_num >= link_list_num) - { - //采集完成 - mt9v03x_dma_int_num = 0; - mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH)) + {//图像有错位 + mt9v03x_finish_flag = 0; dma_stop(MT9V03X_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH); + mt9v03x_dma_init_flag = 1; + } + else + { + mt9v03x_dma_int_num++; + + if(mt9v03x_dma_int_num >= link_list_num) + { + //采集完成 + mt9v03x_dma_int_num = 0; + mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } } diff --git a/Seekfree_TC264_Opensource_Library/Libraries/doc/version.txt b/Seekfree_TC264_Opensource_Library/Libraries/doc/version.txt index 9d395a4..e09b8d6 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/doc/version.txt +++ b/Seekfree_TC264_Opensource_Library/Libraries/doc/version.txt @@ -1,3 +1,8 @@ +V1.2.2 + 当摄像头图像出现偶发性错位的情况,会重新初始化DMA使得下次采集图像自动恢复正常。 + 总钻风摄像头像素时钟修改为上升沿触发 + 摄像头去掉标志位清零才继续采集下一幅图像的逻辑,避免出现帧率减半的问题 + V1.2.1 解决printf关闭的时候,编译报错的问题 diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_7725.c b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_7725.c index 7b82110..0679b38 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_7725.c +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_7725.c @@ -180,7 +180,8 @@ uint8 ov7725_init(void) -uint8 ov7725_finish_flag = 0; +uint8 ov7725_finish_flag = 0; +uint8 ov7725_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -191,8 +192,14 @@ uint8 ov7725_finish_flag = 0; void ov7725_vsync(void) { CLEAR_GPIO_FLAG(OV7725_VSYNC_PIN); - - if(!ov7725_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_dma_init_flag) + { + ov7725_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_DMA_CH); + eru_dma_init(OV7725_DMA_CH, GET_PORT_IN_ADDR(OV7725_DATA_PIN), camera_buffer_addr, OV7725_PCLK_PIN, FALLING, OV7725_DMA_NUM); + dma_start(OV7725_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_DMA_CH, camera_buffer_addr); dma_start(OV7725_DMA_CH); @@ -210,8 +217,18 @@ void ov7725_vsync(void) void ov7725_dma(void) { CLEAR_DMA_FLAG(OV7725_DMA_CH); - ov7725_finish_flag = 1; - dma_stop(OV7725_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH)) + {//图像有错位 + ov7725_finish_flag = 0; + dma_stop(OV7725_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_DMA_CH); + ov7725_dma_init_flag = 1; + } + else + { + ov7725_finish_flag = 1; + dma_stop(OV7725_DMA_CH); + } } diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c index 75d2688..c61278e 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_7725_UART.c @@ -260,7 +260,8 @@ void ov7725_uart_init(void) restoreInterrupts(interrupt_state); } - +uint8 ov7725_uart_finish_flag = 0; +uint8 ov7725_uart_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头场中断 // @param NULL @@ -271,16 +272,20 @@ void ov7725_uart_init(void) void ov7725_uart_vsync(void) { CLEAR_GPIO_FLAG(OV7725_UART_VSYNC_PIN); - - if(!ov7725_uart_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(ov7725_uart_dma_init_flag) + { + ov7725_uart_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, OV7725_UART_DMA_CH); + eru_dma_init(OV7725_UART_DMA_CH, GET_PORT_IN_ADDR(OV7725_UART_DATA_PIN), camera_buffer_addr, OV7725_UART_PCLK_PIN, FALLING, OV7725_UART_DMA_NUM); + dma_start(OV7725_UART_DMA_CH); + } + else { DMA_SET_DESTINATION(OV7725_UART_DMA_CH, camera_buffer_addr); dma_start(OV7725_UART_DMA_CH); } } - -uint8 ov7725_uart_finish_flag = 0; //------------------------------------------------------------------------------------------------------------------- // @brief 小钻风摄像头DMA完成中断 // @param NULL @@ -291,8 +296,18 @@ uint8 ov7725_uart_finish_flag = 0; void ov7725_uart_dma(void) { CLEAR_DMA_FLAG(OV7725_UART_DMA_CH); - ov7725_uart_finish_flag = 1; - dma_stop(OV7725_UART_DMA_CH); + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH)) + {//图像有错位 + ov7725_uart_finish_flag = 0; + dma_stop(OV7725_UART_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, OV7725_UART_DMA_CH); + ov7725_uart_dma_init_flag = 1; + } + else + { + ov7725_uart_finish_flag = 1; + dma_stop(OV7725_UART_DMA_CH); + } } diff --git a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c index 9ae7d25..f468206 100644 --- a/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c +++ b/Seekfree_TC264_Opensource_Library/Libraries/seekfree_peripheral/SEEKFREE_MT9V03X.c @@ -307,15 +307,16 @@ void mt9v03x_init(void) gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP); } - link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//如果超频到300M 倒数第二个参数请设置为FALLING eru_init(MT9V03X_VSYNC_PIN, FALLING); //初始化场中断,并设置为下降沿触发中断 restoreInterrupts(interrupt_state); } -uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 -uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_finish_flag = 0; //一场图像采集完成标志位 +uint8 mt9v03x_dma_int_num; //当前DMA中断次数 +uint8 mt9v03x_dma_init_flag; //重新初始化DMA的标志位 //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头场中断 // @param NULL @@ -327,7 +328,14 @@ void mt9v03x_vsync(void) { CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN); mt9v03x_dma_int_num = 0; - if(!mt9v03x_finish_flag)//查看图像数组是否使用完毕,如果未使用完毕则不开始采集,避免出现访问冲突 + if(mt9v03x_dma_init_flag) + { + mt9v03x_dma_init_flag = 0; + IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH); + link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H); + dma_start(MT9V03X_DMA_CH); + } + else { if(1 == link_list_num) { @@ -335,11 +343,10 @@ void mt9v03x_vsync(void) DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr); } dma_start(MT9V03X_DMA_CH); + } - } - //------------------------------------------------------------------------------------------------------------------- // @brief MT9V03X摄像头DMA完成中断 // @param NULL @@ -350,14 +357,25 @@ void mt9v03x_vsync(void) void mt9v03x_dma(void) { CLEAR_DMA_FLAG(MT9V03X_DMA_CH); - mt9v03x_dma_int_num++; - if(mt9v03x_dma_int_num >= link_list_num) - { - //采集完成 - mt9v03x_dma_int_num = 0; - mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH)) + {//图像有错位 + mt9v03x_finish_flag = 0; dma_stop(MT9V03X_DMA_CH); + IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH); + mt9v03x_dma_init_flag = 1; + } + else + { + mt9v03x_dma_int_num++; + + if(mt9v03x_dma_int_num >= link_list_num) + { + //采集完成 + mt9v03x_dma_int_num = 0; + mt9v03x_finish_flag = 1;//一副图像从采集开始到采集结束耗时3.8MS左右(50FPS、188*120分辨率) + dma_stop(MT9V03X_DMA_CH); + } } }