本人初学者,求教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)启动转换?
|