Cortex-K60自学笔记(四)

摄像头模块测试

总结:关于摄像头模块,这周是花了自己特别多的时间的,问了特别多次,还好最后测试了完成了摄像头模块的测试。不算一波三折吧,虽然全是学长给的代码,但慢慢的调试过程中,自己也学到了很多知识。

camera.driver.c

#ifndef _CAMERA_DRIVER_H_
#define _CAMERA_DRIVER_H_


//本文件编辑选择宏,0是不编译,1是编译
#define CAMERA_TO_IMAGE_CHOOSE 1

#if CAMERA_TO_IMAGE_CHOOSE==1

#define START_ROW   80
#define END_ROW     185

#endif


//************移置主板宏定义中************
//摄像头引脚分配
#define H_GPIO_PORT          (PTB)
#define H_PIN                (GPIO_Pin23)
#define H_NUM                (23)
#define H_PORT               (PORTB)
#define H_PORT_IRQn          (PORTB_IRQn)

#define V_GPIO_PORT          (PTC)
#define V_PIN                (GPIO_Pin18)
#define V_NUM                (18)
#define V_PORT               (PORTC)
#define V_PORT_IRQn          (PORTC_IRQn)

#define DATA_GPIO_PORT       (PTD)
#define DATA_PIN             (GPIO_Pin0_7)

#define PCLK_GPIO_PORT       (PTC)
#define PCLK_PIN             (GPIO_Pin19)
#define PCLK_NUM             (19)
#define PCLK_PORT            (PORTC)
#define PCLK_DMA_REQn        (PORTC_DMAREQ)


//图像宏定义
#define IMAGE_HEIGHT 64   //提取后图像高度,必须是四的倍数
#define IMAGE_WIDTH 128  //提取后图像宽度

//摄像头的白色为0,黑色为1
//而液晶的白色为1,黑色为0,最终图像由液晶显示,故如下定义
#define IMAGE_WHITE 1    //白像素
#define IMAGE_BLACK 0    //黑像素

#define IMAGE_SIZE (IMAGE_WIDTH * IMAGE_HEIGHT)  //压缩后一副图像大小

//配置摄像头 属性
#define CAMERA_W            320                       //定义摄像头图像宽度
#define CAMERA_H            240                       //定义摄像头图像高度
#define CAMERA_SIZE         (CAMERA_W * CAMERA_H/8)   //图像占用空间大小
#define CAMERA_DMA_NUM      (CAMERA_SIZE)             //DMA采集次数
#define CAMERA_ROW_DMA_NUM  (CAMERA_W / 8)            //行DMA采集次数,必须是4的倍数
#define CAMERA_DATA_NUM     (CAMERA_W * CAMERA_H)     //数据个数
#define CAMERA_FPS          (50)                      //50 or 75 or 112 or 150

//从图中提取的开始位置和结束位置
#define COLUMN_START 25//10
#define COLUMN_END   275//310
#define COLUMN_NUM   250//300

#define ROW_START 0
#define ROW_END   215
#define ROW_NUM   215

//DMA初始化数据
#define DMA_REQ   (PCLK_DMA_REQn) //DMA请求源

#define DMA_CHX                   DMA_CH0                         //DMA选择通道
#define DMA_MAJOR_LOOP            CAMERA_ROW_DMA_NUM              //DMA主循环次数,每行传输完毕后自动关闭
#define DMA_MINER_BYTE            1                               //DMA副循环传输字节数
#define DMA_SOURCE_ADDR           (uint32)&(DATA_GPIO_PORT->PDIR) //传输源地址:PTD0~7
#define DMA_DEST_ADDR             (uint32)gl_Image0               //传输目的地址
#define DMA_SOURCE_DATA_SIZE      DMA_DST_8BIT                    //源数据传输宽度,1个字节
#define DMA_SOURCE_ADDR_OFFSET    0                               //源地址偏移量
#define DMA_DEST_DATA_SIZE        DMA_DST_8BIT                    //目的数据传输宽度
#define DMA_DEST_ADDR_OFFSET      1                               //目的地址偏移量


//摄像头初始化
void Camera_Init();

//摄像头引脚初始化(内部调用)
void Camera_GPIO_Init();

//摄像头DMA初始化(内部调用)
void Camera_DMA_Init();

//使能摄像头
void CameraStart();

//关闭摄像头
void CameraClose();

//解压函数
void ImgExtract(uint8 *, uint8 *, uint32 );//图像解压函数,图像字节数必须是4的倍数!!!

//压缩函数
void ImgCompress_128x64(uint8 *src, uint8 (*image)[IMAGE_WIDTH]);//图像压缩为128行64列

//中断函数
void camera_h_isr();//行中断

void camera_v_isr();//场中断

//摄像头数据处理中断函数
void camera_process_isr();

//均匀地取行取列
void init_get_colrow_array();

#endif

对于头文件分析,比较重要的有以下几个部分:
1.PCLK_DMA_EQRn : 像素点的同步时钟信号。也就是每个PCLK对应一个像素点,与DMA有关,详细的并未了解
2.V_PORT_IRQn:场中断,就是摄像头捕获的一个图像产生的一个中断
3.H_PORT_IRQn:行中断,就是每捕获一行产生一个中断

/*
*本文件用于:
*摄像头的底层驱动,重要的是解压和压缩函数;
*摄像头传输至单片机的图像顺序为由远处到近处,本文件接收其的原始数组存储顺序也是由远存储至近;
*即:gl_Image0[CAMERA_SIZE]、gl_Image1[CAMERA_SIZE],为由远及近;
*ImgExtract(uint8 *src, uint8 *dst, u32 colomn)不改变存储顺序,只进行解压,得到数组gl_ImageFull[CAMERA_W * IMAGE_HEIGHT]也是行小为远,行大为近;
*经ImgCompress_128x64(uint8 *src, uint8 (*image)[IMAGE_WIDTH]),压缩时顺序改变,改为gl_ImageCompress[IMAGE_HEIGHT][IMAGE_WIDTH]行大为远,行小为近;
*显示图像时需要注意调整显示函数:(oled是先显示远后显示近,由oled上方显示到下方,即需要上下颠倒)。
*/

#include "include.h"

uint8 gl_Image0[CAMERA_SIZE];                     //0号dma数据接收数组
uint8 gl_Image1[CAMERA_SIZE];                     //1号dma数据接收数组

uint8 gl_ImageFull[CAMERA_W * IMAGE_HEIGHT];      //由gl_Imagex解压来的储存所有像素点的数组

uint8 gl_ImageCompress[IMAGE_HEIGHT][IMAGE_WIDTH];//压缩后储存图像的最终数组
uint8 gl_now_flag = 0;                     //目前正在存储的图像标志

