#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);
}
}
}
此帖出自小平头技术问答
一周热门 更多>