搜索
bottom↓
回复: 0
打印 上一主题 下一主题

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

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2018-5-12 12:14:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个实验在上个实验的基础上把原来由采集函数触发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周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-19 08:51

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表