全功能智能车之CCD定时器触发ADC 触发DMA传输(CCD终结篇)(第十五篇)
2015-11-29 22:40
411 查看
这个实验在上个实验的基础上把原来由采集函数触发ADC改成把启动ADC的代码放到了定时器了,这样CCD的采集函数就放到了中断里来完成了
主函数代码:
这里调用CCD初始化函数,代码如下:
DMA初始化都说过了,来说说定时器初始化函数:
现在来看看采集函数:
再来看看定时器的中断函数:
这里实现了启动ADC的功能,最后来看看DMA的促使换函数:
行了函数就说道这里,最后我会上传源代码,现在来看看图片效果:
这是源代码:
http://download.csdn.net/detail/chengdong1314/9310853
主函数代码:
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
相关文章推荐
- MySQL常用的操作整理
- 赛式方法论:为什么你的游戏做不完、做得烂?
- 简易图书管理系统总结
- virtualbox 与 腾讯信鸽不得不说的事
- Contains Duplicate II
- ITerrainPolygon应用
- Spring事务配置的五种方式
- android 图片的模糊化处理,效果类似超级课程表的“我的中心"里头像背景,看起来很炫
- js历史记录管理
- Bootstrap 提示工具(Tooltip)插件的事件
- QML之Item
- TensorFlow跟踪
- Android 6.0 使用 Apache HttpClient
- 安装samba服务器
- maven的几个常用命令
- 【Unity技巧】四元数(Quaternion)和旋转
- 263. Ugly Number
- EasyDarwin EasyClient开源流媒体客户端源码功能框架解析
- HDU-新生赛-游乐场【模拟+贪心】
- mybatis常用jdbcType数据类型