[技术问答] M0516LEDN,KEIL硬件仿真,变量值乱变,求助

[复制链接]
3817|20
 楼主| w453509596 发表于 2015-9-12 14:12 | 显示全部楼层 |阅读模式
本帖最后由 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位           

整体图

整体图

第一次点开数组

第一次点开数组

第二次点开数组

第二次点开数组
 楼主| w453509596 发表于 2015-9-13 12:01 | 显示全部楼层
新唐的FAE大神在哪里,求指导,我后用JLINK 试了一下,也不行
bkn1860 发表于 2015-9-13 17:57 | 显示全部楼层
ADC输入加DC电压测,加电压如果还是这样那才是有问题,如果没有加电压检测结果乱跳很正常
西门扫雪 发表于 2015-9-13 20:10 | 显示全部楼层
空载的时候乱跳也是正常的
huangcunxiake 发表于 2015-9-13 21:59 | 显示全部楼层
变量乱跳?跑飞了吧
追逐浪花 发表于 2015-9-14 08:41 | 显示全部楼层
  1. static void MCU_ADC_Init(void)
  2. {
  3.         uint32_t reg32;
  4.         
  5.         reg32 = CLK->CLKSEL1;
  6.         reg32 &= ~CLK_CLKSEL1_ADC_S_Msk;
  7.         reg32 |= 0x00000008; //HCLK
  8.         CLK->CLKSEL1 = reg32;                                     //选择时钟源
  9.         CLK->CLKDIV |= (4U<<16);                               //时钟源分频 50 / (4+1) = 10MHZ  最大为16MHz
  10.         CLK->APBCLK |= CLK_APBCLK_ADC_EN_Msk;   //使能ADC时钟
  11.         
  12.         ADC->ADCR  = ((2U<<2) | (1U<<0));                //(ADC_ADCR_ADMD_SINGLE_CYCLE | ADC_ADCR_DIFFEN_SINGLE_END | ADC_ADCR_ADEN_CONVERTER_ENABLE); 单次扫描 ,单端采样,模块上电
  13.         ADC->ADCHER = 0x0000007F;                          //使能低7路ADC通道
  14.         ADC->ADSR   |= 0x01;                                      //清除ADC采样完成标志位
  15. }

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


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

  34. }


这样看舒服些
 楼主| w453509596 发表于 2015-9-14 20:39 | 显示全部楼层

谢谢,我会注意的
 楼主| w453509596 发表于 2015-9-14 20:42 | 显示全部楼层
huangcunxiake 发表于 2015-9-13 21:59
变量乱跳?跑飞了吧

这个是我在测试AD采样电路时,发现的,程序是正常的,其它功能也正常
 楼主| w453509596 发表于 2015-9-14 20:43 | 显示全部楼层
bkn1860 发表于 2015-9-13 17:57
ADC输入加DC电压测,加电压如果还是这样那才是有问题,如果没有加电压检测结果乱跳很正常 ...

我没有空载,我接了一个电位器,大约有1V的直流电压
Roderman_z 发表于 2015-9-14 21:12 | 显示全部楼层
w453509596 发表于 2015-9-14 20:43
我没有空载,我接了一个电位器,大约有1V的直流电压

是整个都乱跳还是只有最后几位乱跳?
 楼主| w453509596 发表于 2015-9-14 21:28 | 显示全部楼层
Roderman_z 发表于 2015-9-14 21:12
是整个都乱跳还是只有最后几位乱跳?

是整个值都在那乱跳。
 楼主| w453509596 发表于 2015-9-14 21:29 | 显示全部楼层
本帖最后由 w453509596 于 2015-9-14 21:32 编辑
Roderman_z 发表于 2015-9-14 21:12
是整个都乱跳还是只有最后几位乱跳?

是整个值都在那乱跳,而且没有规律。今天我也找了好久,还是没有找到,以前我是一直用飞思卡尔的单片机,软件是codewarrior,KEIL还是第一次正儿八经的用。现在我也不了解怎么调试它,有新唐板子的朋友,大家帮我测试下,是不是只有我一个人有这个问题。
huangcunxiake 发表于 2015-9-15 12:12 | 显示全部楼层
w453509596 发表于 2015-9-14 20:42
这个是我在测试AD采样电路时,发现的,程序是正常的,其它功能也正常

我清楚了,你这个应该是悬空了,管脚悬空就是这样的。你这没错。
huangcunxiake 发表于 2015-9-15 12:12 | 显示全部楼层
w453509596 发表于 2015-9-14 20:43
我没有空载,我接了一个电位器,大约有1V的直流电压

你接地看看,或者接0.5VCC。
huangcunxiake 发表于 2015-9-15 12:13 | 显示全部楼层
w453509596 发表于 2015-9-14 21:29
是整个值都在那乱跳,而且没有规律。今天我也找了好久,还是没有找到,以前我是一直用飞思卡尔的单片机, ...

你设置个上拉或者下拉,试试看。悬空估计会这样。
tcchiu1 发表于 2015-9-15 18:24 | 显示全部楼层
另外你可以将时钟源分频设大一点,看看是不是取样时间不足。
CLK->CLKDIV |= (4U<<16);                               //时钟源分频 50 / (4+1) = 10MHZ  最大为16MHz
 楼主| w453509596 发表于 2015-9-18 09:14 | 显示全部楼层
huangcunxiake 发表于 2015-9-15 12:13
你设置个上拉或者下拉,试试看。悬空估计会这样。

模拟线不可以设上下拉的,数字功能模块被禁用了
 楼主| w453509596 发表于 2015-9-18 09:18 | 显示全部楼层
我初步猜测,这个可能和集成在新唐MCU内部的调试外设保留变量值的方式有关系,后来我又测试,不管这个值如何变,但是程序把采样的程再执行一次,变量中的值又变回正确的了
huangcunxiake 发表于 2015-9-18 22:08 | 显示全部楼层
如果实际工作是正常的,就不要太在意调试的信息。
734774645 发表于 2015-9-28 13:33 来自手机 | 显示全部楼层
能用就好,不要太纠结的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

41

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部