0

IO を定義する簡単な方法を作ろうとしています。マクロでこれを実行しようとしていますが、この問題を解決できません。

これは私がしました:

// Buzzer PORT and PIN mapping
#define BUZZER_PORT     B       // PORT
#define BUZZER_PIN      2       // PCR pin
#define BUZZER_ALT      1       // Pin alternativne function

#define INIT_BUZZER(PORTX, PIN, ALT) { PORT##PORTX##_PCR(PIN) = PORT_PCR_MUX((ALT)) |     PORT_PCR_DSE_MASK;            GPIO##PORTX##_PDDR |= PIN<<1; }

関数呼び出し作業:

INIT_BUZZER(B, BUZZER_PIN, BUZZER_ALT);

関数呼び出しが必要です:

INIT_BUZZER(BUZZER_PORT, BUZZER_PIN, BUZZER_ALT);

ポート引数 BUZZER_PORT を指定して呼び出すと、コンパイラは引数値ではなく文字列自体を受け取るため、エラーが発生します。

これに対処する方法は?

4

2 に答える 2

0

間接化が必要です:

#define INIT_BUZZER_(PORTX, PIN, ALT)                                   \
    do {                                                                \
        PORT##PORTX##_PCR(PIN) = PORT_PCR_MUX(ALT) | PORT_PCR_DSE_MASK; \
        GPIO##PORTX##_PDDR |= (PIN)<<1;                                 \
    } while (0)

#define INIT_BUZZER(PORTX, PIN, ALT)                                    \
        INIT_BUZZER_(PORTX, PIN, ALT)

do {...} while(0)また、セミコロンがないことにも注意してください。これは、マクロで複数の行を囲む通常の方法です。

于 2013-07-09T23:26:15.053 に答える