【问题标题】:struct, the 'Star' operator and what this means?struct,'Star' 运算符,这是什么意思?
【发布时间】:2014-08-13 10:41:15
【问题描述】:

我不是C++人,不知道有没有人能解释一下为什么在C#的结构中使用*运算符?

#define TIM1_BASE            (APB2PERIPH_BASE + 0x4400)
#define TIM1               ((TIM_TypeDef *) TIM1_BASE)

typedef struct
{
 __IO uint16_t CR1;

} TIM_TypeDef;

例如,TIM1 是否成为类实例?这段代码中的 * 运算符有什么作用?

编辑 这在 C# 中看起来如何?

编辑我从人们那里得到了多么消极的反应。伤心!!!这不是'StackOverFlow'的全部内容吗?恕我直言,有些是FUBAR!!!

在 C# 中,这就是我的问题:

private static unsafe TIM_TypeDef* TIM1 = ((TIM_TypeDef*) TIM1_BASE);

TIM1 是一个 TIM_TypeDef 指针。 TIM_TypeDef 是一个结构,类似于一个类。感谢现有的答案,但他们确实没有直接回答我的问题。

【问题讨论】:

  • 我不确定这是 C++。我的猜测是* 操作符做了它一直做的事情,定义了一个指针。
  • @keyser 并非总是如此。它还可以进行乘法和取消引用。
  • @PolymorphicPotato 我很清楚。我的意思是在这种情况下。
  • 此外,* 的作用与在 C# 中的作用几乎相同。
  • 我向你保证,有解释。只是不要着急:p 我的建议是寻找使用 TIM1TIM1_BASE 的代码

标签: c++ operators


【解决方案1】:

* 运算符实际上并未应用于您的示例中的任何内容。

在这里((TIM_TypeDef *) TIM1_BASE) 我们看到TIM1_BASE 被转换为TIM_TypeDef ** 表示该类型是指针类型。 TIM_TypeDef * 表示指向TIM_TypeDef 的指针。