//取行数组(全局变量)
uint16 row[IMAGE_HEIGHT]={
  86,87,88,89,
  90,91,92,93,94,95,96,97,98,99,
  100,101,102,103,104,105,106,107,108,109,
  111,112,114,115,117,118,119,
  120,123,124,125,127,128,129,
  130,131,132,133,134,135,137,139,
  141,143,145,147,149,
  151,153,155,157,159,
  161,163,165,167,169,
  171,173,175
}
uint16 RowCol[IMAGE_HEIGHT][IMAGE_WIDTH]=
{
63, 65, 66, 68, 69, 71, 72, 74, 75, 77, 
78, 80, 81, 83, 84, 86, 87, 89, 90, 92, 
93, 95, 96, 98, 99, 101, 103, 104, 106, 107, 
109, 110, 112, 113, 115, 116, 118, 119, 121, 122, 
124, 125, 127, 128, 130, 131, 133, 134, 136, 137, 
139, 141, 142, 144, 145, 147, 148, 150, 151, 153, 
154, 156, 157, 159, 160, 162, 163, 165, 166, 168, 
169, 171, 172, 174, 175, 177, 178, 180, 182, 183, 
185, 186, 188, 189, 191, 192, 194, 195, 197, 198, 
200, 201, 203, 204, 206, 207, 209, 210, 212, 213, 
215, 216, 218, 220, 221, 223, 224, 226, 227, 229, 
230, 232, 233, 235, 236, 238, 239, 241, 242, 244, 
245, 247, 248, 250, 251, 253, 254, 256, 
61, 63, 64, 66, 67, 69, 70, 72, 73, 75, 
77, 78, 80, 81, 83, 84, 86, 87, 89, 90, 
92, 94, 95, 97, 98, 100, 101, 103, 104, 106, 
108, 109, 111, 112, 114, 115, 117, 118, 120, 121, 
123, 125, 126, 128, 129, 131, 132, 134, 135, 137, 
139, 140, 142, 143, 145, 146, 148, 149, 151, 153, 
154, 156, 157, 159, 160, 162, 163, 165, 166, 168, 
170, 171, 173, 174, 176, 177, 179, 180, 182, 184, 
185, 187, 188, 190, 191, 193, 194, 196, 198, 199, 
201, 202, 204, 205, 207, 208, 210, 211, 213, 215, 
216, 218, 219, 221, 222, 224, 225, 227, 229, 230, 
232, 233, 235, 236, 238, 239, 241, 242, 244, 246, 
247, 249, 250, 252, 253, 255, 256, 258, 
59, 61, 62, 64, 65, 67, 68, 70, 72, 73, 
75, 76, 78, 80, 81, 83, 84, 86, 87, 89, 
91, 92, 94, 95, 97, 99, 100, 102, 103, 105, 
106, 108, 110, 111, 113, 114, 116, 118, 119, 121, 
122, 124, 125, 127, 129, 130, 132, 133, 135, 137, 
138, 140, 141, 143, 144, 146, 148, 149, 151, 152, 
154, 156, 157, 159, 160, 162, 163, 165, 167, 168, 
170, 171, 173, 175, 176, 178, 179, 181, 182, 184, 
186, 187, 189, 190, 192, 194, 195, 197, 198, 200, 
201, 203, 205, 206, 208, 209, 211, 213, 214, 216, 
217, 219, 220, 222, 224, 225, 227, 228, 230, 232, 
233, 235, 236, 238, 239, 241, 243, 244, 246, 247, 
249, 251, 252, 254, 255, 257, 258, 260, 
57, 59, 60, 62, 63, 65, 67, 68, 70, 72, 
73, 75, 76, 78, 80, 81, 83, 84, 86, 88, 
89, 91, 93, 94, 96, 97, 99, 101, 102, 104, 
105, 107, 109, 110, 112, 113, 115, 117, 118, 120, 
122, 123, 125, 126, 128, 130, 131, 133, 134, 136, 
138, 139, 141, 143, 144, 146, 147, 149, 151, 152, 
154, 155, 157, 159, 160, 162, 164, 165, 167, 168, 
170, 172, 173, 175, 176, 178, 180, 181, 183, 185, 
186, 188, 189, 191, 193, 194, 196, 197, 199, 201, 
202, 204, 206, 207, 209, 210, 212, 214, 215, 217, 
218, 220, 222, 223, 225, 226, 228, 230, 231, 233, 
235, 236, 238, 239, 241, 243, 244, 246, 247, 249, 
251, 252, 254, 256, 257, 259, 260, 262, 
55, 57, 58, 60, 62, 63, 65, 67, 68, 70, 
71, 73, 75, 76, 78, 80, 81, 83, 85, 86, 
88, 90, 91, 93, 94, 96, 98, 99, 101, 103, 
104, 106, 108, 109, 111, 113, 114, 116, 118, 119, 
121, 122, 124, 126, 127, 129, 131, 132, 134, 136, 
137, 139, 141, 142, 144, 146, 147, 149, 150, 152, 
154, 155, 157, 159, 160, 162, 164, 165, 167, 169, 
170, 172, 173, 175, 177, 178, 180, 182, 183, 185, 
187, 188, 190, 192, 193, 195, 197, 198, 200, 201, 
203, 205, 206, 208, 210, 211, 213, 215, 216, 218, 
220, 221, 223, 225, 226, 228, 229, 231, 233, 234, 
236, 238, 239, 241, 243, 244, 246, 248, 249, 251, 
252, 254, 256, 257, 259, 261, 262, 264, 
53, 55, 56, 58, 60, 61, 63, 65, 66, 68, 
70, 71, 73, 75, 76, 78, 80, 82, 83, 85, 
87, 88, 90, 92, 93, 95, 97, 98, 100, 102, 
103, 105, 107, 108, 110, 112, 113, 115, 117, 118, 
120, 122, 123, 125, 127, 128, 130, 132, 134, 135, 
137, 139, 140, 142, 144, 145, 147, 149, 150, 152, 
154, 155, 157, 159, 160, 162, 164, 165, 167, 169, 
170, 172, 174, 175, 177, 179, 180, 182, 184, 185, 
187, 189, 191, 192, 194, 196, 197, 199, 201, 202, 
204, 206, 207, 209, 211, 212, 214, 216, 217, 219, 
221, 222, 224, 226, 227, 229, 231, 232, 234, 236, 
237, 239, 241, 243, 244, 246, 248, 249, 251, 253, 
254, 256, 258, 259, 261, 263, 264, 266, 
51, 53, 54, 56, 58, 60, 61, 63, 65, 66, 
68, 70, 72, 73, 75, 77, 78, 80, 82, 83, 
85, 87, 89, 90, 92, 94, 95, 97, 99, 101, 
102, 104, 106, 107, 109, 111, 113, 114, 116, 118, 
119, 121, 123, 124, 126, 128, 130, 131, 133, 135, 
136, 138, 140, 142, 143, 145, 147, 148, 150, 152, 
154, 155, 157, 159, 160, 162, 164, 165, 167, 169, 
171, 172, 174, 176, 177, 179, 181, 183, 184, 186, 
188, 189, 191, 193, 195, 196, 198, 200, 201, 203, 
205, 206, 208, 210, 212, 213, 215, 217, 218, 220, 
222, 224, 225, 227, 229, 230, 232, 234, 236, 237, 
239, 241, 242, 244, 246, 247, 249, 251, 253, 254, 
256, 258, 259, 261, 263, 265, 266, 268, 
48, 50, 52, 53, 55, 57, 59, 60, 62, 64, 
66, 67, 69, 71, 73, 74, 76, 78, 80, 81, 
83, 85, 87, 88, 90, 92, 94, 95, 97, 99, 
101, 102, 104, 106, 108, 109, 111, 113, 115, 116, 
118, 120, 122, 124, 125, 127, 129, 131, 132, 134, 
136, 138, 139, 141, 143, 145, 146, 148, 150, 152, 
153, 155, 157, 159, 160, 162, 164, 166, 167, 169, 
171, 173, 174, 176, 178, 180, 181, 183, 185, 187, 
188, 190, 192, 194, 195, 197, 199, 201, 203, 204, 
206, 208, 210, 211, 213, 215, 217, 218, 220, 222, 
224, 225, 227, 229, 231, 232, 234, 236, 238, 239, 
241, 243, 245, 246, 248, 250, 252, 253, 255, 257, 
259, 260, 262, 264, 266, 267, 269, 271, 
47, 49, 51, 52, 54, 56, 58, 59, 61, 63, 
65, 66, 68, 70, 72, 74, 75, 77, 79, 81, 
82, 84, 86, 88, 90, 91, 93, 95, 97, 98, 
100, 102, 104, 105, 107, 109, 111, 113, 114, 116, 
118, 120, 121, 123, 125, 127, 128, 130, 132, 134, 
136, 137, 139, 141, 143, 144, 146, 148, 150, 152, 
153, 155, 157, 159, 160, 162, 164, 166, 167, 169, 
171, 173, 175, 176, 178, 180, 182, 183, 185, 187, 
189, 191, 192, 194, 196, 198, 199, 201, 203, 205, 
206, 208, 210, 212, 214, 215, 217, 219, 221, 222, 
224, 226, 228, 229, 231, 233, 235, 237, 238, 240, 
242, 244, 245, 247, 249, 251, 253, 254, 256, 258, 
260, 261, 263, 265, 267, 268, 270, 272, 
45, 47, 49, 50, 52, 54, 56, 58, 59, 61, 
63, 65, 67, 68, 70, 72, 74, 76, 77, 79, 
81, 83, 85, 86, 88, 90, 92, 94, 95, 97, 
99, 101, 103, 105, 106, 108, 110, 112, 114, 115, 
117, 119, 121, 123, 124, 126, 128, 130, 132, 133, 
135, 137, 139, 141, 142, 144, 146, 148, 150, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 169, 
171, 173, 175, 177, 178, 180, 182, 184, 186, 187, 
189, 191, 193, 195, 196, 198, 200, 202, 204, 205, 
207, 209, 211, 213, 214, 216, 218, 220, 222, 224, 
225, 227, 229, 231, 233, 234, 236, 238, 240, 242, 
243, 245, 247, 249, 251, 252, 254, 256, 258, 260, 
261, 263, 265, 267, 269, 270, 272, 274, 
45, 47, 49, 50, 52, 54, 56, 58, 59, 61, 
63, 65, 67, 68, 70, 72, 74, 76, 77, 79, 
81, 83, 85, 86, 88, 90, 92, 94, 95, 97, 
99, 101, 103, 105, 106, 108, 110, 112, 114, 115, 
117, 119, 121, 123, 124, 126, 128, 130, 132, 133, 
135, 137, 139, 141, 142, 144, 146, 148, 150, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 169, 
171, 173, 175, 177, 178, 180, 182, 184, 186, 187, 
189, 191, 193, 195, 196, 198, 200, 202, 204, 205, 
207, 209, 211, 213, 214, 216, 218, 220, 222, 224, 
225, 227, 229, 231, 233, 234, 236, 238, 240, 242, 
243, 245, 247, 249, 251, 252, 254, 256, 258, 260, 
261, 263, 265, 267, 269, 270, 272, 274, 
43, 45, 47, 49, 50, 52, 54, 56, 58, 60, 
61, 63, 65, 67, 69, 71, 72, 74, 76, 78, 
80, 82, 83, 85, 87, 89, 91, 93, 94, 96, 
98, 100, 102, 104, 105, 107, 109, 111, 113, 115, 
116, 118, 120, 122, 124, 126, 127, 129, 131, 133, 
135, 137, 138, 140, 142, 144, 146, 148, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
171, 173, 175, 177, 179, 181, 182, 184, 186, 188, 
190, 192, 193, 195, 197, 199, 201, 203, 204, 206, 
208, 210, 212, 214, 215, 217, 219, 221, 223, 225, 
226, 228, 230, 232, 234, 236, 237, 239, 241, 243, 
245, 247, 248, 250, 252, 254, 256, 258, 259, 261, 
263, 265, 267, 269, 270, 272, 274, 276, 
39, 41, 43, 45, 47, 48, 50, 52, 54, 56, 
58, 60, 62, 64, 66, 67, 69, 71, 73, 75, 
77, 79, 81, 83, 85, 86, 88, 90, 92, 94, 
96, 98, 100, 102, 104, 105, 107, 109, 111, 113, 
115, 117, 119, 121, 122, 124, 126, 128, 130, 132, 
134, 136, 138, 140, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 179, 181, 183, 185, 187, 189, 
191, 193, 195, 197, 198, 200, 202, 204, 206, 208, 
210, 212, 214, 215, 217, 219, 221, 223, 225, 227, 
229, 231, 233, 234, 236, 238, 240, 242, 244, 246, 
248, 250, 252, 253, 255, 257, 259, 261, 263, 265, 
267, 269, 271, 272, 274, 276, 278, 280, 
38, 40, 42, 44, 46, 48, 49, 51, 53, 55, 
57, 59, 61, 63, 65, 67, 69, 71, 72, 74, 
76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 
95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 
115, 116, 118, 120, 122, 124, 126, 128, 130, 132, 
134, 136, 137, 139, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 180, 182, 183, 185, 187, 189, 
191, 193, 195, 197, 199, 201, 203, 204, 206, 208, 
210, 212, 214, 216, 218, 220, 222, 224, 226, 227, 
229, 231, 233, 235, 237, 239, 241, 243, 245, 247, 
248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 
268, 270, 271, 273, 275, 277, 279, 281, 
38, 40, 42, 44, 46, 48, 49, 51, 53, 55, 
57, 59, 61, 63, 65, 67, 69, 71, 72, 74, 
76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 
95, 97, 99, 101, 103, 105, 107, 109, 111, 113, 
115, 116, 118, 120, 122, 124, 126, 128, 130, 132, 
134, 136, 137, 139, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 180, 182, 183, 185, 187, 189, 
191, 193, 195, 197, 199, 201, 203, 204, 206, 208, 
210, 212, 214, 216, 218, 220, 222, 224, 226, 227, 
229, 231, 233, 235, 237, 239, 241, 243, 245, 247, 
248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 
268, 270, 271, 273, 275, 277, 279, 281, 
36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 
55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 
75, 77, 79, 81, 83, 85, 87, 89, 90, 92, 
94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 
114, 116, 118, 120, 122, 124, 125, 127, 129, 131, 
133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 
192, 194, 195, 197, 199, 201, 203, 205, 207, 209, 
211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 
230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 
250, 252, 254, 256, 258, 260, 262, 264, 265, 267, 
269, 271, 273, 275, 277, 279, 281, 283, 
36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 
55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 
75, 77, 79, 81, 83, 85, 87, 89, 90, 92, 
94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 
114, 116, 118, 120, 122, 124, 125, 127, 129, 131, 
133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 
192, 194, 195, 197, 199, 201, 203, 205, 207, 209, 
211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 
230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 
250, 252, 254, 256, 258, 260, 262, 264, 265, 267, 
269, 271, 273, 275, 277, 279, 281, 283, 
35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 
55, 57, 59, 60, 62, 64, 66, 68, 70, 72, 
74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 
94, 96, 98, 100, 102, 104, 106, 108, 110, 111, 
113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 
133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 
192, 194, 196, 198, 200, 202, 204, 206, 208, 209, 
211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 
231, 233, 235, 237, 239, 241, 243, 245, 247, 249, 
251, 253, 255, 257, 259, 260, 262, 264, 266, 268, 
270, 272, 274, 276, 278, 280, 282, 284, 
35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 
55, 57, 59, 60, 62, 64, 66, 68, 70, 72, 
74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 
94, 96, 98, 100, 102, 104, 106, 108, 110, 111, 
113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 
133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 
192, 194, 196, 198, 200, 202, 204, 206, 208, 209, 
211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 
231, 233, 235, 237, 239, 241, 243, 245, 247, 249, 
251, 253, 255, 257, 259, 260, 262, 264, 266, 268, 
270, 272, 274, 276, 278, 280, 282, 284, 
34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 
54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 
74, 76, 77, 79, 81, 83, 85, 87, 89, 91, 
93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 
113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 
133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 
192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 
212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 
232, 234, 236, 238, 240, 242, 243, 245, 247, 249, 
251, 253, 255, 257, 259, 261, 263, 265, 267, 269, 
271, 273, 275, 277, 279, 281, 283, 285, 
33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 
53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 
73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 
93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 
113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 
133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 
192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 
212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 
232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 
252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 
272, 274, 276, 278, 280, 282, 284, 286, 
33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 
53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 
73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 
93, 95, 97, 99, 101, 103, 105, 107, 109, 111, 
113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 
133, 135, 137, 139, 141, 143, 145, 147, 149, 151, 
153, 155, 157, 159, 160, 162, 164, 166, 168, 170, 
172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 
192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 
212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 
232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 
252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 
272, 274, 276, 278, 280, 282, 284, 286, 
29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 
50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 
70, 72, 74, 76, 78, 80, 82, 84, 87, 89, 
91, 93, 95, 97, 99, 101, 103, 105, 107, 109, 
111, 113, 115, 117, 119, 121, 124, 126, 128, 130, 
132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 171, 
173, 175, 177, 179, 181, 183, 185, 187, 189, 191, 
193, 195, 198, 200, 202, 204, 206, 208, 210, 212, 
214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 
235, 237, 239, 241, 243, 245, 247, 249, 251, 253, 
255, 257, 259, 261, 263, 265, 267, 269, 272, 274, 
276, 278, 280, 282, 284, 286, 288, 290, 
28, 30, 32, 34, 36, 38, 40, 42, 45, 47, 
49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 
69, 71, 74, 76, 78, 80, 82, 84, 86, 88, 
90, 92, 94, 96, 98, 100, 103, 105, 107, 109, 
111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 
132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 171, 
173, 175, 177, 179, 181, 183, 185, 187, 190, 192, 
194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 
214, 216, 219, 221, 223, 225, 227, 229, 231, 233, 
235, 237, 239, 241, 243, 245, 248, 250, 252, 254, 
256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 
277, 279, 281, 283, 285, 287, 289, 291, 
28, 30, 32, 34, 36, 38, 40, 42, 45, 47, 
49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 
69, 71, 74, 76, 78, 80, 82, 84, 86, 88, 
90, 92, 94, 96, 98, 100, 103, 105, 107, 109, 
111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 
132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 171, 
173, 175, 177, 179, 181, 183, 185, 187, 190, 192, 
194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 
214, 216, 219, 221, 223, 225, 227, 229, 231, 233, 
235, 237, 239, 241, 243, 245, 248, 250, 252, 254, 
256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 
277, 279, 281, 283, 285, 287, 289, 291, 
25, 27, 29, 31, 33, 36, 38, 40, 42, 44, 
46, 48, 50, 53, 55, 57, 59, 61, 63, 65, 
67, 69, 72, 74, 76, 78, 80, 82, 84, 86, 
89, 91, 93, 95, 97, 99, 101, 103, 105, 108, 
110, 112, 114, 116, 118, 120, 122, 125, 127, 129, 
131, 133, 135, 137, 139, 141, 144, 146, 148, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 171, 
173, 175, 178, 180, 182, 184, 186, 188, 190, 192, 
194, 197, 199, 201, 203, 205, 207, 209, 211, 214, 
216, 218, 220, 222, 224, 226, 228, 230, 233, 235, 
237, 239, 241, 243, 245, 247, 250, 252, 254, 256, 
258, 260, 262, 264, 266, 269, 271, 273, 275, 277, 
279, 281, 283, 286, 288, 290, 292, 294, 
24, 26, 28, 30, 33, 35, 37, 39, 41, 43, 
45, 47, 50, 52, 54, 56, 58, 60, 62, 65, 
67, 69, 71, 73, 75, 77, 79, 82, 84, 86, 
88, 90, 92, 94, 97, 99, 101, 103, 105, 107, 
109, 111, 114, 116, 118, 120, 122, 124, 126, 129, 
131, 133, 135, 137, 139, 141, 143, 146, 148, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 171, 
173, 176, 178, 180, 182, 184, 186, 188, 190, 193, 
195, 197, 199, 201, 203, 205, 208, 210, 212, 214, 
216, 218, 220, 222, 225, 227, 229, 231, 233, 235, 
237, 240, 242, 244, 246, 248, 250, 252, 254, 257, 
259, 261, 263, 265, 267, 269, 272, 274, 276, 278, 
280, 282, 284, 286, 289, 291, 293, 295, 
23, 25, 27, 29, 32, 34, 36, 38, 40, 42, 
44, 47, 49, 51, 53, 55, 57, 60, 62, 64, 
66, 68, 70, 72, 75, 77, 79, 81, 83, 85, 
87, 90, 92, 94, 96, 98, 100, 103, 105, 107, 
109, 111, 113, 115, 118, 120, 122, 124, 126, 128, 
130, 133, 135, 137, 139, 141, 143, 146, 148, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 171, 
173, 176, 178, 180, 182, 184, 186, 189, 191, 193, 
195, 197, 199, 201, 204, 206, 208, 210, 212, 214, 
216, 219, 221, 223, 225, 227, 229, 232, 234, 236, 
238, 240, 242, 244, 247, 249, 251, 253, 255, 257, 
259, 262, 264, 266, 268, 270, 272, 275, 277, 279, 
281, 283, 285, 287, 290, 292, 294, 296, 
23, 25, 27, 29, 32, 34, 36, 38, 40, 42, 
44, 47, 49, 51, 53, 55, 57, 60, 62, 64, 
66, 68, 70, 72, 75, 77, 79, 81, 83, 85, 
87, 90, 92, 94, 96, 98, 100, 103, 105, 107, 
109, 111, 113, 115, 118, 120, 122, 124, 126, 128, 
130, 133, 135, 137, 139, 141, 143, 146, 148, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 171, 
173, 176, 178, 180, 182, 184, 186, 189, 191, 193, 
195, 197, 199, 201, 204, 206, 208, 210, 212, 214, 
216, 219, 221, 223, 225, 227, 229, 232, 234, 236, 
238, 240, 242, 244, 247, 249, 251, 253, 255, 257, 
259, 262, 264, 266, 268, 270, 272, 275, 277, 279, 
281, 283, 285, 287, 290, 292, 294, 296, 
20, 22, 24, 27, 29, 31, 33, 35, 38, 40, 
42, 44, 46, 49, 51, 53, 55, 57, 60, 62, 
64, 66, 68, 71, 73, 75, 77, 79, 82, 84, 
86, 88, 90, 92, 95, 97, 99, 101, 103, 106, 
108, 110, 112, 114, 117, 119, 121, 123, 125, 128, 
130, 132, 134, 136, 139, 141, 143, 145, 147, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 172, 
174, 176, 178, 180, 183, 185, 187, 189, 191, 194, 
196, 198, 200, 202, 205, 207, 209, 211, 213, 216, 
218, 220, 222, 224, 227, 229, 231, 233, 235, 237, 
240, 242, 244, 246, 248, 251, 253, 255, 257, 259, 
262, 264, 266, 268, 270, 273, 275, 277, 279, 281, 
284, 286, 288, 290, 292, 295, 297, 299, 
20, 22, 24, 27, 29, 31, 33, 35, 38, 40, 
42, 44, 46, 49, 51, 53, 55, 57, 60, 62, 
64, 66, 68, 71, 73, 75, 77, 79, 82, 84, 
86, 88, 90, 92, 95, 97, 99, 101, 103, 106, 
108, 110, 112, 114, 117, 119, 121, 123, 125, 128, 
130, 132, 134, 136, 139, 141, 143, 145, 147, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 172, 
174, 176, 178, 180, 183, 185, 187, 189, 191, 194, 
196, 198, 200, 202, 205, 207, 209, 211, 213, 216, 
218, 220, 222, 224, 227, 229, 231, 233, 235, 237, 
240, 242, 244, 246, 248, 251, 253, 255, 257, 259, 
262, 264, 266, 268, 270, 273, 275, 277, 279, 281, 
284, 286, 288, 290, 292, 295, 297, 299, 
19, 21, 23, 26, 28, 30, 32, 34, 37, 39, 
41, 43, 46, 48, 50, 52, 54, 57, 59, 61, 
63, 65, 68, 70, 72, 74, 77, 79, 81, 83, 
85, 88, 90, 92, 94, 96, 99, 101, 103, 105, 
108, 110, 112, 114, 116, 119, 121, 123, 125, 127, 
130, 132, 134, 136, 138, 141, 143, 145, 147, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 172, 
174, 176, 178, 181, 183, 185, 187, 189, 192, 194, 
196, 198, 200, 203, 205, 207, 209, 211, 214, 216, 
218, 220, 223, 225, 227, 229, 231, 234, 236, 238, 
240, 242, 245, 247, 249, 251, 254, 256, 258, 260, 
262, 265, 267, 269, 271, 273, 276, 278, 280, 282, 
285, 287, 289, 291, 293, 296, 298, 300, 
19, 21, 23, 26, 28, 30, 32, 34, 37, 39, 
41, 43, 46, 48, 50, 52, 54, 57, 59, 61, 
63, 65, 68, 70, 72, 74, 77, 79, 81, 83, 
85, 88, 90, 92, 94, 96, 99, 101, 103, 105, 
108, 110, 112, 114, 116, 119, 121, 123, 125, 127, 
130, 132, 134, 136, 138, 141, 143, 145, 147, 150, 
152, 154, 156, 158, 161, 163, 165, 167, 169, 172, 
174, 176, 178, 181, 183, 185, 187, 189, 192, 194, 
196, 198, 200, 203, 205, 207, 209, 211, 214, 216, 
218, 220, 223, 225, 227, 229, 231, 234, 236, 238, 
240, 242, 245, 247, 249, 251, 254, 256, 258, 260, 
262, 265, 267, 269, 271, 273, 276, 278, 280, 282, 
285, 287, 289, 291, 293, 296, 298, 300, 
18, 20, 22, 25, 27, 29, 31, 34, 36, 38, 
40, 43, 45, 47, 49, 51, 54, 56, 58, 60, 
63, 65, 67, 69, 71, 74, 76, 78, 80, 83, 
85, 87, 89, 92, 94, 96, 98, 100, 103, 105, 
107, 109, 112, 114, 116, 118, 121, 123, 125, 127, 
129, 132, 134, 136, 138, 141, 143, 145, 147, 149, 
152, 154, 156, 158, 161, 163, 165, 167, 170, 172, 
174, 176, 178, 181, 183, 185, 187, 190, 192, 194, 
196, 198, 201, 203, 205, 207, 210, 212, 214, 216, 
219, 221, 223, 225, 227, 230, 232, 234, 236, 239, 
241, 243, 245, 248, 250, 252, 254, 256, 259, 261, 
263, 265, 268, 270, 272, 274, 276, 279, 281, 283, 
285, 288, 290, 292, 294, 297, 299, 301, 
16, 18, 21, 23, 25, 27, 30, 32, 34, 36, 
39, 41, 43, 45, 48, 50, 52, 54, 57, 59, 
61, 63, 66, 68, 70, 72, 75, 77, 79, 82, 
84, 86, 88, 91, 93, 95, 97, 100, 102, 104, 
106, 109, 111, 113, 115, 118, 120, 122, 124, 127, 
129, 131, 134, 136, 138, 140, 143, 145, 147, 149, 
152, 154, 156, 158, 161, 163, 165, 167, 170, 172, 
174, 176, 179, 181, 183, 185, 188, 190, 192, 195, 
197, 199, 201, 204, 206, 208, 210, 213, 215, 217, 
219, 222, 224, 226, 228, 231, 233, 235, 237, 240, 
242, 244, 247, 249, 251, 253, 256, 258, 260, 262, 
265, 267, 269, 271, 274, 276, 278, 280, 283, 285, 
287, 289, 292, 294, 296, 298, 301, 303, 
16, 18, 21, 23, 25, 27, 30, 32, 34, 36, 
39, 41, 43, 45, 48, 50, 52, 54, 57, 59, 
61, 63, 66, 68, 70, 72, 75, 77, 79, 82, 
84, 86, 88, 91, 93, 95, 97, 100, 102, 104, 
106, 109, 111, 113, 115, 118, 120, 122, 124, 127, 
129, 131, 134, 136, 138, 140, 143, 145, 147, 149, 
152, 154, 156, 158, 161, 163, 165, 167, 170, 172, 
174, 176, 179, 181, 183, 185, 188, 190, 192, 195, 
197, 199, 201, 204, 206, 208, 210, 213, 215, 217, 
219, 222, 224, 226, 228, 231, 233, 235, 237, 240, 
242, 244, 247, 249, 251, 253, 256, 258, 260, 262, 
265, 267, 269, 271, 274, 276, 278, 280, 283, 285, 
287, 289, 292, 294, 296, 298, 301, 303, 
15, 17, 20, 22, 24, 26, 29, 31, 33, 35, 
38, 40, 42, 45, 47, 49, 51, 54, 56, 58, 
61, 63, 65, 67, 70, 72, 74, 76, 79, 81, 
83, 86, 88, 90, 92, 95, 97, 99, 101, 104, 
106, 108, 111, 113, 115, 117, 120, 122, 124, 127, 
129, 131, 133, 136, 138, 140, 142, 145, 147, 149, 
152, 154, 156, 158, 161, 163, 165, 167, 170, 172, 
174, 177, 179, 181, 183, 186, 188, 190, 192, 195, 
197, 199, 202, 204, 206, 208, 211, 213, 215, 218, 
220, 222, 224, 227, 229, 231, 233, 236, 238, 240, 
243, 245, 247, 249, 252, 254, 256, 258, 261, 263, 
265, 268, 270, 272, 274, 277, 279, 281, 284, 286, 
288, 290, 293, 295, 297, 299, 302, 304, 
15, 17, 20, 22, 24, 26, 29, 31, 33, 35, 
38, 40, 42, 45, 47, 49, 51, 54, 56, 58, 
61, 63, 65, 67, 70, 72, 74, 76, 79, 81, 
83, 86, 88, 90, 92, 95, 97, 99, 101, 104, 
106, 108, 111, 113, 115, 117, 120, 122, 124, 127, 
129, 131, 133, 136, 138, 140, 142, 145, 147, 149, 
152, 154, 156, 158, 161, 163, 165, 167, 170, 172, 
174, 177, 179, 181, 183, 186, 188, 190, 192, 195, 
197, 199, 202, 204, 206, 208, 211, 213, 215, 218, 
220, 222, 224, 227, 229, 231, 233, 236, 238, 240, 
243, 245, 247, 249, 252, 254, 256, 258, 261, 263, 
265, 268, 270, 272, 274, 277, 279, 281, 284, 286, 
288, 290, 293, 295, 297, 299, 302, 304, 
15, 17, 20, 22, 24, 26, 29, 31, 33, 35, 
38, 40, 42, 45, 47, 49, 51, 54, 56, 58, 
61, 63, 65, 67, 70, 72, 74, 76, 79, 81, 
83, 86, 88, 90, 92, 95, 97, 99, 101, 104, 
106, 108, 111, 113, 115, 117, 120, 122, 124, 127, 
129, 131, 133, 136, 138, 140, 142, 145, 147, 149, 
152, 154, 156, 158, 161, 163, 165, 167, 170, 172, 
174, 177, 179, 181, 183, 186, 188, 190, 192, 195, 
197, 199, 202, 204, 206, 208, 211, 213, 215, 218, 
220, 222, 224, 227, 229, 231, 233, 236, 238, 240, 
243, 245, 247, 249, 252, 254, 256, 258, 261, 263, 
265, 268, 270, 272, 274, 277, 279, 281, 284, 286, 
288, 290, 293, 295, 297, 299, 302, 304, 
14, 16, 19, 21, 23, 25, 28, 30, 32, 35, 
37, 39, 41, 44, 46, 48, 51, 53, 55, 58, 
60, 62, 64, 67, 69, 71, 74, 76, 78, 80, 
83, 85, 87, 90, 92, 94, 96, 99, 101, 103, 
106, 108, 110, 113, 115, 117, 119, 122, 124, 126, 
129, 131, 133, 135, 138, 140, 142, 145, 147, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 172, 
174, 177, 179, 181, 184, 186, 188, 190, 193, 195, 
197, 200, 202, 204, 206, 209, 211, 213, 216, 218, 
220, 223, 225, 227, 229, 232, 234, 236, 239, 241, 
243, 245, 248, 250, 252, 255, 257, 259, 261, 264, 
266, 268, 271, 273, 275, 278, 280, 282, 284, 287, 
289, 291, 294, 296, 298, 300, 303, 305, 
13, 15, 18, 20, 22, 25, 27, 29, 31, 34, 
36, 38, 41, 43, 45, 48, 50, 52, 55, 57, 
59, 61, 64, 66, 68, 71, 73, 75, 78, 80, 
82, 85, 87, 89, 91, 94, 96, 98, 101, 103, 
105, 108, 110, 112, 115, 117, 119, 121, 124, 126, 
128, 131, 133, 135, 138, 140, 142, 145, 147, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 172, 
174, 177, 179, 181, 184, 186, 188, 191, 193, 195, 
198, 200, 202, 204, 207, 209, 211, 214, 216, 218, 
221, 223, 225, 228, 230, 232, 234, 237, 239, 241, 
244, 246, 248, 251, 253, 255, 258, 260, 262, 264, 
267, 269, 271, 274, 276, 278, 281, 283, 285, 288, 
290, 292, 294, 297, 299, 301, 304, 306, 
13, 15, 18, 20, 22, 25, 27, 29, 31, 34, 
36, 38, 41, 43, 45, 48, 50, 52, 55, 57, 
59, 61, 64, 66, 68, 71, 73, 75, 78, 80, 
82, 85, 87, 89, 91, 94, 96, 98, 101, 103, 
105, 108, 110, 112, 115, 117, 119, 121, 124, 126, 
128, 131, 133, 135, 138, 140, 142, 145, 147, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 172, 
174, 177, 179, 181, 184, 186, 188, 191, 193, 195, 
198, 200, 202, 204, 207, 209, 211, 214, 216, 218, 
221, 223, 225, 228, 230, 232, 234, 237, 239, 241, 
244, 246, 248, 251, 253, 255, 258, 260, 262, 264, 
267, 269, 271, 274, 276, 278, 281, 283, 285, 288, 
290, 292, 294, 297, 299, 301, 304, 306, 
12, 14, 17, 19, 21, 24, 26, 28, 31, 33, 
35, 38, 40, 42, 45, 47, 49, 51, 54, 56, 
58, 61, 63, 65, 68, 70, 72, 75, 77, 79, 
82, 84, 86, 89, 91, 93, 96, 98, 100, 103, 
105, 107, 110, 112, 114, 117, 119, 121, 123, 126, 
128, 130, 133, 135, 137, 140, 142, 144, 147, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 172, 
175, 177, 179, 182, 184, 186, 189, 191, 193, 196, 
198, 200, 202, 205, 207, 209, 212, 214, 216, 219, 
221, 223, 226, 228, 230, 233, 235, 237, 240, 242, 
244, 247, 249, 251, 254, 256, 258, 261, 263, 265, 
268, 270, 272, 274, 277, 279, 281, 284, 286, 288, 
291, 293, 295, 298, 300, 302, 305, 307, 
10, 12, 15, 17, 19, 22, 24, 26, 29, 31, 
34, 36, 38, 41, 43, 45, 48, 50, 52, 55, 
57, 59, 62, 64, 67, 69, 71, 74, 76, 78, 
81, 83, 85, 88, 90, 92, 95, 97, 99, 102, 
104, 107, 109, 111, 114, 116, 118, 121, 123, 125, 
128, 130, 132, 135, 137, 139, 142, 144, 147, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 172, 
175, 177, 180, 182, 184, 187, 189, 191, 194, 196, 
198, 201, 203, 205, 208, 210, 212, 215, 217, 220, 
222, 224, 227, 229, 231, 234, 236, 238, 241, 243, 
245, 248, 250, 252, 255, 257, 260, 262, 264, 267, 
269, 271, 274, 276, 278, 281, 283, 285, 288, 290, 
293, 295, 297, 300, 302, 304, 307, 309, 
9, 11, 14, 16, 18, 21, 23, 26, 28, 30, 
33, 35, 37, 40, 42, 45, 47, 49, 52, 54, 
56, 59, 61, 64, 66, 68, 71, 73, 75, 78, 
80, 82, 85, 87, 90, 92, 94, 97, 99, 101, 
104, 106, 109, 111, 113, 116, 118, 120, 123, 125, 
128, 130, 132, 135, 137, 139, 142, 144, 146, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 173, 
175, 177, 180, 182, 184, 187, 189, 191, 194, 196, 
199, 201, 203, 206, 208, 210, 213, 215, 218, 220, 
222, 225, 227, 229, 232, 234, 237, 239, 241, 244, 
246, 248, 251, 253, 255, 258, 260, 263, 265, 267, 
270, 272, 274, 277, 279, 282, 284, 286, 289, 291, 
293, 296, 298, 301, 303, 305, 308, 310, 
9, 11, 14, 16, 18, 21, 23, 26, 28, 30, 
33, 35, 37, 40, 42, 45, 47, 49, 52, 54, 
56, 59, 61, 64, 66, 68, 71, 73, 75, 78, 
80, 82, 85, 87, 90, 92, 94, 97, 99, 101, 
104, 106, 109, 111, 113, 116, 118, 120, 123, 125, 
128, 130, 132, 135, 137, 139, 142, 144, 146, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 173, 
175, 177, 180, 182, 184, 187, 189, 191, 194, 196, 
199, 201, 203, 206, 208, 210, 213, 215, 218, 220, 
222, 225, 227, 229, 232, 234, 237, 239, 241, 244, 
246, 248, 251, 253, 255, 258, 260, 263, 265, 267, 
270, 272, 274, 277, 279, 282, 284, 286, 289, 291, 
293, 296, 298, 301, 303, 305, 308, 310, 
8, 10, 13, 15, 18, 20, 22, 25, 27, 29, 
32, 34, 37, 39, 41, 44, 46, 49, 51, 53, 
56, 58, 60, 63, 65, 68, 70, 72, 75, 77, 
80, 82, 84, 87, 89, 92, 94, 96, 99, 101, 
103, 106, 108, 111, 113, 115, 118, 120, 123, 125, 
127, 130, 132, 134, 137, 139, 142, 144, 146, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 173, 
175, 177, 180, 182, 185, 187, 189, 192, 194, 196, 
199, 201, 204, 206, 208, 211, 213, 216, 218, 220, 
223, 225, 227, 230, 232, 235, 237, 239, 242, 244, 
247, 249, 251, 254, 256, 259, 261, 263, 266, 268, 
270, 273, 275, 278, 280, 282, 285, 287, 290, 292, 
294, 297, 299, 301, 304, 306, 309, 311, 
8, 10, 13, 15, 18, 20, 22, 25, 27, 29, 
32, 34, 37, 39, 41, 44, 46, 49, 51, 53, 
56, 58, 60, 63, 65, 68, 70, 72, 75, 77, 
80, 82, 84, 87, 89, 92, 94, 96, 99, 101, 
103, 106, 108, 111, 113, 115, 118, 120, 123, 125, 
127, 130, 132, 134, 137, 139, 142, 144, 146, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 173, 
175, 177, 180, 182, 185, 187, 189, 192, 194, 196, 
199, 201, 204, 206, 208, 211, 213, 216, 218, 220, 
223, 225, 227, 230, 232, 235, 237, 239, 242, 244, 
247, 249, 251, 254, 256, 259, 261, 263, 266, 268, 
270, 273, 275, 278, 280, 282, 285, 287, 290, 292, 
294, 297, 299, 301, 304, 306, 309, 311, 
8, 10, 13, 15, 18, 20, 22, 25, 27, 29, 
32, 34, 37, 39, 41, 44, 46, 49, 51, 53, 
56, 58, 60, 63, 65, 68, 70, 72, 75, 77, 
80, 82, 84, 87, 89, 92, 94, 96, 99, 101, 
103, 106, 108, 111, 113, 115, 118, 120, 123, 125, 
127, 130, 132, 134, 137, 139, 142, 144, 146, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 173, 
175, 177, 180, 182, 185, 187, 189, 192, 194, 196, 
199, 201, 204, 206, 208, 211, 213, 216, 218, 220, 
223, 225, 227, 230, 232, 235, 237, 239, 242, 244, 
247, 249, 251, 254, 256, 259, 261, 263, 266, 268, 
270, 273, 275, 278, 280, 282, 285, 287, 290, 292, 
294, 297, 299, 301, 304, 306, 309, 311, 
8, 10, 13, 15, 18, 20, 22, 25, 27, 29, 
32, 34, 37, 39, 41, 44, 46, 49, 51, 53, 
56, 58, 60, 63, 65, 68, 70, 72, 75, 77, 
80, 82, 84, 87, 89, 92, 94, 96, 99, 101, 
103, 106, 108, 111, 113, 115, 118, 120, 123, 125, 
127, 130, 132, 134, 137, 139, 142, 144, 146, 149, 
151, 154, 156, 158, 161, 163, 165, 168, 170, 173, 
175, 177, 180, 182, 185, 187, 189, 192, 194, 196, 
199, 201, 204, 206, 208, 211, 213, 216, 218, 220, 
223, 225, 227, 230, 232, 235, 237, 239, 242, 244, 
247, 249, 251, 254, 256, 259, 261, 263, 266, 268, 
270, 273, 275, 278, 280, 282, 285, 287, 290, 292, 
294, 297, 299, 301, 304, 306, 309, 311, 
7, 9, 12, 14, 17, 19, 21, 24, 26, 29, 
31, 33, 36, 38, 41, 43, 45, 48, 50, 53, 
55, 57, 60, 62, 65, 67, 69, 72, 74, 77, 
79, 81, 84, 86, 89, 91, 93, 96, 98, 101, 
103, 105, 108, 110, 113, 115, 117, 120, 122, 125, 
127, 129, 132, 134, 137, 139, 141, 144, 146, 149, 
151, 153, 156, 158, 161, 163, 166, 168, 170, 173, 
175, 178, 180, 182, 185, 187, 190, 192, 194, 197, 
199, 202, 204, 206, 209, 211, 214, 216, 218, 221, 
223, 226, 228, 230, 233, 235, 238, 240, 242, 245, 
247, 250, 252, 254, 257, 259, 262, 264, 266, 269, 
271, 274, 276, 278, 281, 283, 286, 288, 290, 293, 
295, 298, 300, 302, 305, 307, 310, 312, 
6, 8, 11, 13, 16, 18, 21, 23, 25, 28, 
30, 33, 35, 37, 40, 42, 45, 47, 50, 52, 
54, 57, 59, 62, 64, 66, 69, 71, 74, 76, 
79, 81, 83, 86, 88, 91, 93, 95, 98, 100, 
103, 105, 108, 110, 112, 115, 117, 120, 122, 124, 
127, 129, 132, 134, 137, 139, 141, 144, 146, 149, 
151, 153, 156, 158, 161, 163, 166, 168, 170, 173, 
175, 178, 180, 182, 185, 187, 190, 192, 195, 197, 
199, 202, 204, 207, 209, 211, 214, 216, 219, 221, 
224, 226, 228, 231, 233, 236, 238, 240, 243, 245, 
248, 250, 253, 255, 257, 260, 262, 265, 267, 269, 
272, 274, 277, 279, 282, 284, 286, 289, 291, 294, 
296, 298, 301, 303, 306, 308, 311, 313, 
4, 6, 9, 11, 14, 16, 19, 21, 24, 26, 
28, 31, 33, 36, 38, 41, 43, 46, 48, 51, 
53, 55, 58, 60, 63, 65, 68, 70, 73, 75, 
77, 80, 82, 85, 87, 90, 92, 95, 97, 100, 
102, 104, 107, 109, 112, 114, 117, 119, 122, 124, 
126, 129, 131, 134, 136, 139, 141, 144, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
175, 178, 180, 183, 185, 188, 190, 193, 195, 197, 
200, 202, 205, 207, 210, 212, 215, 217, 219, 222, 
224, 227, 229, 232, 234, 237, 239, 242, 244, 246, 
249, 251, 254, 256, 259, 261, 264, 266, 268, 271, 
273, 276, 278, 281, 283, 286, 288, 291, 293, 295, 
298, 300, 303, 305, 308, 310, 313, 315, 
4, 6, 9, 11, 14, 16, 19, 21, 24, 26, 
28, 31, 33, 36, 38, 41, 43, 46, 48, 51, 
53, 55, 58, 60, 63, 65, 68, 70, 73, 75, 
77, 80, 82, 85, 87, 90, 92, 95, 97, 100, 
102, 104, 107, 109, 112, 114, 117, 119, 122, 124, 
126, 129, 131, 134, 136, 139, 141, 144, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
175, 178, 180, 183, 185, 188, 190, 193, 195, 197, 
200, 202, 205, 207, 210, 212, 215, 217, 219, 222, 
224, 227, 229, 232, 234, 237, 239, 242, 244, 246, 
249, 251, 254, 256, 259, 261, 264, 266, 268, 271, 
273, 276, 278, 281, 283, 286, 288, 291, 293, 295, 
298, 300, 303, 305, 308, 310, 313, 315, 
3, 5, 8, 10, 13, 15, 18, 20, 23, 25, 
28, 30, 33, 35, 38, 40, 42, 45, 47, 50, 
52, 55, 57, 60, 62, 65, 67, 70, 72, 74, 
77, 79, 82, 84, 87, 89, 92, 94, 97, 99, 
102, 104, 107, 109, 111, 114, 116, 119, 121, 124, 
126, 129, 131, 134, 136, 139, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 180, 183, 185, 188, 190, 193, 195, 198, 
200, 203, 205, 208, 210, 212, 215, 217, 220, 222, 
225, 227, 230, 232, 235, 237, 240, 242, 245, 247, 
249, 252, 254, 257, 259, 262, 264, 267, 269, 272, 
274, 277, 279, 281, 284, 286, 289, 291, 294, 296, 
299, 301, 304, 306, 309, 311, 314, 316, 
3, 5, 8, 10, 13, 15, 18, 20, 23, 25, 
28, 30, 33, 35, 38, 40, 42, 45, 47, 50, 
52, 55, 57, 60, 62, 65, 67, 70, 72, 74, 
77, 79, 82, 84, 87, 89, 92, 94, 97, 99, 
102, 104, 107, 109, 111, 114, 116, 119, 121, 124, 
126, 129, 131, 134, 136, 139, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 180, 183, 185, 188, 190, 193, 195, 198, 
200, 203, 205, 208, 210, 212, 215, 217, 220, 222, 
225, 227, 230, 232, 235, 237, 240, 242, 245, 247, 
249, 252, 254, 257, 259, 262, 264, 267, 269, 272, 
274, 277, 279, 281, 284, 286, 289, 291, 294, 296, 
299, 301, 304, 306, 309, 311, 314, 316, 
3, 5, 8, 10, 13, 15, 18, 20, 23, 25, 
28, 30, 33, 35, 38, 40, 42, 45, 47, 50, 
52, 55, 57, 60, 62, 65, 67, 70, 72, 74, 
77, 79, 82, 84, 87, 89, 92, 94, 97, 99, 
102, 104, 107, 109, 111, 114, 116, 119, 121, 124, 
126, 129, 131, 134, 136, 139, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 180, 183, 185, 188, 190, 193, 195, 198, 
200, 203, 205, 208, 210, 212, 215, 217, 220, 222, 
225, 227, 230, 232, 235, 237, 240, 242, 245, 247, 
249, 252, 254, 257, 259, 262, 264, 267, 269, 272, 
274, 277, 279, 281, 284, 286, 289, 291, 294, 296, 
299, 301, 304, 306, 309, 311, 314, 316, 
3, 5, 8, 10, 13, 15, 18, 20, 23, 25, 
28, 30, 33, 35, 38, 40, 42, 45, 47, 50, 
52, 55, 57, 60, 62, 65, 67, 70, 72, 74, 
77, 79, 82, 84, 87, 89, 92, 94, 97, 99, 
102, 104, 107, 109, 111, 114, 116, 119, 121, 124, 
126, 129, 131, 134, 136, 139, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 180, 183, 185, 188, 190, 193, 195, 198, 
200, 203, 205, 208, 210, 212, 215, 217, 220, 222, 
225, 227, 230, 232, 235, 237, 240, 242, 245, 247, 
249, 252, 254, 257, 259, 262, 264, 267, 269, 272, 
274, 277, 279, 281, 284, 286, 289, 291, 294, 296, 
299, 301, 304, 306, 309, 311, 314, 316, 
2, 4, 7, 9, 12, 14, 17, 19, 22, 24, 
27, 29, 32, 34, 37, 39, 42, 44, 47, 49, 
52, 54, 57, 59, 62, 64, 66, 69, 71, 74, 
76, 79, 81, 84, 86, 89, 91, 94, 96, 99, 
101, 104, 106, 109, 111, 114, 116, 119, 121, 124, 
126, 128, 131, 133, 136, 138, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 181, 183, 186, 188, 191, 193, 195, 198, 
200, 203, 205, 208, 210, 213, 215, 218, 220, 223, 
225, 228, 230, 233, 235, 238, 240, 243, 245, 248, 
250, 253, 255, 257, 260, 262, 265, 267, 270, 272, 
275, 277, 280, 282, 285, 287, 290, 292, 295, 297, 
300, 302, 305, 307, 310, 312, 315, 317, 
1, 3, 6, 8, 11, 13, 16, 18, 21, 23, 
26, 28, 31, 33, 36, 38, 41, 43, 46, 48, 
51, 53, 56, 58, 61, 63, 66, 68, 71, 73, 
76, 78, 81, 83, 86, 88, 91, 93, 96, 98, 
101, 103, 106, 108, 111, 113, 116, 118, 121, 123, 
126, 128, 131, 133, 136, 138, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 181, 183, 186, 188, 191, 193, 196, 198, 
201, 203, 206, 208, 211, 213, 216, 218, 221, 223, 
226, 228, 231, 233, 236, 238, 241, 243, 246, 248, 
251, 253, 256, 258, 261, 263, 266, 268, 271, 273, 
276, 278, 281, 283, 286, 288, 291, 293, 296, 298, 
301, 303, 306, 308, 311, 313, 316, 318, 
1, 3, 6, 8, 11, 13, 16, 18, 21, 23, 
26, 28, 31, 33, 36, 38, 41, 43, 46, 48, 
51, 53, 56, 58, 61, 63, 66, 68, 71, 73, 
76, 78, 81, 83, 86, 88, 91, 93, 96, 98, 
101, 103, 106, 108, 111, 113, 116, 118, 121, 123, 
126, 128, 131, 133, 136, 138, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 181, 183, 186, 188, 191, 193, 196, 198, 
201, 203, 206, 208, 211, 213, 216, 218, 221, 223, 
226, 228, 231, 233, 236, 238, 241, 243, 246, 248, 
251, 253, 256, 258, 261, 263, 266, 268, 271, 273, 
276, 278, 281, 283, 286, 288, 291, 293, 296, 298, 
301, 303, 306, 308, 311, 313, 316, 318, 
0, 3, 5, 8, 10, 13, 15, 18, 20, 23, 
25, 28, 30, 33, 35, 38, 40, 43, 45, 48, 
50, 53, 55, 58, 60, 63, 65, 68, 70, 73, 
75, 78, 80, 83, 85, 88, 90, 93, 95, 98, 
100, 103, 105, 108, 111, 113, 116, 118, 121, 123, 
126, 128, 131, 133, 136, 138, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 181, 183, 186, 188, 191, 193, 196, 198, 
201, 203, 206, 208, 211, 214, 216, 219, 221, 224, 
226, 229, 231, 234, 236, 239, 241, 244, 246, 249, 
251, 254, 256, 259, 261, 264, 266, 269, 271, 274, 
276, 279, 281, 284, 286, 289, 291, 294, 296, 299, 
301, 304, 306, 309, 311, 314, 316, 319, 
0, 3, 5, 8, 10, 13, 15, 18, 20, 23, 
25, 28, 30, 33, 35, 38, 40, 43, 45, 48, 
50, 53, 55, 58, 60, 63, 65, 68, 70, 73, 
75, 78, 80, 83, 85, 88, 90, 93, 95, 98, 
100, 103, 105, 108, 111, 113, 116, 118, 121, 123, 
126, 128, 131, 133, 136, 138, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 181, 183, 186, 188, 191, 193, 196, 198, 
201, 203, 206, 208, 211, 214, 216, 219, 221, 224, 
226, 229, 231, 234, 236, 239, 241, 244, 246, 249, 
251, 254, 256, 259, 261, 264, 266, 269, 271, 274, 
276, 279, 281, 284, 286, 289, 291, 294, 296, 299, 
301, 304, 306, 309, 311, 314, 316, 319, 
0, 3, 5, 8, 10, 13, 15, 18, 20, 23, 
25, 28, 30, 33, 35, 38, 40, 43, 45, 48, 
50, 53, 55, 58, 60, 63, 65, 68, 70, 73, 
75, 78, 80, 83, 85, 88, 90, 93, 95, 98, 
100, 103, 105, 108, 111, 113, 116, 118, 121, 123, 
126, 128, 131, 133, 136, 138, 141, 143, 146, 148, 
151, 153, 156, 158, 161, 163, 166, 168, 171, 173, 
176, 178, 181, 183, 186, 188, 191, 193, 196, 198, 
201, 203, 206, 208, 211, 214, 216, 219, 221, 224, 
226, 229, 231, 234, 236, 239, 241, 244, 246, 249, 
251, 254, 256, 259, 261, 264, 266, 269, 271, 274, 
276, 279, 281, 284, 286, 289, 291, 294, 296, 299, 
301, 304, 306, 309, 311, 314, 316, 319
};
void Camera_Init()
{
   Camera_GPIO_Init();
   Camera_DMA_Init();
   ov7725_eagle_init();
   //ov7725_eagle_reg_init();
}

