求大神指导STM32 OV6620采集图像不正确

2019-03-23 19:21发布

#include"stm32f10x.h"
#include"USART1-5_Config.h"
#define ROW_MAX 100
#define POINT_MAX 80
uint8_t H_data[ROW_MAX][POINT_MAX];
uint8_t flag=0;
uint8_t row=0;                  
uint8_t row_jd_d=0;
void RCC_Configuration()
{
        ErrorStatus HSEStartUpStatus;
        RCC_DeInit();        //  将RCC寄存器重新设置为默认值
        RCC_HSEConfig(RCC_HSE_ON);        // 打开外部高速时钟晶振HSE
        HSEStartUpStatus=RCC_WaitForHSEStartUp();  //等待外部高速时钟晶振工作
        if(HSEStartUpStatus==SUCCESS)
        {
                FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  // Enable Prefetch Buffer

        FLASH_SetLatency(FLASH_Latency_2);       // Flash 2 wait state


                RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟=系统时钟
                RCC_PCLK2Config(RCC_HCLK_Div1);        //设置高速AHB时钟  即APB2时钟
                RCC_PCLK1Config(RCC_HCLK_Div1);        //设置低速AHB时钟  即APB1时
                RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//设置PLL的时钟源=HSE时钟频率 倍频系数为9倍   达到最大频率72Mhz
                RCC_PLLCmd(ENABLE);//使能PLL
                while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //等待PLL工作
                RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟为PLL时钟
                while(RCC_GetSYSCLKSource()!=0x08);        //检测PLL时钟是否被用作系统时钟
        }
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO, ENABLE);

}
NVIC_InitTypeDef NVIC_InitStructure;//声明结构体变量NVIC_InitStructure
//VSYNC  C0
//HREF   C11
//场信号和行信号 同一阶级   不同阶乘  一个人做事的时候另一个不能打断他   同时想做事的时候  场信号先做
void NVIC_Configuration()//中断优先级设置
{

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//设置优先级分组,先占优先级和从优先级
        NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn; //这个配置关系到中断 非常重要
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn; //这个配置关系到中断 非常重要
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority=5;
        NVIC_InitStructure.NVIC_IRQChannelCmd=DISABLE;
        NVIC_Init(&NVIC_InitStructure);
}


void GPIO_Configuration()
{
        GPIO_InitTypeDef GPIO_InitStructure; //声明结构体变量GPIO_InitStructure   类型是GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量GPIO_InitStructure   类型是GPIO_InitTypeDef
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//输入使能内部上拉电阻
        GPIO_Init(GPIOC, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//输入使能内部上拉电阻
        GPIO_Init(GPIOC, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;        //中断测试
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//输入使能内部上拉电阻
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//数据口浮空输入
        GPIO_Init(GPIOD, &GPIO_InitStructure);                          //GPIO_Mode_IN_FLOATING

        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出  指示灯
        GPIO_Init(GPIOB, &GPIO_InitStructure);

       
        //A9           USART1_TX1         发送端  复用推挽输出
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//USART1 A9 A10
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        //A10           RX1         接受端  浮空输入
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//USART1 A9 A10
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
}
        EXTI_InitTypeDef EXTI_InitStructure;//声明结构体变量EXTI_InitStructure
//中断初始化,外部中断:INT0下降沿触发——VSYNC 场同步信号  
//     INT1上升沿触发——HREF;   行同步信号
void EXTI_Configuration()
{
       
        //这里最好清除下外部中断标志位
        EXTI_ClearITPendingBit(EXTI_Line0);
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource0);//选择C0管脚作为外部中断线路
        EXTI_InitStructure.EXTI_Line=EXTI_Line0;// 选择外部中断线0
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//设置EXTI线路为中断请求
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//设置输入线路下降沿为中断请求
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;//使能选择的外部中断线0
        EXTI_Init(&EXTI_InitStructure);

        EXTI_ClearITPendingBit(EXTI_Line11);
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource11);//选择C11管脚作为外部中断线路
        EXTI_InitStructure.EXTI_Line=EXTI_Line11;// 选择外部中断线11
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//设置EXTI线路为中断请求
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;//设置输入线路上升沿为中断请求
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;//使能选择的外部中断线11
        EXTI_Init(&EXTI_InitStructure);

        EXTI_ClearITPendingBit(EXTI_Line10);
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource10);//选择C10管脚作为外部中断线路
        EXTI_InitStructure.EXTI_Line=EXTI_Line10;// 选择外部中断线10
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//设置EXTI线路为中断请求
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;//设置输入线路上升沿为中断请求
        EXTI_InitStructure.EXTI_LineCmd=ENABLE;//使能选择的外部中断线10
        EXTI_Init(&EXTI_InitStructure);
}


