您的位置:首页 > 其它

全功能智能车之CCD定时器触发ADC 触发DMA传输(CCD终结篇)(第十五篇)

2015-11-29 22:40 411 查看
这个实验在上个实验的基础上把原来由采集函数触发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[i]=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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: