//////////////////////////////////////////////////////////////////////////// ///@copyright Copyright (c) 2018, 传控科技 All rights reserved. ///------------------------------------------------------------------------- /// @file bsp_gc6133.c.c /// @brief bsp @ driver config ///------------------------------------------------------------------------- /// @version 1.0 /// @author CC /// @date 20180331 /// @note cc_AS_stc02 ///------------------------------------------------------------------------- /// @version 1.2 /// @author CC /// @date 20180703 /// @note cc_AS_stc02 ////////////////////////////////////////////////////////////////////////////// //#include "Bsp_debug.h" #include "bsp_func.h" #include "bsp_cam_isr.h" #include "bsp_cam.h" #include "../msp/uart0.h" #include "cw63xx.h" #include "../clib/Clib.h" #include "../clib/bit.h" #include "../msp/time.h" #define D_pclk_div_hs 1 ///D_pclk_per_hs*D_pclk_div_hs < 680 ///vs p3.7 int3 ///hs p3.6 int2 ///pclk p3.2 int0 /// row line确可以表示一条线 一行的意思.而column则形象的表示一个纵向的“列 #define D_line_get 10 #define D_row_get2 4 #ifdef doc_98989 vs /```24.8ms````\_______________________________..1.16s..._____________________________________________/```````````\__________ hs /\————————/\_2.14MS_/\____/\____/\____ ...... __/\____/\____/\__480个__/\____/\____/\____/\————————/\ hs /``\________________________hs______________________/``\ pclk |||||||||||||||||||||||||||||||||||||||||||||||640 Line0 L1 L2 L1 L1 L1 L1 L1 L1 L480 ---------------------------------------------------------------------- 1 1 1 1 1 1 1 1 1 --- --- 1 2 2 2 2 2 2 2 2 2 --- --- 2 3 3 3 3 3 3 3 3 3 --- --- 3 4 4 4 4 4 4 4 4 4 --- --- 4 5 5 5 5 5 5 5 5 5 --- --- 5 6 6 6 6 6 6 6 6 6 --- --- 6 7 7 7 7 7 7 7 7 7 --- --- 7 8 8 8 8 8 8 8 8 8 --- --- 8 9 9 9 9 9 9 9 9 9 --- --- 9 10 10 10 10 10 10 10 10 10 --- --- 10 11 11 11 11 11 11 11 11 11 --- --- 11 12 12 12 12 12 12 12 12 12 --- --- 12 13 13 13 13 13 13 13 13 13 --- --- 13 14 14 14 14 14 14 14 14 14 --- --- 14 . . . . . . . . . --- --- . . . . . . . . . . --- --- . . . . . . . . . . --- --- . . . . . . . . . . --- --- . 640 640 640 640 640 640 640 640 640 --- --- 640 #endif ///doc_98989 void L0_cam_isr_init(void) { IT0 = 1;///int0 下降沿触发 = 0 上下沿均可触发 /// IT0 = 0;////int0 下降沿触发 = 0 上下沿均可触发 /// L0_INT0_OPEN(); D_HSYNCS_close(); D_VSYNCS_open(); D_PCLK_close(); } #if(MODE_CAM_LINE == MODE_CAM) #if 0 ////////// /////一帧数据的开始 void L0_VSYNCS_Isr (void) interrupt D_ISR_int3////下降沿 {////找到一帧数据的开头:第一行 L0_INT3_CLEAR(); ///s_task_GC032A.usHs_count = 0; DR_line_n = 0; /// s_task_GC032A.next_line = D_ready;///启动第一行 这样确保帧头是第一行,对齐的/// /// s_task_GC032A.one_line_ok = D_clear; s_task_GC032A.line_get = D_clear; s_task_GC032A.vs_ok = D_ready; //s_task_GC032A.frames ++; //if(s_task_GC032A.frames > 10) {/// 时间溢出 ///s_task_GC032A.frames = 0; } D_ledb_OFF(); /// D_leda_ON(); D_HSYNCS_open(); } /////一行line row数据的开始 void L0_HSYNCS_Isr(void) interrupt D_ISR_int2/// using 1 /下降沿 {///hs 下沿有效 L0_INT2_CLEAR(); //// hs信号的计数在vs有效的时候清零,这样usHs_count=D_row_get就代表 //// 当前一帧画面里面的第D_row_get个hs,也就是一个画面中的第几行数据 ///if(D_ready == s_task_GC032A.next_line) {///D_P33_REV(); //D_leda_OFF(); /// s_task_GC032A.next_line = D_clear;///因为接收一行数据的时间远远小于发送的时间 ///因此添加这个为了提高可靠性 ///发送完了后由“gc032a任务”启动 s_task_GC032A.lines = DR_line_n;////保存当前的行号到缓存中,因为行号变化的速度超过 ////发送的速度,当在"gc032A任务"中使用的时候DR_line_n 已经变化了 ///0 24 58 94 129 165 200 236 271 307 342 378 D_PCLK_open(); //D_P35_REV() ; DR_pclk_n = 0; if(DR_line_n >= D_line_get) { s_task_GC032A.line_get = D_ready; D_HSYNCS_close();D_PCLK_close(); } } DR_line_n ++;///当前行数增加 } ////s_task_GC032A.buf 存放的是一行的数据 //// pclk int0 每个点的采样 void L0_PCLK_Isr(void) interrupt D_ISR_int0 /// using 10/// {///PCLK // D_P34_REV(); DR_Dat = P1; s_task_GC032A.buf[DR_pclk_n] = DR_Dat; // s_task_GC032A.buf[DR_pclk_n] = 0xaa;//P1&0xf0; //s_task_GC032A.buf[s_task_GC032A.usN] = s_task_GC032A.usN; DR_pclk_n++;// D_P34_REV(); if(DR_pclk_n > D_pclk_per_hs)////一行的有效数据接收完成 采样了 D_pclk_per_hs个固定数据 { D_PCLK_close(); //D_ledb_REV() ; DR_pclk_n = D_pclk_per_hs; ///fixme DR_pclk_n = 0; /// s_task_GC032A.one_line_ok = D_ready;////给“gc032a任务”传递消息 可以开始计算或者发送了 D_ledb_ON(); } } #endif #elif(MODE_CAM_FRAME == MODE_CAM) #elif(MODE_CAM_TEST == MODE_CAM) /////连续发送 void L0_VSYNCS_Isr (void) interrupt D_ISR_int3////下降沿 {////找到一帧数据的开头:第一行 ///s_task_GC032A.usHs_count = 0; DR_line_n = 0; s_task_GC032A.next_line = 1;///启动第一行 这样确保帧头是第一行,对齐的/// s_task_GC032A.vs_ok = D_ready; } /////一行line row数据的开始 void L0_HSYNCS_Isr(void) interrupt D_ISR_int2/// using 1 /下降沿 {///hs 下沿有效 //// hs信号的计数在vs有效的时候清零,这样usHs_count=D_row_get就代表 //// 当前一帧画面里面的第D_row_get个hs,也就是一个画面中的第几行数据 if(s_task_GC032A.next_line) {///D_P33_REV(); s_task_GC032A.next_line = 0;///因为接收一行数据的时间远远小于发送的时间 ///因此添加这个为了提高可靠性 ///发送完了后由“gc032a任务”启动 s_task_GC032A.lines = DR_line_n;////保存当前的行号到缓存中,因为行号变化的速度超过 ////发送的速度,当在"gc032A任务"中使用的时候DR_line_n 已经变化了 ///0 24 58 94 129 165 200 236 271 307 342 378 /***** if(D_line_get == DR_line_n) { s_task_GC032A.line_get = 1; } ******/ D_PCLK_open();///启动记录下一行数据 DR_pclk_n = 0; } DR_line_n ++;///当前行数增加 } ////s_task_GC032A.buf 存放的是一行的数据 //// pclk int0 每个点的采样 void L0_PCLK_Isr(void) interrupt D_ISR_int0 //// using 10/// {///PCLK // D_P34_REV(); //// DR_Dat = P1; s_task_GC032A.buf[DR_pclk_n] = DR_Dat; s_task_GC032A.buf[DR_pclk_n] = P1; ////s_task_GC032A.buf[DR_pclk_n] = 0xcc; ///s_task_GC032A.buf[DR_pclk_n] = DR_pclk_n; DR_pclk_n++;// D_P34_REV(); if(DR_pclk_n > D_pclk_per_hs) ////一行的有效数据接收完成 采样了 D_pclk_per_hs个固定数据 { D_PCLK_close(); DR_pclk_n = D_pclk_per_hs; ///fixme s_task_GC032A.line_ok = 1; ////给“gc032a任务”传递消息 可以开始计算或者发送了 } } ////收到 next_line 记录当前第几行lines,启动 pclk,采集数据到buf中,然后line_ok ///// send buf, set next_line after send buf over #endif