/*
*备注:使能引脚:行、场中断初始化为上升沿触发、下拉、低通滤波;8个数据传输引脚初始化为禁止中断、下拉、低通滤波;PCLK初始化为下降沿DMA触发、下拉、低通滤波
*/


void Camera_GPIO_Init()
{
   //行中断信号初始化
   GPIO_InitTypeDef GPIO_init;
   GPIO_init.GPIO_PTx = H_GPIO_PORT;
   GPIO_init.GPIO_Pins = H_PIN;
   GPIO_init.GPIO_Dir = DIR_INPUT;
   GPIO_init.GPIO_PinControl = IRQC_RI | INPUT_PULL_DOWN | INPUT_PF_EN;
   GPIO_init.GPIO_Output = 0;
   GPIO_init.GPIO_Isr = camera_h_isr;
   LPLD_GPIO_Init(GPIO_init);
   
   //场中断信号初始化
   GPIO_init.GPIO_PTx = V_GPIO_PORT;
   GPIO_init.GPIO_Pins = V_PIN;
   GPIO_init.GPIO_Dir = DIR_INPUT;
   GPIO_init.GPIO_PinControl = IRQC_RI | INPUT_PULL_DOWN | INPUT_PF_EN;
   GPIO_init.GPIO_Output = 0;
   GPIO_init.GPIO_Isr = camera_v_isr;
   LPLD_GPIO_Init(GPIO_init);
   //数据信号初始化
   GPIO_init.GPIO_PTx = DATA_GPIO_PORT;
   GPIO_init.GPIO_Pins = DATA_PIN;
   GPIO_init.GPIO_Dir = DIR_INPUT;
   GPIO_init.GPIO_PinControl = IRQC_DIS | INPUT_PULL_DOWN | INPUT_PF_EN;
   GPIO_init.GPIO_Output = 0;
   GPIO_init.GPIO_Isr = NULL;
   LPLD_GPIO_Init(GPIO_init);
   //PCLK信号初始化
   GPIO_init.GPIO_PTx = PCLK_GPIO_PORT;
   GPIO_init.GPIO_Pins = PCLK_PIN;
   GPIO_init.GPIO_Dir = DIR_INPUT;
   GPIO_init.GPIO_PinControl = IRQC_DMAFA | INPUT_PULL_DOWN | INPUT_PF_EN;
   GPIO_init.GPIO_Output = 0;
   GPIO_init.GPIO_Isr = NULL;
   LPLD_GPIO_Init(GPIO_init);
   
}

