风铃草2 发表于 2014-12-22 15:09:37

局部变量和全局变量请教

最开始定义AD是在函数里的局部变量 如下:
void AD_Single(unsigned char channel)
{      
      ADC_InitTypeDef   ADC_InitStructure;
......
}结果 一直得不到EOC
后来改成全局变量 在main函数里定义 再用extern ADC_InitTypeDef   ADC_InitStructure;
结果EOC FLAG就产生了 ,我晕 ,只要一换回去就又失败了
用调试看了下汇编 图片上传
这是ok的全局变量

这是失败的局部变量


Dylan疾风闪电 发表于 2014-12-23 15:46:47

重点是保证ADC_InitTypeDef结构体修改的配置,与初始化函数,在同一个作用域。
不要在A函数处修改结构体,却去B函数初始化外设。

风铃草2 发表于 2014-12-22 15:13:13

另上传源程序截图
这是定义的全局变量


这是我的工程文件 adc配置放在ad.c里面

这是定义成局部变量


这是AD采集等待EOC标志位





晓枫VS枯叶 发表于 2014-12-22 16:32:58

楼主要定义全局变量的话最好到函数外面去定义,然后另外一个地方extern就好了!

wambob 发表于 2014-12-22 19:41:39

全局变量具有全局作用域,如果是另1个文件中已经定义了,可以用引用头文件的方式,也可以用extern关键字.

局部变量的作用域作用于函数体范围.

风铃草2 发表于 2014-12-22 20:18:47

晓枫VS枯叶 发表于 2014-12-22 16:32
楼主要定义全局变量的话最好到函数外面去定义,然后另外一个地方extern就好了! ...

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

arm8686 发表于 2014-12-22 20:23:26

https://www.stmcu.org.cn/module/forum/data/attachment/forum/201412/22/151107yshhmhnjgamjyna9.jpg

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

之前没有初始化过,这里却执行 清初始化(DeInit)。

wambob 发表于 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

全局变量也称为外部变量,它是在函数外部定义的变量。 它不属于哪一个函数,它属于一个源程序文件。其作用域是从定义该变量的位置开始至源文件结束.而局部变量是定义在函数内部的作用域是之作用与该函数,当函数调用完以后,系统将会是放该变量占用的内存的。所以外部函数式调用不了的
页: [1] 2 3
查看完整版本: 局部变量和全局变量请教