void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}
int i=0,j=0;
int main()
{

        RCC_Configuration();
        GPIO_Configuration();
        NVIC_Configuration();//中断优先级设置
        EXTI_Configuration();
       
        USART1_Configuration();
        GPIO_SetBits(GPIOB,GPIO_Pin_12);
        //usart1_sent_string("   123abcd     ");
        while(1)
        {
                while(!flag);
                if(flag==1)
                {
                        flag=0;       
                        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);         //传送数据前必须要关闭  行场中断
                        NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;
                        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
                        NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
                        NVIC_InitStructure.NVIC_IRQChannelCmd=DISABLE;
                        NVIC_Init(&NVIC_InitStructure);
       
                        usart1_sent_char(251);       
                        for(i=0;i<ROW_MAX;i++)
                        {
                                for(j=0;j<POINT_MAX;j++)
                                {
                                        usart1_sent_char(H_data[j]);       
                                }       
                        }
                        usart1_sent_char(251);
                }
                  
                       
                for(i=0;i<10000;i++)
                {
                        Delay(5000);       
                }
                EXTI_ClearFlag(EXTI_Line0); //清场中断标志位  开启之前必须要清除标志位
                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);        //传送数据前必须要关闭  场中断  行中断已经关闭过了
                NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
                NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
                NVIC_Init(&NVIC_InitStructure);
        }
}