/*
*备注配置DMA
*/
void Camera_DMA_Init()
{
   static DMA_InitTypeDef DMA_init;
   DMA_init.DMA_CHx = DMA_CHX;                              //通道
   DMA_init.DMA_Req = DMA_REQ;                              //DMA请求源
   DMA_init.DMA_PeriodicTriggerEnable = FALSE;              //PIT周期触发关闭
   
   DMA_init.DMA_MajorLoopCnt = DMA_MAJOR_LOOP;              //主循环次数
   DMA_init.DMA_MinorByteCnt = DMA_MINER_BYTE;              //副循环一次传输字节数
   
   DMA_init.DMA_SourceAddr = DMA_SOURCE_ADDR;               //传输源地址
   DMA_init.DMA_DestAddr = DMA_DEST_ADDR;                   //传输目的地址
   
   DMA_init.DMA_SourceDataSize = DMA_SOURCE_DATA_SIZE;      //源数据传输宽度
   DMA_init.DMA_SourceAddrOffset = DMA_SOURCE_ADDR_OFFSET;  //源地址读取后偏移量
   DMA_init.DMA_DestDataSize = DMA_DEST_DATA_SIZE;          //目的数据传输宽度
   DMA_init.DMA_DestAddrOffset = DMA_DEST_ADDR_OFFSET;      //目的地址写入后偏移量
   DMA_init.DMA_AutoDisableReq = TRUE;                      //自动禁用请求
   
   LPLD_DMA_Init(DMA_init);
   LPLD_DMA_DisableReq(DMA_CHX);                            //禁用硬件请求DMA
   
}

void CameraStart()
{
   init_nvic(); 
   enable_irq(V_PORT_IRQn);//开启场中断
   enable_irq(H_PORT_IRQn);//开启行中断
   enable_irq(Reserved110_IRQn);//开启软件中断
   
}

void CameraClose()
{
   disable_irq(V_PORT_IRQn);//关闭场中断
   disable_irq(H_PORT_IRQn);//关闭行中断
   disable_irq(Reserved110_IRQn);//关闭软件中断
//   LPLD_DMA_DisableReq(DMA_CHX);//关闭DMA请求
}

/*
函数名称:ImgExtract(uint8 *src, uint8 *dst, uint32 size)
函数参数: dst:目的地址; src:源地址; size:解压的字节数
函数功能: 将源地址的图像解压为0,1,图像字节数必须是4的倍数
函数时间:2.3~2.4ms
备注:将dma得到的数组,由原来的8位数8个像素改为8个数8个像素
*/

void ImgExtract(uint8 *src, uint8 *dst, uint32 colomn)
{
  register uint8 tmpsrc;
  register uint8 *tmpsrc_Row;
  register uint8 u8i = 64, u8j = colomn;
  
  //将列数换算为对应的一行所用的存储字节数
  colomn=colomn/8;
  
  for (u8i=0; u8i<64; u8i++)
  {
    //依开始行、结束行均匀取行
    tmpsrc_Row = &src[row[u8i]*colomn];
    
    for (u8j=0; u8j<colomn; u8j++)
    {
      tmpsrc = ~(*tmpsrc_Row);            //为了程序执行效率考虑
      tmpsrc_Row++;                       //使用指针代替数组寻址运算

      *dst++ = ((tmpsrc >> 7 ) & 0x01);
      *dst++ = ((tmpsrc >> 6 ) & 0x01);
      *dst++ = ((tmpsrc >> 5 ) & 0x01);
      *dst++ = ((tmpsrc >> 4 ) & 0x01);
      *dst++ = ((tmpsrc >> 3 ) & 0x01);
      *dst++ = ((tmpsrc >> 2 ) & 0x01);
      *dst++ = ((tmpsrc >> 1 ) & 0x01);
      *dst++ = ((tmpsrc >> 0 ) & 0x01);
    }
  }
}


