piaoran1314 发表于 2018-5-12 12:14:38

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

这个实验在上个实验的基础上把原来由采集函数触发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:0000ccd_min:0000");                LCD_ShowString(20,90,200,16,16,"exp_tim:0000ccd_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×作者:piaoranQQ: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×作者: 蓝宙电子工作室 ×修改:piaoranQQ: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://img.blog.csdn.net/20151129225018818?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Centerhttp://img.blog.csdn.net/20151129225023241?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center




这是源代码:
http://download.csdn.net/detail/chengdong1314/9310853


页: [1]
查看完整版本: 全功能智能车之CCD定时器触发ADC 触发DMA传输(CCD终结篇)(...