风铃草2 发表于 2014-12-23 19:23:05

arm8686 发表于 2014-12-22 20:23
这里的函数,传递一个ADC的通道进来。
ADC_DeInit(ADC1); 这句里头的 ADC1,从哪里来的?这是个实参吧?
...

ADC1是STM32库函数里定义的,那个传输来的通道是多余变量 我没用它

风铃草2 发表于 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郁闷了

风铃草2 发表于 2014-12-23 19:30:03

全都没明白我意思,直接重新上代码
1. 正常运行
externADC_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));        
}

风铃草2 发表于 2014-12-23 19:30:21

只有这么一个区别

风铃草2 发表于 2014-12-24 10:14:17

Dylan疾风闪电 发表于 2014-12-23 15:46
重点是保证ADC_InitTypeDef结构体修改的配置,与初始化函数,在同一个作用域。
不要在A函数处修改结构体, ...

1. 正常运行
externADC_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));         
}

初始化和配置都是在一个作用域的

风铃草2 发表于 2014-12-24 10:17:20

风铃草2 发表于 2014-12-24 10:14
1. 正常运行
externADC_InitTypeDef   ADC_InitStructure;
void AD_Single(unsigned char channel)


写错了 不是中断一次是只获得一次EOC While 就死循环了
int main()
{
while(1)
{
                for(loopi=0;loopi<8;loopi++)
                {
                                /* ADC1 regular Software Start Conv */
                                ADC_StartOfConversion(ADC1);
                                while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==0);
                                        adtot=adtot+ADC_GetConversionValue(ADC1);
                                ADC_ClearFlag(ADC1,ADC_FLAG_EOC);                       
                }
}
}

Dylan疾风闪电 发表于 2014-12-24 15:15:36

本帖最后由 Dylan疾风闪电 于 2014-12-24 15:27 编辑

ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
中的ADC_ScanDirection_Upward是哪来的参数?自定义?
是否满足FunctionalState ADC_ContinuousConvMode;?

风铃草2 发表于 2014-12-24 15:53:21

Dylan疾风闪电 发表于 2014-12-24 15:15
ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
中的ADC_ScanDirection_Upward是哪来的 ...

库里面定义的 ,你可以去 -->资料下载 --> STM32F0-->固件...-->STM32F0探索套件固件包,包括21个例程和为4个不同IDE配置的项目 下载下来就知道 人家定义的

Dylan疾风闪电 发表于 2014-12-24 16:21:27

刚看了一下,STM32的CM3和CM0的ADC寄存器改变了很多。回去研究下再来答复你。

wenyangzeng 发表于 2014-12-30 14:59:30

在局部变量前加:static
页: 1 [2] 3
查看完整版本: 局部变量和全局变量请教