打印
[技术问答]

M0516LEDN,KEIL硬件仿真,变量值乱变,求助

[复制链接]
2417|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 w453509596 于 2015-9-12 14:12 编辑

小弟最近再用新唐的MCU M0516LDN做一款电力测量方面的产品。今天在编写程序时,遇到了一个很奇怪的问题,在仿真暂停时,数组变量的值会变。求大神指导一下。我同时使用了ADC0 ~ADC6  7路ADC
ADC初始化部分
static void MCU_ADC_Init(void)
{
        uint32_t reg32;
        
        reg32 = CLK->CLKSEL1;
        reg32 &= ~CLK_CLKSEL1_ADC_S_Msk;
        reg32 |= 0x00000008; //HCLK
        CLK->CLKSEL1 = reg32;                                     //选择时钟源
        CLK->CLKDIV |= (4U<<16);                               //时钟源分频 50 / (4+1) = 10MHZ  最大为16MHz
        CLK->APBCLK |= CLK_APBCLK_ADC_EN_Msk;   //使能ADC时钟
        
        ADC->ADCR  = ((2U<<2) | (1U<<0));                //(ADC_ADCR_ADMD_SINGLE_CYCLE | ADC_ADCR_DIFFEN_SINGLE_END | ADC_ADCR_ADEN_CONVERTER_ENABLE); 单次扫描 ,单端采样,模块上电
        ADC->ADCHER = 0x0000007F;                          //使能低7路ADC通道
        ADC->ADSR   |= 0x01;                                      //清除ADC采样完成标志位
}

//启动ADC转换
void ADC_START(void)
{
     ADC->ADCR |= (1U << 11);                                          //   启动ADC转换
     while((ADC->ADSR & 0x00000001) ==0) __nop();       //等待转换完成
     ADC->ADSR |= 0x00000001;                                        //清标志位
}


//读取ADC的值
void ADC_Data_Sample(void)
{
        ADC_START();                                                                                                         //启动转换
        ADC_SampleCache.LE[AdcIndex] = (uint16_t)(ADC->ADDR[0] & 0x00000FFF);      //向数组中读取值
        ADC_SampleCache.IA[AdcIndex] = (uint16_t)(ADC->ADDR[1] & 0x00000FFF);        
        ADC_SampleCache.IB[AdcIndex] = (uint16_t)(ADC->ADDR[2] & 0x00000FFF);
        ADC_SampleCache.IC[AdcIndex] = (uint16_t)(ADC->ADDR[3] & 0x00000FFF);
        ADC_SampleCache.UA[AdcIndex] = (uint16_t)(ADC->ADDR[4] & 0x00000FFF);
        ADC_SampleCache.UB[AdcIndex] = (uint16_t)(ADC->ADDR[5] & 0x00000FFF);
        ADC_SampleCache.UC[AdcIndex] = (uint16_t)(ADC->ADDR[6] & 0x00000FFF);        

}

上面是ADC数据采样相关部分的程序,在进行仿真时,程序暂停在那,点数组前面的 + 号,开合数组,数组的值会变。谢谢大神,求助
软件  KEIL 4.72
仿真器是淘宝上出开发板买的    SMART MCU  自动升级到了最新固件和驱动      
系统  WIN8.1  64位           

第二次点开 号.jpg (228.81 KB )

整体图

整体图

第一次点开 号.jpg (223.87 KB )

第一次点开数组

第一次点开数组

暂停图.jpg (431.26 KB )

第二次点开数组

第二次点开数组
沙发
w453509596|  楼主 | 2015-9-13 12:01 | 只看该作者
新唐的FAE大神在哪里,求指导,我后用JLINK 试了一下,也不行

使用特权

评论回复
板凳
bkn1860| | 2015-9-13 17:57 | 只看该作者
ADC输入加DC电压测,加电压如果还是这样那才是有问题,如果没有加电压检测结果乱跳很正常

使用特权

评论回复
地板
西门扫雪| | 2015-9-13 20:10 | 只看该作者
空载的时候乱跳也是正常的

使用特权

评论回复
5
huangcunxiake| | 2015-9-13 21:59 | 只看该作者
变量乱跳?跑飞了吧

使用特权

评论回复
6
追逐浪花| | 2015-9-14 08:41 | 只看该作者
static void MCU_ADC_Init(void)
{
        uint32_t reg32;
        
        reg32 = CLK->CLKSEL1;
        reg32 &= ~CLK_CLKSEL1_ADC_S_Msk;
        reg32 |= 0x00000008; //HCLK
        CLK->CLKSEL1 = reg32;                                     //选择时钟源
        CLK->CLKDIV |= (4U<<16);                               //时钟源分频 50 / (4+1) = 10MHZ  最大为16MHz
        CLK->APBCLK |= CLK_APBCLK_ADC_EN_Msk;   //使能ADC时钟
        
        ADC->ADCR  = ((2U<<2) | (1U<<0));                //(ADC_ADCR_ADMD_SINGLE_CYCLE | ADC_ADCR_DIFFEN_SINGLE_END | ADC_ADCR_ADEN_CONVERTER_ENABLE); 单次扫描 ,单端采样,模块上电
        ADC->ADCHER = 0x0000007F;                          //使能低7路ADC通道
        ADC->ADSR   |= 0x01;                                      //清除ADC采样完成标志位
}

