本人刚学习ARM,这个小代码也是从网上找的,我仔细看了寄存器的设置,配置都正确,我用万用表也量了P0.1脚的电压,确实是1.65V的样子,可是为什么转化的结果一直是3FF呢?我换了别的引脚也是这样,不知道是怎么回事,请各位朋友帮忙看看,不胜感激,主程序代码如下:int main() {
U32 ADC_Data;
PINSEL1 |= 1 << 24; // P0.28连接到AD0.1
/* 进行ADC模块设置 */
AD0CR = (1 << 1) | // SEL=8,选择通道1
((12000000 / 1000000 - 1) << 8) | // CLKDIV=Fpclk/1000000-1,转换时钟为1MHz
(0 << 16) | // BURST=0,软件控制转换操作
(0 << 17) | // CLKS=0, 使用11clock转换
(1 << 21) | // PDN=1,正常工作模式
(0 << 22) | // TEST1:0=00,正常工作模式
(1 << 24) | // START=1,直接启动ADC转换
(0 << 27); // 直接启动ADC转换时,此位无效
DelayNS(10);
ADC_Data = AD0DR1; // 读取ADC结果,并清除DONE标志位
for(;;) {
AD0CR |= 1 << 24; // 进行第一次转换
while ((AD0DR1 & 0x80000000) == 0); // 等待转换结束
AD0CR |= 1 << 24; // 再次启动转换
while ((AD0DR1 & 0x80000000) == 0); // 等待转换结束
ADC_Data = AD0DR1; // 读取ADC结果
ADC_Data = (ADC_Data >> 6) & 0x3ff;
ADC_Data = ADC_Data * 3300; // 参考电压3.3v
ADC_Data = ADC_Data / 1024;
}
}
截图为在线仿真时的画面,可以看到AD0的寄存器在走到断点处时的状态,可以看到转化结果是错误的,不应该为3FF
|