注册 登录
查看: 394|回复: 2

关于PDB触发ADC,然后ADC请求DMA传输的问题

[复制链接]
发表于 2015-1-21 01:04:45 | 显示全部楼层 |阅读模式
本帖最后由 bieshuono 于 2015-1-21 01:09 编辑

结合《ARM自学笔记》,我综合了山外库和LPLD库提供的例程(自己写初始化函数还是感觉有点无从下手,总担心写得太乱,脑中总浮现写完就是上百的错误警告),写出了一个PDB自动触发ADC工作,然后ADC进行转换,转换完成后ADC请求DMA传输的程序,打算用于采集模拟摄像头Sony CCD的图像。虽然担忧K60的ADC模块跟不上所需采集速度,但是我还是亲自尝试了一番。代码如下:
  1. printf("\n蓝宙你麻痹的!\n");
  2.     //uart_init(Landzo_Uart,115200);              //初始化Landzo_Uart
  3.     sci_init();                                 //初始化蓝宙线性CCD上位机数据格式
  4.     //adc_init(ADC1_SE16);                        //ADC初始化
  5.     adc_dma_init(ADC1_SE16,ADC_8bit);           //ADC初始化
  6.     camera_init();                              //SONY CCD 初始化   
  7.    
  8.     //Step 3.配置PDB,用于触发ADC
  9.     pdb_init_struct.PDB_CounterPeriodMs = 100;    //PDB计数器周期,这个决定了4个通道每采集一次的间隔
  10.     pdb_init_struct.PDB_LoadModeSel = LOADMODE_0;
  11.     pdb_init_struct.PDB_ContinuousModeEnable = TRUE;      //使能连续工作模式,即只需要开始触发一次,以后PDB就会连续工作
  12.     pdb_init_struct.PDB_TriggerInputSourceSel = TRIGGER_SOFTWARE; //软件触发模式,即不需要用其他模块触发PDB工作
  13.     //初始化PDB
  14.     LPLD_PDB_Init(pdb_init_struct);
  15.     //配置PDB预触发功能,使能ADC1-A组的预触发功能
  16.     LPLD_PDB_AdcTriggerCfg(ADC1_BASE_PTR, PRETRIG_EN_A|PRETRIG_DLY_A, 0);  
  17.     //软件触发PDB开始工作
  18.     LPLD_PDB_SoftwareTrigger();
结果如图:




虽然已经能自动采集数据了,但是我没看懂为何ADC采集了DMA主循环次数后就没有工作了(DMA传输次数设置的10,主循环结束后停止硬件请求
山外哥,我的个人理解是PDB触发ADC工作,ADC转换完成然后请求DMA传输,DMA完全可以不搭理ADC的请求。但是结果是ADC的采样停止了,我在5ms  pit中断里直接读取了ADC的转换结果,但是后边这个结果一直维持不变了。
望山外哥悉心解答,多谢!
另附:
pit中断
  1. value=ADC_R_REG(ADC1_BASE_PTR,0);
  2.     printf("ADC采样结果为:%d",value);
  3.     printf("     相应电压值为%dmV\n",(3300*value)/((1<<8)-1));
  4.    
  5.     PIT_Flag_Clear(PIT0);       //清中断标志位

我就发现到后面这个printf输出value的值一直不变了,才发现问题的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-1-21 17:11:45 | 显示全部楼层
我没用过PDB,所以不好说是什么情况。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-1-21 20:01:41 | 显示全部楼层
额,好吧   谢谢山外哥
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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