AVR ATmega32 ADC驱动开发报错:adc.c中结构体赋值编译失败
问题:AVR ATmega32 ADC驱动编译错误
我正在为AVR ATmega32开发ADC驱动程序,在adc.c文件中执行以下两行代码时出现编译错误:
config.prescaler = ADC_prescaler_8; config.ref_volt = ADC_internal_2;
编译错误提示:
expected '=', ',', ';', 'asm' or '__attribute__' before '.' token
但相同代码在main文件中能正常运行。以下是adc.h和adc.c文件的代码:
adc.h 文件代码
/* * adc.h * * Created on: Feb 20, 2024 * Author: admin */ #include "std_types.h" #include <avr/io.h> #ifndef ADC_H_ #define ADC_H_ typedef enum { ADC_aREF , ADC_aVCC, ADC_internal_2=3 }ADC_refVoltage; typedef enum { ADC_prescaler_2=1,ADC_prescaler_4,ADC_prescaler_8,ADC_prescaler_16,ADC_prescaler_32 ,ADC_prescaler_64,ADC_prescaler_128 }ADC_prescaler; typedef struct{ ADC_refVoltage ref_volt; ADC_prescaler prescaler; }ADC_configType; void ADC_init(const ADC_configType * ptr); uint16 ADC_readChannel(uint8 channel); #endif /* ADC_H_ */
adc.c 文件代码
/* * adc.c * * Created on: Feb 20, 2024 * Author: admin */ #include "adc.h" #include "common_macros.h" ADC_configType config; config.prescaler = ADC_prescaler_8; // 错误出现位置 config.ref_volt = ADC_internal_2; // 错误出现位置 void ADC_init(const ADC_configType *ptr){ SET_BIT(ADCSRA,ADEN); ADCSRA = ((ADCSRA)&(0xF8)) | (ptr -> prescaler & 0x07); ADMUX = ((ADMUX) &(0x3F)) | (ptr -> ref_volt<<REFS0); CLEAR_BIT(ADCSRA,ADIE); } uint16 ADC_readChannel(uint8 channel){ ADMUX = (ADMUX&(0xE0))|(channel&(0x07)); SET_BIT(ADCSRA,ADSC); while(BIT_IS_CLEAR(ADCSRA,ADIF)); SET_BIT(ADCSRA,ADIF); return ADC; }
问题原因
语法规则违反:C语言中,变量的赋值语句必须放在函数内部执行,不能直接写在全局作用域(所有函数外部)。你在adc.c中把config的成员赋值语句放在了函数外面,这不符合C的语法要求;而main文件中的相同代码应该是写在main()函数内部,所以能正常编译。
解决方案
提供两种可行的修改方式:
方式一:定义全局变量时直接初始化
将全局变量config的定义和初始化合并,这样符合全局变量的初始化语法:
ADC_configType config = { .prescaler = ADC_prescaler_8, .ref_volt = ADC_internal_2 };
方式二:将赋值语句放入函数内部
如果需要动态初始化这个全局变量,可以创建一个专门的初始化函数,将赋值语句放在其中,之后在调用ADC_init前执行该函数:
ADC_configType config; void ADC_local_config_init(void) { config.prescaler = ADC_prescaler_8; config.ref_volt = ADC_internal_2; } void ADC_init(const ADC_configType *ptr){ SET_BIT(ADCSRA,ADEN); ADCSRA = ((ADCSRA)&(0xF8)) | (ptr -> prescaler & 0x07); ADMUX = ((ADMUX) &(0x3F)) | (ptr -> ref_volt<<REFS0); CLEAR_BIT(ADCSRA,ADIE); }
补充说明:如果你的
ADC_init设计是接受外部传入的配置参数,那么这个全局config可能没有存在的必要,直接在main函数中初始化配置结构体后传入ADC_init即可;如果是驱动内部使用固定配置,方式一的直接初始化更为简洁。
内容的提问来源于stack exchange,提问作者mitkees
相关产品推荐
相关产品推荐

