|
配置SEQ1和SEQ2为 级联模式,顺序采样16次(0~3通道各采集4次),并且SEQ1的启动转换触发,使能ADC中断
下面是配置内部ADC的代码:- void InitAdc(void)
- {
- unsigned int i;
-
- AdcRegs.ADCTRL1.bit.RESET=1; //复位整个ADC模块
- NOP;
- NOP;
- AdcRegs.ADCTRL1.bit.RESET=0;
- AdcRegs.ADCTRL1.bit.SUSMOD=3; //仿真悬挂模式,排序器和其他逻辑立即停止
- AdcRegs.ADCTRL1.bit.ACQ_PS=15; //采集窗口大小,即SOC的脉冲宽度,同时也决定了采样开关闭合的时间
- AdcRegs.ADCTRL1.bit.CPS=0; //Fclk = CLK/1,对外设时钟HSPCLK分频
- AdcRegs.ADCTRL1.bit.CONT_RUN=0; //开始/停止模式,需要在中断服务程序中复位排序器
- AdcRegs.ADCTRL1.bit.SEQ_CASC=1; //级联模式,SEQ1和SEQ2作为一个16状态排序工作
-
- AdcRegs.ADCTRL3.bit.EXTREF = 0; //内部参考源的输出引脚
- AdcRegs.ADCTRL3.bit.ADCBGRFDN=3; //带隙和参考电路上电
- for(i=0;i<10000;i++) NOP;
- AdcRegs.ADCTRL3.bit.ADCPWDN=1; //ADC其他模拟地电路上电
- for(i=0;i<5000;i++) NOP;
- AdcRegs.ADCTRL3.bit.ADCCLKPS=15; //ADC的内核时钟分频器,参数待定
- AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //顺序采样模式,每次对一个通道进行采样
-
- AdcRegs.MAX_CONV.bit.MAX_CONV=15; //一次采样最大16个通道
-
- AdcRegs.CHSELSEQ1.bit.CONV00=0; //排序器初始化,对AINA0~3依次采样,连续采样16次,每道4次
- AdcRegs.CHSELSEQ1.bit.CONV01=1;
- AdcRegs.CHSELSEQ1.bit.CONV02=2;
- AdcRegs.CHSELSEQ1.bit.CONV03=3;
-
- AdcRegs.CHSELSEQ2.bit.CONV04=0;
- AdcRegs.CHSELSEQ2.bit.CONV05=1;
- AdcRegs.CHSELSEQ2.bit.CONV06=2;
- AdcRegs.CHSELSEQ2.bit.CONV07=3;
-
- AdcRegs.CHSELSEQ3.bit.CONV08=0;
- AdcRegs.CHSELSEQ3.bit.CONV09=1;
- AdcRegs.CHSELSEQ3.bit.CONV10=2;
- AdcRegs.CHSELSEQ3.bit.CONV11=3;
-
- AdcRegs.CHSELSEQ4.bit.CONV12=0;
- AdcRegs.CHSELSEQ4.bit.CONV13=1;
- AdcRegs.CHSELSEQ4.bit.CONV14=2;
- AdcRegs.CHSELSEQ4.bit.CONV15=3;
-
- AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ=0; //不允许EVB SOC
- AdcRegs.ADCTRL2.bit.RST_SEQ1=1; //复位排序器1
- AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1; //使能INT SEQ1产生的中断申请
- AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0; //每个SEQ1序列结束时,INT SEQ1置位
- AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0; //EVA不能启动SEQ1
- AdcRegs.ADCTRL2.bit.EXT_SOC_SEQ1=0; //外部ADCSOC引脚信号不能启动ADC
- AdcRegs.ADCTRL2.bit.RST_SEQ2=0; //复位排序器2
- AdcRegs.ADCTRL2.bit.SOC_SEQ2=0; //SEQ2的转换触发启动
- AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2=0; //INT SEQ2中断禁止
- AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2=0; //中断模式,每个/间隔
- AdcRegs.ADCTRL2.bit.EVB_SOC_SEQ2=0; //EVB SOC不能启动SEQ2
- // AdcRegs.ADCTRL2.bit.SOC_SEQ1=1; //SEQ1的启动转换触发,软件启动转换
- PieCtrl.PIEIER1.bit.INTx6 = 1; //使能PIE模块中的ADC采样中断
- }
复制代码 在中断服务程序中清除SEQ1中断标志位,并置位AD_DOWN_Flag,数据处理程序在主程序中
下面是中断程序- AdcRegs.ADC_ST_FLAG.bit.INT_SEQ1_CLR = 1;
- PieCtrl.PIEACK.all = 0x0001;
- AD_DOWN_Flag = 1;
- EINT;
- return;
复制代码 现在的问题是:仿真环境中,可以进一次ADC中断,但是执行完主程序中的- AD_DOWN_Flag = 0;
- NOP;
- AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;
- NOP;
- AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
复制代码 后就不能再进入中断了。
逐步运行发现AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;这一句不能执行,RST_SEQ1不能置1,就是不能复位排序器,并且ADC状态寄存器中的INT SEQ1始终为1
请问这是为什么?为何RST_SEQ1不能置1?有什么解决的方法么? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|