【问题标题】:MSP430 - Mixing Ports Registers inside an structMSP430 - 在结构内混合端口寄存器
【发布时间】: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


【解决方案1】:

MSP430 不可位/引脚寻址。所以,不,您不能创建包含来自多个端口的单个引脚的结构。

为了制作:

LED_ACTIVATION = 0x2F;

您需要使用函数或宏。

另请参阅:Accessing individual I/O pin on MSP430

【讨论】:

  • @jegonz,为了保持赋值运算符语法,我使用 C++ 运算符重载而不是宏或函数。我更喜欢“LED_ACTIVATION = 0x2F”而不是“LED_ACTIVATION(0x2F)”的可读性,但它显然需要一个你可能没有的 C++ 编译器。
  • @embedded.kyle,感谢您的回复。我现在正在使用函数和宏,但我只是想知道结构是否可行。谢谢!
  • @benpro,感谢您的回复。我也有一个 C++ 编译器,但所有项目都是用 C 编写的,所以最好坚持使用 C。无论如何,谢谢,在使用 C++ 时会考虑到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 2022-06-22
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多