2

我现在正在为微控制器使用嵌入式 C,我发现有时有几个外围设备只有一个字母不同(例如 UARTA、UARTB 等)。除了其他相同的寄存器的字母外,每个外围设备的代码通常都是相同的。例如,设置外围 AI 会执行以下操作:

UCA2CTL1 |= UCSWRST;                      // Put state machine in reset
UCA2CTL0 |= UCSYNC+UCCKPL+UCMSB;          // 3-pin, 8-bit SPI slave
// Continue initializing peripheral registers with "A" in name

并且设置外设 BI 具有完全相同的代码,除了寄存器名称由 1 个字母转置:

UCB2CTL1 |= UCSWRST;                      // Put state machine in reset
UCB2CTL0 |= UCSYNC+UCCKPL+UCMSB;          // 3-pin, 8-bit SPI slave
// Continue initializing peripheral registers with "B" in name

我希望能够更改目标外围设备,而无需#ifdef/复制/粘贴代码或查找/替换。是否有一些编译器指令或巧妙的技巧可以实现这种行为,这样我只需编写一次代码?我很想只 #define 外围设备中的最后一个字母,但类似的东西似乎危险地徘徊在靠近代码的地方,对我来说很臭。

4

2 回答 2

3

这对你有用吗?

#define INITUC(device) \
UC ## device ## 2CTL1 |= UCSWRST; \
UC ## device ## 2CTL0 |= UCSYNC+UCCKPL+UCMSB
...
INITUC(A);
INITUC(B);
于 2012-04-11T20:21:31.433 回答
1

假设这些常量是const而不是defines你可以做这样的事情:

#define MAKECONST(X) const int X ## 1; \
                     const int X ## 0; \
                     X ## 1 |= UCSWRST; \
                     X ## 0 |= UCSYNC+UCCKPL+UCMSB;

进而:

MAKECONST(UCA2CTL)
MAKECONST(UCB2CTL)

请注意,我的示例包括声明,我不知道您是否需要,如果不需要,请省略定义的前两行。例如:

#define SETUP(X) X ## 1 |= UCSWRST; \
                 X ## 0 |= UCSYNC+UCCKPL+UCMSB;
于 2012-04-11T20:17:57.510 回答