打印
[微控制器/MCU]

LPC2148的ADC0用J-LINK用KEIL4在线仿真为什么一直数据读取错误呢

[复制链接]
1935|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zdhlixiang2006|  楼主 | 2013-3-7 14:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人刚学习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

相关帖子

沙发
zdhlixiang2006|  楼主 | 2013-3-7 14:42 | 只看该作者
还有就是,经常加个断点,然后全速运行时,按理说应该可以走到第一个断点处然后停下来,可是却经常死机,仿真器上的绿色指示灯一直在闪烁,工具栏上的按钮也会变成这个样子,不知道怎么 回事

使用特权

评论回复
板凳
lr2131| | 2013-3-8 10:12 | 只看该作者
来了,这个断点调试怎么没看到暂停按钮呢?

判断仿真调试死机的问题。在全速运行或者是需要等比较长时间或者是需要满足某些异步条件后才会走到断点,而在等在到达断点的时间里,会误以为是死机了。如果点下暂停时正常那么就说明没死机。

使用特权

评论回复
地板
lr2131| | 2013-3-8 10:59 | 只看该作者
我手上有一份LPC2148 ADC的代码,应该没有问题。你参考一下。硬件如果有问题我也一下想不到排查的方法。

ADC.rar

5.23 KB

使用特权

评论回复
5
zdhlixiang2006|  楼主 | 2013-3-8 12:27 | 只看该作者
lr2131 发表于 2013-3-8 10:59
我手上有一份LPC2148 ADC的代码,应该没有问题。你参考一下。硬件如果有问题我也一下想不到排查的方法。 ...

非常感谢,我试试

使用特权

评论回复
6
zdhlixiang2006|  楼主 | 2013-3-8 12:28 | 只看该作者
lr2131 发表于 2013-3-8 10:12
来了,这个断点调试怎么没看到暂停按钮呢?

判断仿真调试死机的问题。在全速运行或者是需要等比较长时间或 ...

问一个问题,KEIL中的IRQ和FIQ中断好像是默认打开的,怎么会这样呢?ADS就需要自己写代码去开启

使用特权

评论回复
7
lr2131| | 2013-3-8 12:41 | 只看该作者
请先确认默认开启IRQ和FIQ中断的KEIL例程是官方的、标准的。

ARM7系列的开发工具,ADS算是keil之前的。ADS上默认关闭相关中断并支持由用户在合适的时候开启和关闭中断的作法如果合适合理,应该在后续的编译器上都该保持这样的作法,这种作法和编译器的实现是无关的,不应该由编译器或者是非标准库来绑定不合理的作法。

使用特权

评论回复
8
zdhlixiang2006|  楼主 | 2013-3-8 19:52 | 只看该作者
lr2131 发表于 2013-3-8 12:41
请先确认默认开启IRQ和FIQ中断的KEIL例程是官方的、标准的。

ARM7系列的开发工具,ADS算是keil之前的。ADS ...

这个是有道理,可是我进入DEBUG模式后,观看左边寄存器的CPRS的I和F,它们都是0, 然后我又没有修改启动文件,也没能力修改,不过我编写的简单中断函数都可以执行,你怎么看?

使用特权

评论回复
9
lr2131| | 2013-3-11 10:09 | 只看该作者
用户模式下的user_mode的宏值为0x10,在初始化用户模式下的cpsr_c时就已经把I和F设置成0了,而后在进入main之前都没再修改I和F,所以在debug时是一定会看到CPSR的I和F都是0。所以你在初始化了相关的中断后,是可以正常进入中断函数的。如果你需要修改启动代码,让它在启动时默认是关闭I和F,那么修改一下那个user_mode的宏值为0xD0。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:沐浴着XX的春风,义无反顾游荡在马勒戈壁

21

主题

523

帖子

2

粉丝