你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

局部变量和全局变量请教

[复制链接]
飞儿 提问时间:2014-12-22 15:09 /
最开始定义AD是在函数里的局部变量 如下:
void AD_Single(unsigned char channel)
{        
        ADC_InitTypeDef     ADC_InitStructure;
......
}结果 一直得不到EOC
后来改成全局变量 在main函数里定义 再用extern ADC_InitTypeDef     ADC_InitStructure;
结果EOC FLAG就产生了 ,我晕 ,只要一换回去  就又失败了  
用调试看了下汇编 图片上传
这是ok的全局变量
ok.jpg
这是失败的局部变量
fail.jpg

收藏 评论23 发布时间:2014-12-22 15:09

举报

23个回答
Dylan疾风闪电 回答时间:2014-12-23 15:46:47
重点是保证ADC_InitTypeDef结构体修改的配置,与初始化函数,在同一个作用域。
不要在A函数处修改结构体,却去B函数初始化外设。
飞儿 回答时间:2014-12-24 10:14:17
Dylan疾风闪电 发表于 2014-12-23 15:46
重点是保证ADC_InitTypeDef结构体修改的配置,与初始化函数,在同一个作用域。
不要在A函数处修改结构体, ...

1. 正常运行
extern  ADC_InitTypeDef     ADC_InitStructure;
void AD_Single(unsigned char channel)
{        
  ADC_DeInit(ADC1);
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;                                         
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                                                
  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
  ADC_Init(ADC1, &ADC_InitStructure);

  ADC_ChannelConfig(ADC1, channel , ADC_SampleTime_13_5Cycles);   
  ADC_GetCalibrationFactor(ADC1);
  ADC_WaitModeCmd(ADC1, ENABLE);
  ADC_AutoPowerOffCmd(ADC1, ENABLE);
  ADC_Cmd(ADC1, ENABLE);     
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));         
}
2.只中断一次,就不再中断的情况
void AD_Single(unsigned char channel)
{        
ADC_InitTypeDef     ADC_InitStructure;
  ADC_DeInit(ADC1);
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;                                         
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                                                
  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
  ADC_Init(ADC1, &ADC_InitStructure);

  ADC_ChannelConfig(ADC1, channel , ADC_SampleTime_13_5Cycles);   
  ADC_GetCalibrationFactor(ADC1);
  ADC_WaitModeCmd(ADC1, ENABLE);
  ADC_AutoPowerOffCmd(ADC1, ENABLE);
  ADC_Cmd(ADC1, ENABLE);     
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));         
}

初始化和配置都是在一个作用域的
飞儿 回答时间:2014-12-23 19:30:03
全都没明白我意思,直接重新上代码
1. 正常运行
extern  ADC_InitTypeDef     ADC_InitStructure;
void AD_Single(unsigned char channel)
{       
  ADC_DeInit(ADC1);
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;                                        
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                                               
  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
  ADC_Init(ADC1, &ADC_InitStructure);

  ADC_ChannelConfig(ADC1, channel , ADC_SampleTime_13_5Cycles);   
  ADC_GetCalibrationFactor(ADC1);
  ADC_WaitModeCmd(ADC1, ENABLE);
  ADC_AutoPowerOffCmd(ADC1, ENABLE);
  ADC_Cmd(ADC1, ENABLE);     
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));        
}
2.只中断一次,就不再中断的情况
void AD_Single(unsigned char channel)
{       
ADC_InitTypeDef     ADC_InitStructure;
  ADC_DeInit(ADC1);
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;                                        
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                                               
  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
  ADC_Init(ADC1, &ADC_InitStructure);

  ADC_ChannelConfig(ADC1, channel , ADC_SampleTime_13_5Cycles);   
  ADC_GetCalibrationFactor(ADC1);
  ADC_WaitModeCmd(ADC1, ENABLE);
  ADC_AutoPowerOffCmd(ADC1, ENABLE);
  ADC_Cmd(ADC1, ENABLE);     
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));        
}
飞儿 回答时间:2014-12-22 15:13:13
另上传源程序截图
这是定义的全局变量
~QPC03_GOQ7XKNPE[7KC}GO.jpg

