|
这个实验在上个实验的基础上把原来由采集函数触发ADC改成把启动ADC的代码放到了定时器了,这样CCD的采集函数就放到了中断里来完成了
主函数代码:
int main(void){ u16 i,cnt; Stm32_Clock_Init(9); //系统时钟设置 uart_init(72,115200); //串口初始化为115200 delay_init(72); //延时初始化 LED_Init(); //初始化与LED连接的硬件接口 LCD_Init(); //初始化LCD usmart_dev.init(72); //初始化USMART CCD_init(); //初始化CCD //初始化数据 for(i=0; i<CCD_LENGTH; i++) { Pixel=0; } POINT_COLOR=RED;//设置字体为红色 LCD_ShowString(60,10,200,16,16,"CCD TEST"); LCD_ShowString(60,30,200,16,16,"Maid:piaoran"); LCD_ShowString(60,50,200,16,16,"Date:2015-11-28"); LCD_ShowString(20,70,200,16,16,"ccd_max:0000 ccd_min:0000"); LCD_ShowString(20,90,200,16,16,"exp_tim:0000 ccd_avg:0000"); //VerifyExposure(); while(1) { ImageCapture(Pixel); while(!ccd_finish); if(++cnt >= 5) { cnt = 0; SendImageData(Pixel); } //LCD_Put32REG(0,130,"DMA->CNDTR:",DMA1_Channel1->CNDTR); LED0=!LED0; delay_ms(500); }}
这里调用CCD初始化函数,代码如下:/************************************************************************** 函数名称:CCD_init* 功能说明:CCD初始化* 参数说明:* 函数返回:无* 修改时间:2015-11-28× 作者:piaoran QQ:384710930* 备 注:SamplingDelay();*************************************************************************/void CCD_init(void){ RCC->APB2ENR|=1<<2; //使能PORTA口时钟 GPIOA->CRL&=0XFFF00FF; //PA2 CLK PA3 SI GPIOA->CRL|=0XFFF33FF; //PA2 CLK PA3 SI GPIOE->ODR|=3<<2; //PE.5输出高 TIM3_Int_Init(exposureTime-1,71); //初始化定时器 用来采样CCD MYDMA_Config(DMA1_Channel1,(u32)Pixel); //初始化DMA1通道 Adc_Init(); //ADC初始化 PA1 anolog输入}
DMA初始化都说过了,来说说定时器初始化函数://通用定时器3中断初始化//这里时钟选择为APB1的2倍,而APB1为36M//arr:自动重装值。//psc:时钟预分频数//这里使用的是定时器3!void TIM3_Int_Init(u16 arr,u16 psc){ RCC->APB1ENR|=1<<1; //TIM3时钟使能 TIM3->ARR=arr; //设定计数器自动重装值//刚好1ms TIM3->PSC=psc; //预分频器7200,得到10Khz的计数时钟 TIM3->DIER|=1<<0; //允许更新中断 MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占1,子优先级3,组2 }
现在来看看采集函数:/************************************************************************** 函数名称:ImageCapture* 功能说明:CCD采样程序* 参数说明:* ImageData 采样数组* 函数返回:无* 修改时间:2015-11-28× 作者: 蓝宙电子工作室 × 修改:piaoran QQ:384710930* 备 注:ImageCapture(Pixel);*************************************************************************/void ImageCapture(unsigned short * ImageData) { ccd_finish=0; TIM3_Switch(1); //使能定时器 MYDMA_Enable(DMA1_Channel1); //使能TM3 TX DMA1 所指示的通道 DMA1->IFCR =0XFFFFFFFF;}
再来看看定时器的中断函数://定时器3中断服务程序 void TIM3_IRQHandler(void){ static u16 cnt=0; LED1=!LED1; if(TIM3->SR&0X0001)//溢出中断 { cnt++; TIM3->SR&=~(1<<0);//清除中断标志位 if(cnt>(2*(CCD_LENGTH-1)+6)) { //滤除掉无用选项 cnt=0; return; } switch(cnt){ case 1: CCD_SI=1; break; case 2: CCD_CLK=1; break; case 3: CCD_SI=0; break; case 4: Adc_auto(); CCD_CLK=0; break; case (2*(CCD_LENGTH-1)+5): //这是后期的曝光时间叠加 CCD_CLK=1; break; case (2*(CCD_LENGTH-1)+6): CCD_CLK=0; break; default: if(cnt%2){ //5 CCD_CLK=1; }else{ Adc_auto(); CCD_CLK=0; } break; } } }
这里实现了启动ADC的功能,最后来看看DMA的促使换函数://DMA传输完成中断函数void DMA1_Channel1_IRQHandler(void){ DMA_ClearITPendingBit(DMA1_IT_GL1); ccd_finish=1; TIM3_Switch(0); //失能定时器 MYDMA_Enable(DMA1_Channel1);}
行了函数就说道这里,最后我会上传源代码,现在来看看图片效果:
这是源代码:
http://download.csdn.net/detail/chengdong1314/9310853
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|