2845|0

5

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

本人初学者,求教arm7中关于adc转换的问题. [复制链接]

程序的部分代码如下:

 

#define  KEY1  (1u1<<10)                              //引脚P2.10连接KEY1,定义常数KEY1(与板子的硬件电路有关) 
OS_EVENT *ReMsgQeue ;                                 //定义消息队列指针
void     *MsgQeueTb[10] ;                             //定义消息指针数组,队列长度为10
 
PCONP |= 1<<12;                                       //打开ADC电源
AD0CR =(1<<0)                         |               //选择AD0.0为AD输入引脚
((Fpclk/ 1000000 - 1) << 8)           |               // CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟为1MHz
(0 << 16)                             |               // BURST = 0 ,软件控制转换操作
(1 << 21)                             |               // PDN = 1 , 正常工作模式
(1 << 24)                             |               // 直接启动模式
(0 << 27);                                            //设置模式, 直接启动模式下无效
ReMsgQeue = OSQCreate(&MsgQeueTb[0],10) ;             //创建消息队列,长度为10
while(1)
{
  OSTimeDly(2) ;                                      //延时
  if((FIO2PIN & KEY1) != KEY1) continue ;             //未按键,再延时
  else
  {
    AD0CR |= (1<<24);                                 //立即转换
    while((ADSTAT&(1<<0))==0);                        //读取AD0STAT的通道0的Done
    AD0CR = AD0CR|(1<<24);                            //第一次转换结果丢失,再次启动转换
    while((ADSTAT&(1<<0))==0);                        //读取AD0STAT的通道0的Done
    OSQPost(ReMsgQeue,(void*)(ADDR0|0xff000000));     //将数据冒充消息指针
    while(1)                                          //等待按键释放
    {
     FIO2SET = KEY1 ;
     OSTimeDly(2) ;                                   //延时
     if((FIO2PIN&KEY1)==KEY1) break ;
    }
  }
}  ADC_Data = ADC_Data / 1024;
}


我的问题是:

    (1)发送转换结果的消息OSQPost( )时,为什么不直接发送ADDR0,而是发送(ADDR0|0xff000000)? ADDR0寄存器最高两位(31:30)分别是DONE和OVERRUN,而寄存器(29:16)位都未使用,要是这样的话寄存器最高位与0xff相乘有什么意义?同时寄存器(15:6)位的10位转换结果与0x000相乘以后我们得到的转换结果不就一直是0了吗?
    (2)第一次AD0CR |= (1<<24)启动转换以后,为什么要将第一次转换结果丢失?
    (3)AD0STAT寄存器的Done0位,要再读取了相应的结果寄存器ADDR0后会把AD0ATAT的低八位中相应的Done位清零,而从第一次启动转换到第二次启动转换之间,并没有涉及到读取寄存器ADDR0的转换结果,那么在进行第二次启动转换以后AD0STAT寄存器的Done0位不应该还是1吗???此时的下一条语句while((ADSTAT&(1<<0))==0);不就恒为假了么?那么这第二次启动还有意义么?
    (4)能不能连续进行ADC转换?即:是不是每次启动转换,当转换完成以后要想再次进行转换就必须再执行一次AD0CR|=(1<<24)启动转换?

此帖出自ARM技术论坛
点赞 关注
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表