//启动ADC转换
void ADC_START(void)
{
     ADC->ADCR |= (1U << 11);                                          //   启动ADC转换
     while((ADC->ADSR & 0x00000001) ==0) __nop();       //等待转换完成
     ADC->ADSR |= 0x00000001;                                        //清标志位
}


//读取ADC的值
void ADC_Data_Sample(void)
{
        ADC_START();                                                                                                         //启动转换
        ADC_SampleCache.LE[AdcIndex] = (uint16_t)(ADC->ADDR[0] & 0x00000FFF);      //向数组中读取值
        ADC_SampleCache.IA[AdcIndex] = (uint16_t)(ADC->ADDR[1] & 0x00000FFF);        
        ADC_SampleCache.IB[AdcIndex] = (uint16_t)(ADC->ADDR[2] & 0x00000FFF);
        ADC_SampleCache.IC[AdcIndex] = (uint16_t)(ADC->ADDR[3] & 0x00000FFF);
        ADC_SampleCache.UA[AdcIndex] = (uint16_t)(ADC->ADDR[4] & 0x00000FFF);
        ADC_SampleCache.UB[AdcIndex] = (uint16_t)(ADC->ADDR[5] & 0x00000FFF);
        ADC_SampleCache.UC[AdcIndex] = (uint16_t)(ADC->ADDR[6] & 0x00000FFF);        

}


这样看舒服些

使用特权

评论回复
7
w453509596|  楼主 | 2015-9-14 20:39 | 只看该作者

谢谢,我会注意的

使用特权

评论回复
8
w453509596|  楼主 | 2015-9-14 20:42 | 只看该作者
huangcunxiake 发表于 2015-9-13 21:59
变量乱跳?跑飞了吧

这个是我在测试AD采样电路时,发现的,程序是正常的,其它功能也正常

使用特权

评论回复
9
w453509596|  楼主 | 2015-9-14 20:43 | 只看该作者
bkn1860 发表于 2015-9-13 17:57
ADC输入加DC电压测,加电压如果还是这样那才是有问题,如果没有加电压检测结果乱跳很正常 ...

我没有空载,我接了一个电位器,大约有1V的直流电压

使用特权

评论回复
10
Roderman_z| | 2015-9-14 21:12 | 只看该作者
w453509596 发表于 2015-9-14 20:43
我没有空载,我接了一个电位器,大约有1V的直流电压

是整个都乱跳还是只有最后几位乱跳?

使用特权

评论回复
11
w453509596|  楼主 | 2015-9-14 21:28 | 只看该作者
Roderman_z 发表于 2015-9-14 21:12
是整个都乱跳还是只有最后几位乱跳?

是整个值都在那乱跳。

使用特权

评论回复
12
w453509596|  楼主 | 2015-9-14 21:29 | 只看该作者
本帖最后由 w453509596 于 2015-9-14 21:32 编辑
Roderman_z 发表于 2015-9-14 21:12
是整个都乱跳还是只有最后几位乱跳?

是整个值都在那乱跳,而且没有规律。今天我也找了好久,还是没有找到,以前我是一直用飞思卡尔的单片机,软件是codewarrior,KEIL还是第一次正儿八经的用。现在我也不了解怎么调试它,有新唐板子的朋友,大家帮我测试下,是不是只有我一个人有这个问题。

使用特权

评论回复
13
huangcunxiake| | 2015-9-15 12:12 | 只看该作者
w453509596 发表于 2015-9-14 20:42
这个是我在测试AD采样电路时,发现的,程序是正常的,其它功能也正常

我清楚了,你这个应该是悬空了,管脚悬空就是这样的。你这没错。

使用特权

评论回复
14
huangcunxiake| | 2015-9-15 12:12 | 只看该作者
w453509596 发表于 2015-9-14 20:43
我没有空载,我接了一个电位器,大约有1V的直流电压

你接地看看,或者接0.5VCC。

使用特权

评论回复
15
huangcunxiake| | 2015-9-15 12:13 | 只看该作者
w453509596 发表于 2015-9-14 21:29
是整个值都在那乱跳,而且没有规律。今天我也找了好久,还是没有找到,以前我是一直用飞思卡尔的单片机, ...

你设置个上拉或者下拉,试试看。悬空估计会这样。

使用特权

评论回复
16
tcchiu1| | 2015-9-15 18:24 | 只看该作者
另外你可以将时钟源分频设大一点,看看是不是取样时间不足。
CLK->CLKDIV |= (4U<<16);                               //时钟源分频 50 / (4+1) = 10MHZ  最大为16MHz

使用特权

评论回复
17
w453509596|  楼主 | 2015-9-18 09:14 | 只看该作者
huangcunxiake 发表于 2015-9-15 12:13
你设置个上拉或者下拉,试试看。悬空估计会这样。

模拟线不可以设上下拉的,数字功能模块被禁用了

使用特权

评论回复
18
w453509596|  楼主 | 2015-9-18 09:18 | 只看该作者
我初步猜测,这个可能和集成在新唐MCU内部的调试外设保留变量值的方式有关系,后来我又测试,不管这个值如何变,但是程序把采样的程再执行一次,变量中的值又变回正确的了

使用特权

评论回复
19
huangcunxiake| | 2015-9-18 22:08 | 只看该作者
如果实际工作是正常的,就不要太在意调试的信息。

使用特权

评论回复
20
734774645| | 2015-9-28 13:33 | 只看该作者
能用就好,不要太纠结的

使用特权

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

本版积分规则

6

主题

41

帖子

1

粉丝