/*
函数名称:ImgCompress_128x64(uint8 *src, uint8 (*image)[IMAGE_WIDTH])
函数参数:  image:目的地址; src:解压后的源地址

函数时间:1.7~1.8ms
备注:将全部的图像依取行和取列数组取相应的行和列
*/

void ImgCompress_128x64(uint8 *src, uint8 (*image)[IMAGE_WIDTH])
{
   register uint16 i, j;
   const uint8 *p = NULL;
   
   for (i = 0; i < IMAGE_HEIGHT; i++)
   {
     p=&src[i*CAMERA_W];
//      for (j = 0; j < IMAGE_WIDTH; j += 4)
//      {
//         image[IMAGE_HEIGHT-1-i][j] = *(p + RowCol[i][j]);
//         image[IMAGE_HEIGHT-1-i][j + 1] = *(p + RowCol[i][j + 1]);
//         image[IMAGE_HEIGHT-1-i][j + 2] = *(p + RowCol[i][j + 2]);
//         image[IMAGE_HEIGHT-1-i][j + 3] = *(p + RowCol[i][j + 3]);
//      }
     for (j = 0; j < IMAGE_WIDTH; j += 1)
     {
       if(RowCol[i][j] != 65535)
       {
         image[IMAGE_HEIGHT-1-i][j] = *(p + RowCol[i][j]);
       }
     }
   }
}


