【发布时间】:2013-05-16 10:33:17
【问题描述】:
我现在正在用 C 语言为 MSP430 编写程序,并使用端口 1.6、1.7、2.0、2.1 和 2.2 来驱动一些 LED。现在,为了打开所有 LED,我只需要写:
P1OUT |= 0xC0;
P2OUT |= 0x07;
但是,我想知道是否可以创建一个指向 P2OUT 寄存器 (0x0029) 的位 0、1 和 2 以及 P1OUT 寄存器的位 6 和 7 的 C 结构(名称为 LED_ACTIVATION) (0x0021),这将允许我写这样的东西:
LED_ACTIVATION = 0x2F;
其中端口 2.2 是最高有效位(位 5),端口 1.6 是最低有效位(位 0)。
在 MSP 中,我们可以像这样对每个寄存器进行赋值:
__no_init volatile union
{
unsigned char P1OUT; /* Port 1 Output */
struct
{
unsigned char P0 : 1; /* */
unsigned char P1 : 1; /* */
unsigned char P2 : 1; /* */
unsigned char P3 : 1; /* */
unsigned char P4 : 1; /* */
unsigned char P5 : 1; /* */
unsigned char P6 : 1; /* */
unsigned char P7 : 1; /* */
}P1OUT_bit;
} @0x0021;
或者像这样:
#define P1OUT_ (0x0021u) /* Port 1 Output */
DEFC( P1OUT , P1OUT_)
但是两个寄存器地址可以混用吗?
谢谢。
【问题讨论】:
-
您不能为此目的使用 C 功能“位域”,除非一页一页地浏览编译器文档。 See this。实际上,您根本无法以任何有用的方式使用位域。不幸的是,它们在 C 中毫无价值。请改用位掩码。
-
将结构指向内存(或编译域之外的任何东西)是不好的,出于任何原因使用位域都是非常糟糕的,不惜一切代价避免它们。特别是对于 MSP430,没有什么比您在问题中开始使用的代码更好的了。它就像您将要获得的一样直接和简单。
-
@Lundin 和 dwelch,感谢您的回复和链接!我想我将不得不坚持使用位掩码。
标签: c struct embedded cpu-registers msp430