我正在尝试一种简单的方法来定义我的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调用它,我会收到错误,因为编译器不接受我的参数值而是字符串本身。
如何处理?
答案 0 :(得分:0)
尽可能使用括号。
尝试以下: INIT_BUZZER((BUZZER_PORT),BUZZER_PIN,BUZZER_ALT);
答案 1 :(得分: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)
并且没有分号,这是在宏中包含多行的常规方法