//中断函数
void camera_h_isr()//行中断
{
  static u16 h_counter=0;               //行计数位
  if ((H_PORT->ISFR & H_PIN) != 0)     //注意优先级,该句话滤掉杂波,必不可少
  {
    h_counter++;
    if(h_counter==CAMERA_H)
    {
      h_counter=0;
      SOFT_INTERRUPT_STIG();
    }
    LPLD_DMA_EnableReq(DMA_CHX);      //开启DMA传输
  }
}

void camera_v_isr()//场中断
{
   if ((V_PORT->ISFR & V_PIN) != 0)//注意优先级,该句话滤掉杂波,必不可少
   {
      disable_irq(V_PORT_IRQn);
      if (gl_now_flag == 0)
      {
         LPLD_DMA_LoadDstAddr(DMA_CHX, (uint32)gl_Image1);
         gl_now_flag = 1;
      }
      else
      {
         LPLD_DMA_LoadDstAddr(DMA_CHX, (uint32)gl_Image0);//重新加载目的地址
         gl_now_flag = 0;
      }
      SOFT_INTERRUPT_STIG();//触发中断,该中断函数结束后立即进入图像处理
      enable_irq(V_PORT_IRQn);
   }
}

//软中断中调用解压、压缩函数
void camera_process_isr()
{
   //图像解压提取,约占4.2ms
   if (gl_now_flag == 0)
   {
      ImgExtract(gl_Image1, gl_ImageFull, CAMERA_W);//解压图像
   }
   else
   {
      ImgExtract(gl_Image0, gl_ImageFull, CAMERA_W);//解压图像
   }
   ImgCompress_128x64(gl_ImageFull, gl_ImageCompress);//提取压缩
}