void EXTI0_IRQHandler(void)  //场中断   c0
{
        if(EXTI_GetITStatus(EXTI_Line0)==SET)
        {
                EXTI_ClearFlag(EXTI_Line0);//必须要清除         不然会一直处在终端里面
                row_jd_d=0;
                row=0;
       
                EXTI_ClearITPendingBit(EXTI_Line11);//开行中断前先清除行中断标志位 (必须)
                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);        //开启行中断
                NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
                NVIC_InitStructure.NVIC_IRQChannelSubPriority=5;
                NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
                NVIC_Init(&NVIC_InitStructure);
        }
}
void EXTI15_10_IRQHandler(void)//行中断   c11   
{
       
        if(EXTI_GetITStatus(EXTI_Line11)==SET)//行中断
        {
                EXTI_ClearFlag(EXTI_Line11);          //必须要清除         不然会一直处在终端里面
                row_jd_d++;
                if((row_jd_d>=20)&&(row_jd_d%2==0))        //采集偶数行
                {
                        GPIO_ResetBits(GPIOB,GPIO_Pin_12);//用于测时间
                        H_data[row][0]=GPIOD->IDR;
                        H_data[row][1]=GPIOD->IDR;
                        H_data[row][2]=GPIOD->IDR;
                        H_data[row][3]=GPIOD->IDR;
                        H_data[row][4]=GPIOD->IDR;
                        H_data[row][5]=GPIOD->IDR;
                        H_data[row][6]=GPIOD->IDR;
                        H_data[row][7]=GPIOD->IDR;
                        H_data[row][8]=GPIOD->IDR;
                        H_data[row][9]=GPIOD->IDR;
                        H_data[row][10]=GPIOD->IDR;
                        H_data[row][11]=GPIOD->IDR;
                        H_data[row][12]=GPIOD->IDR;
                        H_data[row][13]=GPIOD->IDR;
                        H_data[row][14]=GPIOD->IDR;
                        H_data[row][15]=GPIOD->IDR;
                        H_data[row][16]=GPIOD->IDR;
                        H_data[row][17]=GPIOD->IDR;
                        H_data[row][18]=GPIOD->IDR;
                        H_data[row][19]=GPIOD->IDR;
                        H_data[row][20]=GPIOD->IDR;
                        H_data[row][21]=GPIOD->IDR;
                        H_data[row][22]=GPIOD->IDR;
                        H_data[row][23]=GPIOD->IDR;
                        H_data[row][24]=GPIOD->IDR;
                        H_data[row][25]=GPIOD->IDR;
                        H_data[row][26]=GPIOD->IDR;
                        H_data[row][27]=GPIOD->IDR;
                        H_data[row][28]=GPIOD->IDR;
                        H_data[row][29]=GPIOD->IDR;
                        H_data[row][30]=GPIOD->IDR;
                        H_data[row][31]=GPIOD->IDR;
                        H_data[row][32]=GPIOD->IDR;
                        H_data[row][33]=GPIOD->IDR;
                        H_data[row][34]=GPIOD->IDR;
                        H_data[row][35]=GPIOD->IDR;
                        H_data[row][36]=GPIOD->IDR;
                        H_data[row][37]=GPIOD->IDR;
                        H_data[row][38]=GPIOD->IDR;
                        H_data[row][39]=GPIOD->IDR;
                        H_data[row][40]=GPIOD->IDR;
                        H_data[row][41]=GPIOD->IDR;
                        H_data[row][42]=GPIOD->IDR;
                        H_data[row][43]=GPIOD->IDR;
                        H_data[row][44]=GPIOD->IDR;
                        H_data[row][45]=GPIOD->IDR;
                        H_data[row][46]=GPIOD->IDR;
                        H_data[row][47]=GPIOD->IDR;
                        H_data[row][48]=GPIOD->IDR;
                        H_data[row][49]=GPIOD->IDR;
                        H_data[row][50]=GPIOD->IDR;
                        H_data[row][51]=GPIOD->IDR;
                        H_data[row][52]=GPIOD->IDR;
                        H_data[row][53]=GPIOD->IDR;
                        H_data[row][54]=GPIOD->IDR;
                        H_data[row][55]=GPIOD->IDR;
                        H_data[row][56]=GPIOD->IDR;
                        H_data[row][57]=GPIOD->IDR;
                        H_data[row][58]=GPIOD->IDR;
                        H_data[row][59]=GPIOD->IDR;
                        H_data[row][60]=GPIOD->IDR;
                        H_data[row][61]=GPIOD->IDR;
                        H_data[row][62]=GPIOD->IDR;
                        H_data[row][63]=GPIOD->IDR;
                        H_data[row][64]=GPIOD->IDR;
                        H_data[row][65]=GPIOD->IDR;
                        H_data[row][66]=GPIOD->IDR;
                        H_data[row][67]=GPIOD->IDR;
                        H_data[row][68]=GPIOD->IDR;
                        H_data[row][69]=GPIOD->IDR;
                        H_data[row][70]=GPIOD->IDR;
                        H_data[row][71]=GPIOD->IDR;
                        H_data[row][72]=GPIOD->IDR;
                        H_data[row][73]=GPIOD->IDR;
                        H_data[row][74]=GPIOD->IDR;
                        H_data[row][75]=GPIOD->IDR;
                        H_data[row][76]=GPIOD->IDR;
                        H_data[row][77]=GPIOD->IDR;
                        H_data[row][78]=GPIOD->IDR;
                        H_data[row][79]=GPIOD->IDR;
                        /*H_data[row][80]=GPIOD->IDR;
                        H_data[row][81]=GPIOD->IDR;
                        H_data[row][82]=GPIOD->IDR;
                        H_data[row][83]=GPIOD->IDR;
                        H_data[row][84]=GPIOD->IDR;
                        H_data[row][85]=GPIOD->IDR;
                        H_data[row][86]=GPIOD->IDR;
                        H_data[row][87]=GPIOD->IDR;
                        H_data[row][88]=GPIOD->IDR;
                        H_data[row][89]=GPIOD->IDR;
                        H_data[row][90]=GPIOD->IDR;
                        H_data[row][91]=GPIOD->IDR;
                        H_data[row][92]=GPIOD->IDR;
                        H_data[row][93]=GPIOD->IDR;
                        H_data[row][94]=GPIOD->IDR;
                        H_data[row][95]=GPIOD->IDR;
                        H_data[row][96]=GPIOD->IDR;
                        H_data[row][97]=GPIOD->IDR;
                        H_data[row][98]=GPIOD->IDR;
                        H_data[row][99]=GPIOD->IDR;         
                           H_data[row][100]=GPIOD->IDR;
                        H_data[row][101]=GPIOD->IDR;
                        H_data[row][102]=GPIOD->IDR;
                        H_data[row][103]=GPIOD->IDR;
                        H_data[row][104]=GPIOD->IDR;
                        H_data[row][105]=GPIOD->IDR;
                        H_data[row][106]=GPIOD->IDR;
                        H_data[row][107]=GPIOD->IDR;
                        H_data[row][108]=GPIOD->IDR;
                        H_data[row][109]=GPIOD->IDR;
                        H_data[row][110]=GPIOD->IDR;
                        H_data[row][111]=GPIOD->IDR;
                        H_data[row][112]=GPIOD->IDR;
                        H_data[row][113]=GPIOD->IDR;
                        H_data[row][114]=GPIOD->IDR;
                        H_data[row][115]=GPIOD->IDR;
                        H_data[row][116]=GPIOD->IDR;
                        H_data[row][117]=GPIOD->IDR;
                        H_data[row][118]=GPIOD->IDR;
                        H_data[row][119]=GPIOD->IDR;
                        H_data[row][120]=GPIOD->IDR;
                        H_data[row][121]=GPIOD->IDR;
                        H_data[row][122]=GPIOD->IDR;
                        H_data[row][123]=GPIOD->IDR;
                        H_data[row][124]=GPIOD->IDR;
                        H_data[row][125]=GPIOD->IDR;
                        H_data[row][126]=GPIOD->IDR;
                        H_data[row][127]=GPIOD->IDR;
                        H_data[row][128]=GPIOD->IDR;
                        H_data[row][129]=GPIOD->IDR;
                        H_data[row][130]=GPIOD->IDR;
                        H_data[row][131]=GPIOD->IDR;
                        H_data[row][132]=GPIOD->IDR;
                        H_data[row][133]=GPIOD->IDR;
                        H_data[row][134]=GPIOD->IDR;
                        H_data[row][135]=GPIOD->IDR;
                        H_data[row][136]=GPIOD->IDR;
                        H_data[row][137]=GPIOD->IDR;
                        H_data[row][138]=GPIOD->IDR;
                        H_data[row][139]=GPIOD->IDR;
                        H_data[row][140]=GPIOD->IDR;
                        H_data[row][141]=GPIOD->IDR;
                        H_data[row][142]=GPIOD->IDR;
                        H_data[row][143]=GPIOD->IDR;
                        H_data[row][144]=GPIOD->IDR;
                        H_data[row][145]=GPIOD->IDR;
                        H_data[row][146]=GPIOD->IDR;
                        H_data[row][147]=GPIOD->IDR;
                        H_data[row][148]=GPIOD->IDR;
                        H_data[row][149]=GPIOD->IDR;         
                        */
                        row++;
                        if(row>=ROW_MAX-1)
                        {
                                flag=1;
                                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//设置优先级分组,先占优先级和从优先级
                                NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn; //这个配置关系到中断 非常重要
                                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
                                NVIC_InitStructure.NVIC_IRQChannelSubPriority=5;
                                NVIC_InitStructure.NVIC_IRQChannelCmd=DISABLE;//关闭行中断   防止再次进入
                                NVIC_Init(&NVIC_InitStructure);
                        }
                        GPIO_SetBits(GPIOB, GPIO_Pin_12);
                }
        }
} 此帖出自小平头技术问答
0条回答

一周热门 更多>