这是我的工程文件 adc配置放在ad.c里面
E1AUBEM]34~5}68TV8WQ()7.jpg
这是定义成局部变量


这是AD采集等待EOC标志位

[WXC`BKZ{93@D}]]O6B$Y9T.jpg



晓枫VS枯叶 回答时间:2014-12-22 16:32:58
楼主要定义全局变量的话最好到函数外面去定义,然后另外一个地方extern就好了!
wamcncn 回答时间:2014-12-22 19:41:39
全局变量具有全局作用域,如果是另1个文件中已经定义了,可以用引用头文件的方式,也可以用extern关键字.

局部变量的作用域作用于函数体范围.
飞儿 回答时间:2014-12-22 20:18:47
晓枫VS枯叶 发表于 2014-12-22 16:32
楼主要定义全局变量的话最好到函数外面去定义,然后另外一个地方extern就好了! ...

哥们 你没懂我意思  我是说  我定义成全局变量 ADC初始化成功 ,改成局部变量就失败 ,调试的时候 两者的内容是一模一样 区别就在汇编里面 但是就是没找到原因
arm8686 回答时间:2014-12-22 20:23:26


这里的函数,传递一个ADC的通道进来。
ADC_DeInit(ADC1); 这句里头的 ADC1,从哪里来的?这是个实参吧?

之前没有初始化过,这里却执行 清初始化(DeInit)。
wamcncn 回答时间:2014-12-22 20:39:23
变量的使用要遵循先定义后使用,请问那改成局部变量的时候,定义在哪
奔跑小蜗牛 回答时间:2014-12-23 10:00:11
    ADC_DeInit(ADC1); ADC的初始化过程调用的是全局变量,如果把 ADC_InitTypeDef   ADC_InitStructure定义为局部结构体变量,会造成ADC调取不到初始化配置,ADC不能完成正常初始化,自然也就得不到EOC了
小贾-370388 回答时间:2014-12-23 13:59:33
全局变量也称为外部变量,它是在函数外部定义的变量。 它不属于哪一个函数,它属于一个源程序文件。其作用域是从定义该变量的位置开始至源文件结束.而局部变量是定义在函数内部的作用域是之作用与该函数,当函数调用完以后,系统将会是放该变量占用的内存的。所以外部函数式调用不了的
飞儿 回答时间:2014-12-23 19:23:05
arm8686 发表于 2014-12-22 20:23
这里的函数,传递一个ADC的通道进来。
ADC_DeInit(ADC1); 这句里头的 ADC1,从哪里来的?这是个实参吧?
...

ADC1是STM32库函数里定义的,那个传输来的通道是多余变量 我没用它
飞儿 回答时间:2014-12-23 19:26:44
奔跑小蜗牛 发表于 2014-12-23 10:00
ADC_DeInit(ADC1); ADC的初始化过程调用的是全局变量,如果把 ADC_InitTypeDef   ADC_InitStructure定 ...

void AD_Single(unsigned char channel)
{       
       
        ADC_DeInit(ADC1);
  
  /* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits*/
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;                                                 //¾«¶È
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//ENABLE;                        //µ¥Ò»Ä£Ê½
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//Èí¼þ´¥·¢       
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;                                                //ÓÒ¶ÔÆë
  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
  ADC_Init(ADC1, &ADC_InitStructure);

这是我的函数  原先是在void AD_Single(unsigned char channel)里面定义的
ADC_InitTypeDef     ADC_InitStructure;结果中断了一次 就不再中断了
现在放在函数外面定义成全局变量 就能正常了 不知道为什么我都是在函数里面赋值 太TMD郁闷了
飞儿 回答时间:2014-12-23 19:30:21
只有这么一个区别
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版