//均匀地取行取列
void init_get_colrow_array()
{
  float32 get_row_ = 0, get_col_ = 0;
  get_row_ = ((float32)CAMERA_H) / ((float32)IMAGE_HEIGHT);
  get_col_ = ((float32)CAMERA_W) / ((float32)IMAGE_WIDTH);
  
  int i, j;
  
  for (j = 0; j < IMAGE_WIDTH; j++)
  {
    for (i = 0; i < IMAGE_HEIGHT; i++)
    {
      RowCol[i][j] = (uint16)(get_col_ * j);
    }
  }
  
  for (i = 0; i < IMAGE_HEIGHT; i++)
  {
    row[i] = (uint16)(get_row_ * i);
  }
  
}

这里先说一下图像采集的整个流程吧:>1.首先定义中断优先级,依次将场中断,场中断定义为优先级最高的两个中断。再定义一个软中断,主要是对于中断产生的数组做一些压缩解压缩,格式转换的处理,使其能实时得到需要显示的数据。然后使能包括行,场中断,以及自定义的场中断。接着,中断捕获产生一个一维的数组,数组经过压缩和解压缩传到存储区存储在数组里,这里压缩应该是为了减小DMA传输的时间,然后经过一个数组定义的取行取列对图像的进行进一步的压缩,从而得到128x64的图像,最后通过一个ImgCompress_128x64将一维数组转为二维数组,再通过oled的一个专用于显示128x64的图像的函数显示图像。

最后附加一个函数分析


void ImgCompress_128x64(uint8 *src, uint8 (*image)[IMAGE_WIDTH])
{
   register uint16 i, j;
   const uint8 *p = NULL;
   
   for (i = 0; i < IMAGE_HEIGHT; i++)
   {
     p=&src[i*CAMERA_W];
     for (j = 0; j < IMAGE_WIDTH; j += 1)
     {
       if(RowCol[i][j] != 65535)
       {
         image[IMAGE_HEIGHT-1-i][j] = *(p + RowCol[i][j]);
       }
     }
   }
}

这是一个一维数组取行取列后转二维的处理函数,然后对其按照上面那一段特别长的数组的取行取列的位对其进行转换,我最初以为gl_ImageFull()已经是经过取行取列处理过的数组,写了一个特别low的函数,特别尴尬。>总的来说这周的学习还是比较满意的,接下来的一周,希望能完成电机控制,让车跑起来吧。

mcc

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值