C Union,结构内数组的填充

标签 c struct stm32 unions

我有如下代码:

  struct MODER_BITS
{   __IO uint32_t MODER0:2;
    __IO uint32_t MODER1:2;
    __IO uint32_t MODER2:2;
    __IO uint32_t MODER3:2;
    __IO uint32_t MODER4:2;
    __IO uint32_t MODER5:2;
    __IO uint32_t MODER6:2;
    __IO uint32_t MODER7:2;
    __IO uint32_t MODER8:2;
    __IO uint32_t MODER9:2;
    __IO uint32_t MODER10:2;
    __IO uint32_t MODER11:2;
    __IO uint32_t MODER12:2;
    __IO uint32_t MODER13:2;
    __IO uint32_t MODER14:2;
    __IO uint32_t MODER15:2;
};

typedef union {
    __IO uint32_t all;
    struct MODER_BITS bit;
}MODER_REG;

然后我就可以使用 GPIO 结构了

typedef struct
{
  MODER_REG MODER_REG;
  //__IO uint32_t MODER    ;/*!< GPIO port mode register,                  
  __IO uint32_t OTYPER;   /*!< GPIO port output type register,            */
  __IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,          */
  __IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,     */
  __IO uint32_t IDR;      /*!< GPIO port input data register,            */
  __IO uint32_t ODR;      /*!< GPIO port output data register,           */
  __IO uint32_t BSRR;     /*!< GPIO port bit set/reset register,          */
  __IO uint32_t LCKR;     /*!< GPIO port configuration lock register,     */
  __IO uint32_t AFR[2];   /*!< GPIO alternate function registers,     */
} GPIO_TypeDef;

然后我可以像这样使用这个定义:

GPIOA->MODER_REG.bit.MODER0=0x2;

有什么方法可以在 MODER_REG 结构体中使用数组吗?像这样使用 GPIO:

GPIOA->MODER_REG.bit.MODER[0]=0x2;

应该如何定义

struct MODER_BITS{
 __IO uint32_t MODER[?]:? //options     
}

附言: __IO只是一个volatile的宏

请指教。

最佳答案

没有办法。 C 不允许位数组。

但是,您仍然可以使用位掩码访问原始单词:

GPIOA->MODER_REG.all = (GPIOA->MODER_REG.all)&(~3<<0)|(2<<0);

第一部分重置位置 0 的位,第二部分设置值 2。

关于C Union,结构内数组的填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41914981/

相关文章:

c - Windows 在 Visual Studio 中触发了断点错误

c - 私有(private)定义结构的公共(public) sizeof

C——基本结构问题

c - strdup() 的用法

c - 如何根据字符串的值访问 `struct' 的成员?

timer - stm32动态定时器设置改变

c - glibc - 获取具有包含指定地址的符号的共享库句柄

c - 为什么运行时上下文在为 10g 编译的程序中不能在 11g 上工作?

c++ - STM32 C++ 运算符 new (CoDE)

c - STM32 - TIM2_ETR 引脚,连接到引脚 PA0(按钮),以奇怪的方式递增定时器