【讨论】:

    【解决方案2】:

    * 是类型的一部分:TIM_TypeDef *,即:指向TIM_TypeDef 的指针。

    (Type) value 是“C 风格”cast,一种从一种类型转换为另一种类型的方法。

    【讨论】:

      【解决方案3】:

      在类型中,结尾的* 表示指针类型。即对于任何类型TT* 是“指向 T 的指针”类型。所以TIM_TypeDef* 是“指向TIM_TypeDef 的指针”类型,其中TIM_TypeDef 是在别处定义的类型。

      当然((T) exp)T 的转换。

      【讨论】:

      • 那么 TIM1 变成了 TIM_TypeDef 类型? TIM1 变成了什么?例如,如果将其放入数组中。
      【解决方案4】:

      sepp2K、Karoly 和 Robert 的三个答案是非常好的答案,但我想要更具描述性的答案。

      所以,忠于时尚,在一些人相当消极的反应之后,我做了一个更好的捕鼠器。

      完整的代码可以在这里找到:http://ghiopensource.codeplex.com/SourceControl/latest#DeviceCode/Targets/Native/STM32F4/DeviceCode/stm32f4xx.h

      C++代码sn-p:

      typedef struct
      {
      __IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */
      __IO uint32_t OTYPER;   /*!< GPIO port output type register,        Address offset: 0x04      */
      __IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,       Address offset: 0x08      */
      __IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */
      __IO uint32_t IDR;      /*!< GPIO port input data register,         Address offset: 0x10      */
      __IO uint32_t ODR;      /*!< GPIO port output data register,        Address offset: 0x14      */
      __IO uint16_t BSRRL;    /*!< GPIO port bit set/reset low register,  Address offset: 0x18      */
      __IO uint16_t BSRRH;    /*!< GPIO port bit set/reset high register, Address offset: 0x1A      */
      __IO uint32_t LCKR;     /*!< GPIO port configuration lock register, Address offset: 0x1C      */
      __IO uint32_t AFR[2];   /*!< GPIO alternate function registers,     Address offset: 0x20-0x24 */
      } GPIO_TypeDef;
      
      ....
      
      #define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
      #define GPIOB               ((GPIO_TypeDef *) GPIOB_BASE)
      #define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)
      #define GPIOD               ((GPIO_TypeDef *) GPIOD_BASE)
      #define GPIOE               ((GPIO_TypeDef *) GPIOE_BASE)
      #define GPIOF               ((GPIO_TypeDef *) GPIOF_BASE)
      #define GPIOG               ((GPIO_TypeDef *) GPIOG_BASE)
      #define GPIOH               ((GPIO_TypeDef *) GPIOH_BASE)
      #define GPIOI               ((GPIO_TypeDef *) GPIOI_BASE)
      ....
      
      /*!< AHB1 peripherals */
      #define GPIOA_BASE            (AHB1PERIPH_BASE + 0x0000)
      #define GPIOB_BASE            (AHB1PERIPH_BASE + 0x0400)
      #define GPIOC_BASE            (AHB1PERIPH_BASE + 0x0800)
      #define GPIOD_BASE            (AHB1PERIPH_BASE + 0x0C00)
      #define GPIOE_BASE            (AHB1PERIPH_BASE + 0x1000)
      #define GPIOF_BASE            (AHB1PERIPH_BASE + 0x1400)
      #define GPIOG_BASE            (AHB1PERIPH_BASE + 0x1800)
      #define GPIOH_BASE            (AHB1PERIPH_BASE + 0x1C00)
      #define GPIOI_BASE            (AHB1PERIPH_BASE + 0x2000)
      
      ....
      
      
      /******************************************************************************/
      /*                                                                            */
      /*                            General Purpose I/O                             */
      /*                                                                            */
      /******************************************************************************/
      /******************  Bits definition for GPIO_MODER register  *****************/
      #define GPIO_MODER_MODER0                    ((uint32_t)0x00000003)
      #define GPIO_MODER_MODER0_0                  ((uint32_t)0x00000001)
      #define GPIO_MODER_MODER0_1                  ((uint32_t)0x00000002)
      
      #define GPIO_MODER_MODER1                    ((uint32_t)0x0000000C)
      #define GPIO_MODER_MODER1_0                  ((uint32_t)0x00000004)
      #define GPIO_MODER_MODER1_1                  ((uint32_t)0x00000008)
      
      #define GPIO_MODER_MODER2                    ((uint32_t)0x00000030)
      #define GPIO_MODER_MODER2_0                  ((uint32_t)0x00000010)
      #define GPIO_MODER_MODER2_1                  ((uint32_t)0x00000020)
      
      #define GPIO_MODER_MODER3                    ((uint32_t)0x000000C0)
      #define GPIO_MODER_MODER3_0                  ((uint32_t)0x00000040)
      #define GPIO_MODER_MODER3_1                  ((uint32_t)0x00000080)
      
      #define GPIO_MODER_MODER4                    ((uint32_t)0x00000300)
      #define GPIO_MODER_MODER4_0                  ((uint32_t)0x00000100)
      #define GPIO_MODER_MODER4_1                  ((uint32_t)0x00000200)
      
      #define GPIO_MODER_MODER5                    ((uint32_t)0x00000C00)
      #define GPIO_MODER_MODER5_0                  ((uint32_t)0x00000400)
      #define GPIO_MODER_MODER5_1                  ((uint32_t)0x00000800)
      
      #define GPIO_MODER_MODER6                    ((uint32_t)0x00003000)
      #define GPIO_MODER_MODER6_0                  ((uint32_t)0x00001000)
      #define GPIO_MODER_MODER6_1                  ((uint32_t)0x00002000)
      
      #define GPIO_MODER_MODER7                    ((uint32_t)0x0000C000)
      #define GPIO_MODER_MODER7_0                  ((uint32_t)0x00004000)
      #define GPIO_MODER_MODER7_1                  ((uint32_t)0x00008000)
      
      #define GPIO_MODER_MODER8                    ((uint32_t)0x00030000)
      #define GPIO_MODER_MODER8_0                  ((uint32_t)0x00010000)
      #define GPIO_MODER_MODER8_1                  ((uint32_t)0x00020000)
      
      #define GPIO_MODER_MODER9                    ((uint32_t)0x000C0000)
      #define GPIO_MODER_MODER9_0                  ((uint32_t)0x00040000)
      #define GPIO_MODER_MODER9_1                  ((uint32_t)0x00080000)
      
      #define GPIO_MODER_MODER10                   ((uint32_t)0x00300000)
      #define GPIO_MODER_MODER10_0                 ((uint32_t)0x00100000)
      #define GPIO_MODER_MODER10_1                 ((uint32_t)0x00200000)
      
      #define GPIO_MODER_MODER11                   ((uint32_t)0x00C00000)
      #define GPIO_MODER_MODER11_0                 ((uint32_t)0x00400000)
      #define GPIO_MODER_MODER11_1                 ((uint32_t)0x00800000)
      
      #define GPIO_MODER_MODER12                   ((uint32_t)0x03000000)
      #define GPIO_MODER_MODER12_0                 ((uint32_t)0x01000000)
      #define GPIO_MODER_MODER12_1                 ((uint32_t)0x02000000)
      
      #define GPIO_MODER_MODER13                   ((uint32_t)0x0C000000)
      #define GPIO_MODER_MODER13_0                 ((uint32_t)0x04000000)
      #define GPIO_MODER_MODER13_1                 ((uint32_t)0x08000000)
      
      #define GPIO_MODER_MODER14                   ((uint32_t)0x30000000)
      #define GPIO_MODER_MODER14_0                 ((uint32_t)0x10000000)
      #define GPIO_MODER_MODER14_1                 ((uint32_t)0x20000000)
      
      #define GPIO_MODER_MODER15                   ((uint32_t)0xC0000000)
      #define GPIO_MODER_MODER15_0                 ((uint32_t)0x40000000)
      #define GPIO_MODER_MODER15_1                 ((uint32_t)0x80000000)
      
      /******************  Bits definition for GPIO_OTYPER register  ****************/
      #define GPIO_OTYPER_OT_0                     ((uint32_t)0x00000001)
      #define GPIO_OTYPER_OT_1                     ((uint32_t)0x00000002)
      #define GPIO_OTYPER_OT_2                     ((uint32_t)0x00000004)
      #define GPIO_OTYPER_OT_3                     ((uint32_t)0x00000008)
      #define GPIO_OTYPER_OT_4                     ((uint32_t)0x00000010)
      #define GPIO_OTYPER_OT_5                     ((uint32_t)0x00000020)
      #define GPIO_OTYPER_OT_6                     ((uint32_t)0x00000040)
      #define GPIO_OTYPER_OT_7                     ((uint32_t)0x00000080)
      #define GPIO_OTYPER_OT_8                     ((uint32_t)0x00000100)
      #define GPIO_OTYPER_OT_9                     ((uint32_t)0x00000200)
      #define GPIO_OTYPER_OT_10                    ((uint32_t)0x00000400)
      #define GPIO_OTYPER_OT_11                    ((uint32_t)0x00000800)
      #define GPIO_OTYPER_OT_12                    ((uint32_t)0x00001000)
      #define GPIO_OTYPER_OT_13                    ((uint32_t)0x00002000)
      #define GPIO_OTYPER_OT_14                    ((uint32_t)0x00004000)
      #define GPIO_OTYPER_OT_15                    ((uint32_t)0x00008000)
      
      /******************  Bits definition for GPIO_OSPEEDR register  ***************/
      #define GPIO_OSPEEDER_OSPEEDR0               ((uint32_t)0x00000003)
      #define GPIO_OSPEEDER_OSPEEDR0_0             ((uint32_t)0x00000001)
      #define GPIO_OSPEEDER_OSPEEDR0_1             ((uint32_t)0x00000002)
      
      #define GPIO_OSPEEDER_OSPEEDR1               ((uint32_t)0x0000000C)
      #define GPIO_OSPEEDER_OSPEEDR1_0             ((uint32_t)0x00000004)
      #define GPIO_OSPEEDER_OSPEEDR1_1             ((uint32_t)0x00000008)
      
      #define GPIO_OSPEEDER_OSPEEDR2               ((uint32_t)0x00000030)
      #define GPIO_OSPEEDER_OSPEEDR2_0             ((uint32_t)0x00000010)
      #define GPIO_OSPEEDER_OSPEEDR2_1             ((uint32_t)0x00000020)
      
      #define GPIO_OSPEEDER_OSPEEDR3               ((uint32_t)0x000000C0)
      #define GPIO_OSPEEDER_OSPEEDR3_0             ((uint32_t)0x00000040)
      #define GPIO_OSPEEDER_OSPEEDR3_1             ((uint32_t)0x00000080)
      
      #define GPIO_OSPEEDER_OSPEEDR4               ((uint32_t)0x00000300)
      #define GPIO_OSPEEDER_OSPEEDR4_0             ((uint32_t)0x00000100)
      #define GPIO_OSPEEDER_OSPEEDR4_1             ((uint32_t)0x00000200)
      
      #define GPIO_OSPEEDER_OSPEEDR5               ((uint32_t)0x00000C00)
      #define GPIO_OSPEEDER_OSPEEDR5_0             ((uint32_t)0x00000400)
      #define GPIO_OSPEEDER_OSPEEDR5_1             ((uint32_t)0x00000800)
      
      #define GPIO_OSPEEDER_OSPEEDR6               ((uint32_t)0x00003000)
      #define GPIO_OSPEEDER_OSPEEDR6_0             ((uint32_t)0x00001000)
      #define GPIO_OSPEEDER_OSPEEDR6_1             ((uint32_t)0x00002000)
      
      #define GPIO_OSPEEDER_OSPEEDR7               ((uint32_t)0x0000C000)
      #define GPIO_OSPEEDER_OSPEEDR7_0             ((uint32_t)0x00004000)
      #define GPIO_OSPEEDER_OSPEEDR7_1             ((uint32_t)0x00008000)
      
      #define GPIO_OSPEEDER_OSPEEDR8               ((uint32_t)0x00030000)
      #define GPIO_OSPEEDER_OSPEEDR8_0             ((uint32_t)0x00010000)
      #define GPIO_OSPEEDER_OSPEEDR8_1             ((uint32_t)0x00020000)
      
      #define GPIO_OSPEEDER_OSPEEDR9               ((uint32_t)0x000C0000)
      #define GPIO_OSPEEDER_OSPEEDR9_0             ((uint32_t)0x00040000)
      #define GPIO_OSPEEDER_OSPEEDR9_1             ((uint32_t)0x00080000)
      
      #define GPIO_OSPEEDER_OSPEEDR10              ((uint32_t)0x00300000)
      #define GPIO_OSPEEDER_OSPEEDR10_0            ((uint32_t)0x00100000)
      #define GPIO_OSPEEDER_OSPEEDR10_1            ((uint32_t)0x00200000)
      
      #define GPIO_OSPEEDER_OSPEEDR11              ((uint32_t)0x00C00000)
      #define GPIO_OSPEEDER_OSPEEDR11_0            ((uint32_t)0x00400000)
      #define GPIO_OSPEEDER_OSPEEDR11_1            ((uint32_t)0x00800000)
      
      #define GPIO_OSPEEDER_OSPEEDR12              ((uint32_t)0x03000000)
      #define GPIO_OSPEEDER_OSPEEDR12_0            ((uint32_t)0x01000000)
      #define GPIO_OSPEEDER_OSPEEDR12_1            ((uint32_t)0x02000000)
      
      #define GPIO_OSPEEDER_OSPEEDR13              ((uint32_t)0x0C000000)
      #define GPIO_OSPEEDER_OSPEEDR13_0            ((uint32_t)0x04000000)
      #define GPIO_OSPEEDER_OSPEEDR13_1            ((uint32_t)0x08000000)
      
      #define GPIO_OSPEEDER_OSPEEDR14              ((uint32_t)0x30000000)
      #define GPIO_OSPEEDER_OSPEEDR14_0            ((uint32_t)0x10000000)
      #define GPIO_OSPEEDER_OSPEEDR14_1            ((uint32_t)0x20000000)
      
      #define GPIO_OSPEEDER_OSPEEDR15              ((uint32_t)0xC0000000)
      #define GPIO_OSPEEDER_OSPEEDR15_0            ((uint32_t)0x40000000)
      #define GPIO_OSPEEDER_OSPEEDR15_1            ((uint32_t)0x80000000)
      
      /******************  Bits definition for GPIO_PUPDR register  *****************/
      #define GPIO_PUPDR_PUPDR0                    ((uint32_t)0x00000003)
      #define GPIO_PUPDR_PUPDR0_0                  ((uint32_t)0x00000001)
      #define GPIO_PUPDR_PUPDR0_1                  ((uint32_t)0x00000002)
      
      #define GPIO_PUPDR_PUPDR1                    ((uint32_t)0x0000000C)
      #define GPIO_PUPDR_PUPDR1_0                  ((uint32_t)0x00000004)
      #define GPIO_PUPDR_PUPDR1_1                  ((uint32_t)0x00000008)
      
      #define GPIO_PUPDR_PUPDR2                    ((uint32_t)0x00000030)
      #define GPIO_PUPDR_PUPDR2_0                  ((uint32_t)0x00000010)
      #define GPIO_PUPDR_PUPDR2_1                  ((uint32_t)0x00000020)
      
      #define GPIO_PUPDR_PUPDR3                    ((uint32_t)0x000000C0)
      #define GPIO_PUPDR_PUPDR3_0                  ((uint32_t)0x00000040)
      #define GPIO_PUPDR_PUPDR3_1                  ((uint32_t)0x00000080)
      
      #define GPIO_PUPDR_PUPDR4                    ((uint32_t)0x00000300)
      #define GPIO_PUPDR_PUPDR4_0                  ((uint32_t)0x00000100)
      #define GPIO_PUPDR_PUPDR4_1                  ((uint32_t)0x00000200)
      
      #define GPIO_PUPDR_PUPDR5                    ((uint32_t)0x00000C00)
      #define GPIO_PUPDR_PUPDR5_0                  ((uint32_t)0x00000400)
      #define GPIO_PUPDR_PUPDR5_1                  ((uint32_t)0x00000800)
      
      #define GPIO_PUPDR_PUPDR6                    ((uint32_t)0x00003000)
      #define GPIO_PUPDR_PUPDR6_0                  ((uint32_t)0x00001000)
      #define GPIO_PUPDR_PUPDR6_1                  ((uint32_t)0x00002000)
      
      #define GPIO_PUPDR_PUPDR7                    ((uint32_t)0x0000C000)
      #define GPIO_PUPDR_PUPDR7_0                  ((uint32_t)0x00004000)
      #define GPIO_PUPDR_PUPDR7_1                  ((uint32_t)0x00008000)
      
      #define GPIO_PUPDR_PUPDR8                    ((uint32_t)0x00030000)
      #define GPIO_PUPDR_PUPDR8_0                  ((uint32_t)0x00010000)
      #define GPIO_PUPDR_PUPDR8_1                  ((uint32_t)0x00020000)
      
      #define GPIO_PUPDR_PUPDR9                    ((uint32_t)0x000C0000)
      #define GPIO_PUPDR_PUPDR9_0                  ((uint32_t)0x00040000)
      #define GPIO_PUPDR_PUPDR9_1                  ((uint32_t)0x00080000)
      
      #define GPIO_PUPDR_PUPDR10                   ((uint32_t)0x00300000)
      #define GPIO_PUPDR_PUPDR10_0                 ((uint32_t)0x00100000)
      #define GPIO_PUPDR_PUPDR10_1                 ((uint32_t)0x00200000)
      
      #define GPIO_PUPDR_PUPDR11                   ((uint32_t)0x00C00000)
      #define GPIO_PUPDR_PUPDR11_0                 ((uint32_t)0x00400000)
      #define GPIO_PUPDR_PUPDR11_1                 ((uint32_t)0x00800000)
      
      #define GPIO_PUPDR_PUPDR12                   ((uint32_t)0x03000000)
      #define GPIO_PUPDR_PUPDR12_0                 ((uint32_t)0x01000000)
      #define GPIO_PUPDR_PUPDR12_1                 ((uint32_t)0x02000000)
      
      #define GPIO_PUPDR_PUPDR13                   ((uint32_t)0x0C000000)
      #define GPIO_PUPDR_PUPDR13_0                 ((uint32_t)0x04000000)
      #define GPIO_PUPDR_PUPDR13_1                 ((uint32_t)0x08000000)
      
      #define GPIO_PUPDR_PUPDR14                   ((uint32_t)0x30000000)
      #define GPIO_PUPDR_PUPDR14_0                 ((uint32_t)0x10000000)
      #define GPIO_PUPDR_PUPDR14_1                 ((uint32_t)0x20000000)
      
      #define GPIO_PUPDR_PUPDR15                   ((uint32_t)0xC0000000)
      #define GPIO_PUPDR_PUPDR15_0                 ((uint32_t)0x40000000)
      #define GPIO_PUPDR_PUPDR15_1                 ((uint32_t)0x80000000)
      
      /******************  Bits definition for GPIO_IDR register  *******************/
      #define GPIO_IDR_IDR_0                       ((uint32_t)0x00000001)
      #define GPIO_IDR_IDR_1                       ((uint32_t)0x00000002)
      #define GPIO_IDR_IDR_2                       ((uint32_t)0x00000004)
      #define GPIO_IDR_IDR_3                       ((uint32_t)0x00000008)
      #define GPIO_IDR_IDR_4                       ((uint32_t)0x00000010)
      #define GPIO_IDR_IDR_5                       ((uint32_t)0x00000020)
      #define GPIO_IDR_IDR_6                       ((uint32_t)0x00000040)
      #define GPIO_IDR_IDR_7                       ((uint32_t)0x00000080)
      #define GPIO_IDR_IDR_8                       ((uint32_t)0x00000100)
      #define GPIO_IDR_IDR_9                       ((uint32_t)0x00000200)
      #define GPIO_IDR_IDR_10                      ((uint32_t)0x00000400)
      #define GPIO_IDR_IDR_11                      ((uint32_t)0x00000800)
      #define GPIO_IDR_IDR_12                      ((uint32_t)0x00001000)
      #define GPIO_IDR_IDR_13                      ((uint32_t)0x00002000)
      #define GPIO_IDR_IDR_14                      ((uint32_t)0x00004000)
      #define GPIO_IDR_IDR_15                      ((uint32_t)0x00008000)
      /* Old GPIO_IDR register bits definition, maintained for legacy purpose */
      #define GPIO_OTYPER_IDR_0                    GPIO_IDR_IDR_0
      #define GPIO_OTYPER_IDR_1                    GPIO_IDR_IDR_1
      #define GPIO_OTYPER_IDR_2                    GPIO_IDR_IDR_2
      #define GPIO_OTYPER_IDR_3                    GPIO_IDR_IDR_3
      #define GPIO_OTYPER_IDR_4                    GPIO_IDR_IDR_4
      #define GPIO_OTYPER_IDR_5                    GPIO_IDR_IDR_5
      #define GPIO_OTYPER_IDR_6                    GPIO_IDR_IDR_6
      #define GPIO_OTYPER_IDR_7                    GPIO_IDR_IDR_7
      #define GPIO_OTYPER_IDR_8                    GPIO_IDR_IDR_8
      #define GPIO_OTYPER_IDR_9                    GPIO_IDR_IDR_9
      #define GPIO_OTYPER_IDR_10                   GPIO_IDR_IDR_10
      #define GPIO_OTYPER_IDR_11                   GPIO_IDR_IDR_11
      #define GPIO_OTYPER_IDR_12                   GPIO_IDR_IDR_12
      #define GPIO_OTYPER_IDR_13                   GPIO_IDR_IDR_13
      #define GPIO_OTYPER_IDR_14                   GPIO_IDR_IDR_14
      #define GPIO_OTYPER_IDR_15                   GPIO_IDR_IDR_15
      
      /******************  Bits definition for GPIO_ODR register  *******************/
      #define GPIO_ODR_ODR_0                       ((uint32_t)0x00000001)
      #define GPIO_ODR_ODR_1                       ((uint32_t)0x00000002)
      #define GPIO_ODR_ODR_2                       ((uint32_t)0x00000004)
      #define GPIO_ODR_ODR_3                       ((uint32_t)0x00000008)
      #define GPIO_ODR_ODR_4                       ((uint32_t)0x00000010)
      #define GPIO_ODR_ODR_5                       ((uint32_t)0x00000020)
      #define GPIO_ODR_ODR_6                       ((uint32_t)0x00000040)
      #define GPIO_ODR_ODR_7                       ((uint32_t)0x00000080)
      #define GPIO_ODR_ODR_8                       ((uint32_t)0x00000100)
      #define GPIO_ODR_ODR_9                       ((uint32_t)0x00000200)
      #define GPIO_ODR_ODR_10                      ((uint32_t)0x00000400)
      #define GPIO_ODR_ODR_11                      ((uint32_t)0x00000800)
      #define GPIO_ODR_ODR_12                      ((uint32_t)0x00001000)
      #define GPIO_ODR_ODR_13                      ((uint32_t)0x00002000)
      #define GPIO_ODR_ODR_14                      ((uint32_t)0x00004000)
      #define GPIO_ODR_ODR_15                      ((uint32_t)0x00008000)
      /* Old GPIO_ODR register bits definition, maintained for legacy purpose */
      #define GPIO_OTYPER_ODR_0                    GPIO_ODR_ODR_0
      #define GPIO_OTYPER_ODR_1                    GPIO_ODR_ODR_1
      #define GPIO_OTYPER_ODR_2                    GPIO_ODR_ODR_2
      #define GPIO_OTYPER_ODR_3                    GPIO_ODR_ODR_3
      #define GPIO_OTYPER_ODR_4                    GPIO_ODR_ODR_4
      #define GPIO_OTYPER_ODR_5                    GPIO_ODR_ODR_5
      #define GPIO_OTYPER_ODR_6                    GPIO_ODR_ODR_6
      #define GPIO_OTYPER_ODR_7                    GPIO_ODR_ODR_7
      #define GPIO_OTYPER_ODR_8                    GPIO_ODR_ODR_8
      #define GPIO_OTYPER_ODR_9                    GPIO_ODR_ODR_9
      #define GPIO_OTYPER_ODR_10                   GPIO_ODR_ODR_10
      #define GPIO_OTYPER_ODR_11                   GPIO_ODR_ODR_11
      #define GPIO_OTYPER_ODR_12                   GPIO_ODR_ODR_12
      #define GPIO_OTYPER_ODR_13                   GPIO_ODR_ODR_13
      #define GPIO_OTYPER_ODR_14                   GPIO_ODR_ODR_14
      #define GPIO_OTYPER_ODR_15                   GPIO_ODR_ODR_15
      
      /******************  Bits definition for GPIO_BSRR register  ******************/
      #define GPIO_BSRR_BS_0                       ((uint32_t)0x00000001)
      #define GPIO_BSRR_BS_1                       ((uint32_t)0x00000002)
      #define GPIO_BSRR_BS_2                       ((uint32_t)0x00000004)
      #define GPIO_BSRR_BS_3                       ((uint32_t)0x00000008)
      #define GPIO_BSRR_BS_4                       ((uint32_t)0x00000010)
      #define GPIO_BSRR_BS_5                       ((uint32_t)0x00000020)
      #define GPIO_BSRR_BS_6                       ((uint32_t)0x00000040)
      #define GPIO_BSRR_BS_7                       ((uint32_t)0x00000080)
      #define GPIO_BSRR_BS_8                       ((uint32_t)0x00000100)
      #define GPIO_BSRR_BS_9                       ((uint32_t)0x00000200)
      #define GPIO_BSRR_BS_10                      ((uint32_t)0x00000400)
      #define GPIO_BSRR_BS_11                      ((uint32_t)0x00000800)
      #define GPIO_BSRR_BS_12                      ((uint32_t)0x00001000)
      #define GPIO_BSRR_BS_13                      ((uint32_t)0x00002000)
      #define GPIO_BSRR_BS_14                      ((uint32_t)0x00004000)
      #define GPIO_BSRR_BS_15                      ((uint32_t)0x00008000)
      #define GPIO_BSRR_BR_0                       ((uint32_t)0x00010000)
      #define GPIO_BSRR_BR_1                       ((uint32_t)0x00020000)
      #define GPIO_BSRR_BR_2                       ((uint32_t)0x00040000)
      #define GPIO_BSRR_BR_3                       ((uint32_t)0x00080000)
      #define GPIO_BSRR_BR_4                       ((uint32_t)0x00100000)
      #define GPIO_BSRR_BR_5                       ((uint32_t)0x00200000)
      #define GPIO_BSRR_BR_6                       ((uint32_t)0x00400000)
      #define GPIO_BSRR_BR_7                       ((uint32_t)0x00800000)
      #define GPIO_BSRR_BR_8                       ((uint32_t)0x01000000)
      #define GPIO_BSRR_BR_9                       ((uint32_t)0x02000000)
      #define GPIO_BSRR_BR_10                      ((uint32_t)0x04000000)
      #define GPIO_BSRR_BR_11                      ((uint32_t)0x08000000)
      #define GPIO_BSRR_BR_12                      ((uint32_t)0x10000000)
      #define GPIO_BSRR_BR_13                      ((uint32_t)0x20000000)
      #define GPIO_BSRR_BR_14                      ((uint32_t)0x40000000)
      #define GPIO_BSRR_BR_15                      ((uint32_t)0x80000000)
      
      ....
      

      所以我的问题:“我想知道是否有人可以解释为什么在 C# 结构中使用 * 运算符”这是在 C# 中:: p>

      public sealed class GPIO
      {
      #region Private's...
      
      private UInt32 _MODER = 0x00;
      private UInt32 _OTYPER = 0x04;
      private UInt32 _OSPEEDR = 0x08;
      private UInt32 _PUPDR = 0x0C;
      private UInt32 _IDR = 0x10;
      private UInt32 _ODR = 0x14;
      private UInt32 _BSRRL = 0x18;
      private UInt32 _BSRRH = 0x1A;
      private UInt32 _LCKR = 0x1C;
      // private UInt32 AFR[2] = 0x20-0x24;
      
      #endregion
      
      #region Properties...
      
      /// <summary>
      /// GPIO port mode register, Address offset: 0x00
      /// </summary>
      public UInt32 MODER { get { return _MODER; } set { _MODER = value; } }  
      
      /// <summary>
      /// GPIO port output type register, Address offset: 0x04
      /// </summary>
      public UInt32 OTYPER { get { return _OTYPER; } set { _OTYPER = value; } } 
      
      /// <summary>
      /// GPIO port output speed register, Address offset: 0x08
      /// </summary>
      public UInt32 OSPEEDR { get { return _OSPEEDR; } set { _OSPEEDR = value; } } 
      
      /// <summary>
      /// GPIO port pull-up/pull-down register, Address offset: 0x0C
      /// </summary>
      public UInt32 PUPDR { get { return _PUPDR; } set { _PUPDR = value; } }  
      
      /// <summary>
      /// GPIO port input data register, Address offset: 0x10 
      /// </summary>
      public UInt32 IDR { get { return _IDR; } set { _IDR = value; } }  
      
      /// <summary>
      /// GPIO port output data register, Address offset: 0x14
      /// </summary>
      public UInt32 ODR { get { return _ODR; } set { _ODR = value; } } 
      
      /// <summary>
      /// GPIO port bit set/reset low register, Address offset: 0x18
      /// </summary>
      public UInt32 BSRRL { get { return _BSRRL; } set { _BSRRL = value; } } 
      
      /// <summary>
      /// GPIO port bit set/reset high register, Address offset: 0x1A
      /// </summary>
      public UInt32 BSRRH { get { return _BSRRH; } set { _BSRRH = value; } } 
      
      /// <summary>
      /// GPIO port configuration lock register, Address offset: 0x1C
      /// </summary>
      public UInt32 LCKR { get { return _LCKR; } set { _LCKR = value; } }  
      
      /// <summary>
      /// GPIO alternate function registers, Address offset: 0x20-0x24
      /// </summary>
      // public UInt32 AFR[2] { get { return _AFR; } set { _AFR = value; } }    
      
      #endregion
      
      #region Registers...
      
      /// <summary>
      /// GPIO port mode register, Address offset: 0x00
      /// </summary>
      public Register MODER_Register;
      
      /// <summary>
      /// GPIO port output type register, Address offset: 0x04
      /// </summary>
      public Register OTYPER_Register;
      
      /// <summary>
      /// GPIO port output speed register, Address offset: 0x08
      /// </summary>
      public Register OSPEEDR_Register;
      
      /// <summary>
      /// GPIO port pull-up/pull-down register, Address offset: 0x0C
      /// </summary>
      public Register PUPDR_Register;
      
      /// <summary>
      /// GPIO port input data register, Address offset: 0x10 
      /// </summary>
      public Register IDR_Register;
      
      /// <summary>
      /// GPIO port output data register, Address offset: 0x14
      /// </summary>
      public Register ODR_Register;
      
      /// <summary>
      /// GPIO port bit set/reset low register, Address offset: 0x18
      /// </summary>
      public Register BSRRL_Register;
      
      /// <summary>
      /// GPIO port bit set/reset high register, Address offset: 0x1A
      /// </summary>
      public Register BSRRH_Register;
      
      /// <summary>
      /// GPIO port configuration lock register, Address offset: 0x1C
      /// </summary>
      public Register LCKR_Register;
      
      /// <summary>
      /// GPIO alternate function registers, Address offset: 0x20-0x24
      /// </summary>
      // public Register AFR[2];    
      
      #endregion
      
      /// <summary>
      /// GPIOA. Class Type for defining the GPIOA Register Types...
      /// </summary>
      public static GPIO GPIOA = new GPIO(STM32F4xx.GPIOA_BASE);
      
      /// <summary>
      /// GPIOB. Class Type for defining the GPIOB Register Types...
      /// </summary>
      public static GPIO GPIOB = new GPIO(STM32F4xx.GPIOB_BASE);
      
      public GPIO(UInt32 GPIOx_BASE)
      {
      MODER_Register = new Register(GPIOx_BASE + MODER);
      OTYPER_Register = new Register(GPIOx_BASE + OTYPER);
      OSPEEDR_Register = new Register(GPIOx_BASE + OSPEEDR);
      PUPDR_Register = new Register(GPIOx_BASE + PUPDR);
      IDR_Register = new Register(GPIOx_BASE + IDR);
      ODR_Register = new Register(GPIOx_BASE + ODR);
      BSRRL_Register = new Register(GPIOx_BASE + BSRRL);
      BSRRH_Register = new Register(GPIOx_BASE + BSRRH);
      LCKR_Register = new Register(GPIOx_BASE + LCKR); 
      }
      }
      

      所以你可以看到,上面声明为结构的“GPIO_TypeDef”,我已在我的 C# 代码中配置为类“GPIO”。我已将寄存器设置为公共,但 UInt32 设置为私有,并且只使用属性来访问它们。 * 运算符,就像指出的答案一样是一个指针。为了避免在我的编辑中使用不安全的代码,在我的问题中,我将公共属性和寄存器设置为基于 GPIOx_BASE UInt。

      public static class STM32F4xx
      {
      public static uint GPIOA_BASE = (AHB1PERIPH_BASE + 0x0000);
      }
      

      相当优雅,我可以简单地使用以下代码来设置寄存器值:

      GPIO.GPIOA.MODER_Register.SetBits(3 << 8);
      

      我听说有人说 C++ 是一门高级语言,但我必须说如果你不熟悉它,请阅读它是 MUMBOJUMBO!!!

      不过,在体验之后,我确实对 C++ 有了更多了解。

      【讨论】:

        猜你喜欢
        • 2021-12-18
        • 2016-03-07
        • 1970-01-01
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        • 2013-05-07
        • 2013-07-03
        相关资源
        最近更新 更多