This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2355:extern 限定符不起作用??

Guru**** 2528780 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1013592/msp430fr2355-extern-specifier-not-working

器件型号:MSP430FR2355

有人能告诉我我下面缺少的是什么… 将 main.h 代码放置在 main.c 文件中并进行所有编译...但是我希望消除所有混乱并将结构定义放置在 main.h 中  当我这么做时、我会遇到大量类似如下的错误:

 第13行:警告#78-D:此声明没有存储类或类型说明符
 第13行:错误#66:预期为";"

main.c

#include "main.h"

void main(void)
{
    extern DAC_Handle_t ControlVoltage;


    WDTCTL = WDTPW | WDTHOLD;

    DAC_Init(&ControlVoltage);


}

main.h

#ifndef INC_MAIN_H_
#define INC_MAIN_H_

#include "dac.h"

ControlVoltage.pDACx = DAC0;
ControlVoltage.DAC_Config.OA_Source = INTERNAL;
ControlVoltage.DAC_Config.OA_Speed = HIGH_SPEED;
ControlVoltage.DAC_Config.OA_InputConfig = NONINVERTING;
ControlVoltage.DAC_Config.OA_GainConfig = BUFFER;
ControlVoltage.DAC_Config.DAC_Value = 100;

#endif /* INC_MAIN_H_ */

dac.h --此文件位于 main.h 之外的单独文件夹下,但包含在编译器选项中。

#include <msp430.h>
#include <stdint.h>

typedef struct
{
    volatile uint16_t SACOA;       /*OpAmp input config register            Offset 0x00 */
    volatile uint16_t SACPGA;      /*OpAmp gain register                    Offset 0x02 */
    volatile uint16_t SACDAC;      /*DAC setup register                     Offset 0x04 */
    volatile uint16_t SACDAT;      /*DAC data register                      Offset 0x06 */
    volatile uint16_t SACDATSTS;   /*DAC flag status register               Offset 0x08 */
}DAC_RegDef_t;

typedef struct
{
    volatile uint16_t PMMCTL[3];   /*pmm control register                   Offset 0x00 - 0x04 */
}PMM_RegDef_t;

#define DAC0   (DAC_RegDef_t *)SAC0_BASE
#define DAC1   (DAC_RegDef_t *)SAC1_BASE
#define DAC2   (DAC_RegDef_t *)SAC2_BASE
#define DAC3   (DAC_RegDef_t *)SAC3_BASE
#define PMM    (PMM_RegDef_t *)PMM_BASE


typedef struct
{
    uint8_t OA_InputConfig;         /*values @OA_INPUT */
    uint8_t OA_GainConfig;          /*values @OA_GAIN */
    uint8_t OA_Source;                /*values @OA_SOURCE */
    uint8_t OA_Speed;               /*values @OA_SPEED */
    uint8_t DAC_Value;
}DAC_Config_t;

/*
 * @OA_INPUT
 */
#define INVERTING      0
#define NONINVERTING   1

/*
 * @OA_GAIN
 */
#define BUFFER          1
#define INV_GAIN1       BUFFER
#define INV_GAIN2       INV_GAIN1 + 1
#define INV_GAIN4       INV_GAIN2 + 1
#define INV_GAIN8       INV_GAIN4 + 1
#define INV_GAIN16      INV_GAIN8 + 1
#define INV_GAIN25      INV_GAIN16 + 1
#define INV_GAIN32      INV_GAIN25 + 1
#define NONINV_GAIN2    BUFFER
#define NONINV_GAIN3    NONINV_GAIN2 + 1
#define NONINV_GAIN5    NONINV_GAIN3 + 1
#define NONINV_GAIN9    NONINV_GAIN5 + 1
#define NONINV_GAIN17   NONINV_GAIN9 + 1
#define NONINV_GAIN26   NONINV_GAIN17 + 1
#define NONINV_GAIN33   NONINV_GAIN26 + 1

/*
 * @OA_SOURCE
 */
#define INTERNAL      0
#define EXTERNAL      1

/*
 * @OA_SPEED
 */
#define HIGH_SPEED  0
#define LOW_SPEED   1

/*
 * handle structure for GPIO pin
 */
typedef struct
{
    DAC_RegDef_t *pDACx; /*holds base address of GPIO port to which pin belongs */
    DAC_Config_t DAC_Config; /*holds GPIO pin configuration settings */
}DAC_Handle_t;


/*
 * general
 */
#define SPEED 9
#define UNLOCK 0xA5

void DAC_Init(DAC_Handle_t *pDACHandle);

#endif /* DRIVERS_INC_DAC_H_ */

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您从不在任何地方实际定义 ControlVoltage、而是进行声明。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    main.h 具有一组可执行代码。 当#include-ed 超出函数时、它将被解释为(未成功)一组声明。

    通常、您不应将可执行代码放入头文件中。 (存在例外情况、但它们很少。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我尝试了以下方法,但仍然不起作用...我“相信”我在 h 文件中定义 ControlVoltage ...作为一个硬件人员,我尝试将其组合在一起。 很明显、我仍然缺少一些基本的东西

    #include "main.h"
    
    
    void main(void)
    {
        extern DAC_Handle_t ControlVoltage;
    
        WDTCTL = WDTPW | WDTHOLD;
    
        DAC_Init(&ControlVoltage);
    }
    

    #ifndef INC_MAIN_H_
    #define INC_MAIN_H_
    
    #include "dac.h"
    #include "stdio.h"
    
    DAC_Handle_t ControlVoltage;
    
    ControlVoltage.pDACx = DAC0;
    ControlVoltage.DAC_Config.OA_Source = INTERNAL;
    ControlVoltage.DAC_Config.OA_Speed = HIGH_SPEED;
    ControlVoltage.DAC_Config.OA_InputConfig = NONINVERTING;
    ControlVoltage.DAC_Config.OA_GainConfig = BUFFER;
    ControlVoltage.DAC_Config.DAC_Value = 100;
    
    #endif /* INC_MAIN_H_ */
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有趣的… 我刚刚发布了一些我尝试的代码...所以我听到你在这里说了两件事... 1.  如果我要执行此操作、请在此处为头文件使用另一个名称、而不是 main.h   2. 我不应该在 all....best 上这样做来保留 main.c 前端的结构定义???  这似乎有点“丑”,因为没有一个更好的词……认为有一种干净的方法可以把定义放在其他地方

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    分配必须在函数中。 您不能仅仅放置代码。 何时执行?