You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:16:27