#include <stm32f10x.h>#include <stdio.h>#include <usart.h>#include <Nvic_Exit.h>#include <delay.h>#include <tft.h>#include <ov7670.h>#include<I2C.h>#include "stm32f10x_tim.h"#include "include.h"#include "Image.h"#define YUANBANvoid RCC_Configuration(void); //RCC复位与时钟控制器void GPIO_Configuration(void); //GPIO 通用输入输出void USART_Configuration(void);//USART 通用同步异步接收发射端void NVIC_Configuration(void);//NVIC 嵌套中断向量列表控制器void EXIT_configuration();void IO_Init(void);void Timer3_configuration();void Timer1_configuration();//void delay_ms(u16 nms);extern u8 KEY;//extern 外部变量u16 PixelCounter; //用于像素计数u8 datareadyflag;u8 data[R][C];u8 * Data;#define White 244#define Black 0#define STRM 500#define STRL 330#define STRR 670//#define STRE 1200u8 InterruptLine=0;u8 TrueLine;u8 DataReadyFlag=0;u8 BlackLineData[R];u8 Left[R]={1}; //左转u8 Right[R]={C-1}; //右转//uchar Mid[R]={R/2};u8 LastFieldMid1=80; //中线u8 LastFieldMid2=80;u8 ThresholdValue=130;//,fazhi,界限值s16 Err = 0;s16 Errlast = 0;s16 Errd = 0;s16 Errdlast = 0;s16 Erri = 0;s16 Roadtype = 0;s16 Errhistory[8]={0};u16 Steerangle = 0;const u16 SlampeLine[R]= //采样行,校准纵向畸变{56,//57,//58,//59,//60,//61,//121.562,//11864,//114.566,//11168,//107.570,//10472,//100.574,//9776,//93.579,//9082,//86.585,//8388,//79.591,//76 94,//72.5 97, //69 101,//65.5 105,//62 110,//58.5 115,//55 120,//51.5 126,//48 134,//44.5 142,//41 150,//37.5 158,//34 166,//30.5 174,//27 182,//23.5cm 190,//20cm 204,//16.5cm 212,220,//13cm 228,238 //9.5cm};main(){RCC_Configuration();;//系统时钟设置delay_init(72); //延时初始化IO_Init();GPIO_Configuration(); //GPIO 通用输入输出NVIC_Configuration();//NVIC 嵌套中断向量列表控制器USART_Configuration();//USART 通用同步异步接收发射端Timer3_configuration();Timer1_configuration();EXIT_configuration();CMOS1_PWDN=0;CMOS1_RST=0;delay_ms(20);CMOS1_RST=1;InitI2C0();while(1!=Cmos7670_init()); //CMOS初始化Exit_Init(GPIOA, GPIO_Pin_0, GPIO_Mode_IPU, EXTI_Trigger_Falling, 2, 5); //VSYNCdelay_ms(1000);TIM3->CCR2 = 504;GPIO_WriteBit( GPIOB,GPIO_Pin_0, 1);GPIO_WriteBit( GPIOB,GPIO_Pin_1, 1);delay_ms(1000); //4sdelay_ms(1000);delay_ms(1000);delay_ms(1000);SpeedContiol(570);while(1){if (datareadyflag==1){EXTI->IMR &=~(1<<0); //屏蔽中断EXTI->PR |=(1<<0); //清楚悬挂标记位;datareadyflag=0;//----------------------------------------------------------------------- DataAnalyse(1);mygetLmr();SmoothMid() ;Steer_control();SpeedContiol(548); // 范围400~600之间,越大越慢//-----------------------------------------------------------------------EXTI->IMR|=(1<<0); //允许外部中断,以便接收下帧图像数据}}}void RCC_Configuration(void){SystemInit();// Enable GPIO clockRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA // 失能或失能AHB外设时钟|RCC_APB2Periph_GPIOB //失能或失能|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO|RCC_APB2Periph_TIM1|RCC_APB2Periph_USART1,ENABLE);// Enable USART2 ClockRCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 //失能或失能AHB1外设时钟|RCC_APB1Periph_TIM3,ENABLE);}void IO_Init(void){RCC->APB2ENR|=1<<0;//开启辅助时钟RCC->APB2ENR|=1<<2;//先使能外设PORTA时钟RCC->APB2ENR|=1<<3;//先使能外设PORTB时钟RCC->APB2ENR|=1<<4;//先使能外设PORTC时钟GPIOC->CRL=0X88888888; //PORTC 输入//摄像头八位输入GPIOC->CRH=0X33333333;GPIOC->ODR=0XFFFF;GPIOA->CRH=0X33333333; //PORTA上拉输出//摄像头输出GPIOA->CRL=0X33333333;GPIOA->ODR=0XFFFF;GPIOB->CRL=0X33333333; //PB0-7 上拉输出GPIOB->CRH=0X33333333; //PB8-15 上拉输出GPIOA->ODR=0XFFFF;JTAG_Set(JTAG_SWD_DISABLE); //JTAG功能禁止,复用JTAG端口}//保持原有配置void GPIO_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;//****** TIM1 CH1(PA8) CH4 (PA11) ******************************GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推完输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//****** TIM3 CH1电机ch2舵机(PA6 pa7) ****************************** GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推完输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init (GPIOA, &GPIO_InitStructure);//******** 外部中断GPIO 初始化***************GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* 设置USART1的Tx脚(PA.9)为第二功能推挽输出模式*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA , &GPIO_InitStructure);/* 设置USART1的Rx脚(PA.10)为浮空输入脚*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA , &GPIO_InitStructure);}/********************************************************** ********************** 函数名: USART_Configuration 保持原有配置* 函数描述: 设置USART1* 输入参数: None* 输出结果: None* 返回值: None*********************************************************** ********************/void USART_Configuration(void){/* 定义USART初始化结构体USART_InitStructure */USART_InitTypeDef USART_InitStructure;/** 波特率为9600bps* 8位数据长度* 1个停止位,无校验* 禁用硬件流控制* 禁止USART时钟* 时钟极性低* 在第2个边沿捕获数据* 最后一位数据的时钟脉冲不从SCLK 输出*/USART_ART_BaudRate = 9600;USART_ART_WordLength =USART_WordLength_8b;USART_ART_StopBits = USART_StopBits_1;USART_ART_Parity = USART_Parity_No ;USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1 , &USART_InitStructure);/* 使能USART1 */USART_Cmd(USART1 , ENABLE);}void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;//中断默认参数// Configure the NVIC Preemption Priority BitsNVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//通道设置为串口2中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //中断占先等级1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //中断响应优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打开中断NVIC_Init(&NVIC_InitStructure);//********** 外部中断(PA0 PA4)****************************************NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //更新事件NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //允许中断NVIC_Init(&NVIC_InitStructure);}void EXIT_configuration(){EXTI_InitTypeDef EXTI_InitStructure;EXTI_ClearITPendingBit(EXTI_Line0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);EXTI_GenerateSWInterrupt(EXTI_Line0);}//timer1 的通道1 输出电机控制pwm pa8void Timer1_configuration()//TIM_DeInit(TIM1);TIM_TimeBaseInitTypeDef TIM1_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;TIM1_TimeBaseStructure.TIM_Period = 7200-1; // 0xFFFF; 计数初值!@#$%^&*()~TIM1_TimeBaseStructure.TIM_Prescaler = 200; //0xF; 分频TIM1_TimeBaseStructure.TIM_ClockDivision = 0x0;TIM1_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM1_TimeBaseStructure.TIM1_RepetitionCounter= 1000-1; //设置了周期计数器值;RCR向下计数器每次计数至0,会产生!@#$%^&*()~//一个更新事件且计数器重新由RCR值(N)开始计数。