外围定义

时间:2015-06-03 08:25:05

标签: c

有人可以向初学者解释以下构造:

typedef struct
{
  __IO uint32_t CTRL;     /**< Control Register               */
  __IO uint32_t CNT;      /**< Counter Value Register         */
  __IO uint32_t COMP0;    /**< Compare Value Register 0       */
  __IO uint32_t COMP1;    /**< Compare Value Register 1       */
  __I uint32_t  IF;       /**< Interrupt Flag Register        */
  __IO uint32_t IFS;      /**< Interrupt Flag Set Register    */
  __IO uint32_t IFC;      /**< Interrupt Flag Clear Register  */
  __IO uint32_t IEN;      /**< Interrupt Enable Register      */
  __IO uint32_t FREEZE;   /**< Freeze Register                */
  __I uint32_t  SYNCBUSY; /**< Synchronization Busy Register  */
} RTC_TypeDef;    


#define RTC_BASE     (0x40080000UL)
#define RTC          ((RTC_TypeDef *) RTC_BASE)    

尤其是最后一行

为什么括号如此不寻常? *是什么意思?指针或乘法运算符?

由于

3 个答案:

答案 0 :(得分:0)

  

为什么括号如此不寻常? *是什么意思?指针或   乘法运算符?

*这里是指针而不是乘法运算符。

宏观上没有什么不寻常之处。只是将地址类型转换为类型struct RTC_TypeDef

答案 1 :(得分:0)

结构定义非常简单,变量封装在结构中。然后可以将该结构引用为[diff] tool = winmerge [difftool "winmerge"] cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" -e "$LOCAL" "$REMOTE" [difftool] prompt = false [merge] tool = winmerge [mergetool "winmerge"] cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" \"$MERGED\" \"$REMOTE\" [mergetool] keepBackup = false trustExitCode = false ,因为您使用RTC_TypeDef

typedef

以下行表示每次编写typedef struct { __IO uint32_t CTRL; /**< Control Register */ __IO uint32_t CNT; /**< Counter Value Register */ __IO uint32_t COMP0; /**< Compare Value Register 0 */ __IO uint32_t COMP1; /**< Compare Value Register 1 */ __I uint32_t IF; /**< Interrupt Flag Register */ __IO uint32_t IFS; /**< Interrupt Flag Set Register */ __IO uint32_t IFC; /**< Interrupt Flag Clear Register */ __IO uint32_t IEN; /**< Interrupt Enable Register */ __IO uint32_t FREEZE; /**< Freeze Register */ __I uint32_t SYNCBUSY; /**< Synchronization Busy Register */ } RTC_TypeDef; /** @} */ 时,编译器都会将该行替换为RTC_BASE

(0x40080000UL)

最后,以下几行可以分为两部分:

#define RTC_BASE          (0x40080000UL)

这意味着(RTB_TypeDef *)RTC_BASE - 基本上告诉编译器将内存地址(RTB_TypeDef *)(0x40080000UL)视为指向0x40080000UL的指针

并且额外的括号用于表示单个变量作为复合表达式RTC。 从那时起,只要编译器看到RTB_TypeDef,它就会用RTC替换它,基本上是一种在内存中标记此结构开头的便捷方法

答案 2 :(得分:0)

每当在数据类型(甚至用户定义的数据类型)之后遇到单个或多个*时,它就是一个指针。

你称之为建筑:

typedef struct
{
    __IO uint32_t CTRL;     /**< Control Register  */

    __IO uint32_t CNT;      /**< Counter Value Register  */
    __IO uint32_t COMP0;    /**< Compare Value Register 0  */
    __IO uint32_t COMP1;    /**< Compare Value Register 1  */
    __I uint32_t  IF;       /**< Interrupt Flag Register  */
    __IO uint32_t IFS;      /**< Interrupt Flag Set Register  */
    __IO uint32_t IFC;      /**< Interrupt Flag Clear Register  */
    __IO uint32_t IEN;      /**< Interrupt Enable Register  */

    __IO uint32_t FREEZE;   /**< Freeze Register  */
    __I uint32_t  SYNCBUSY; /**< Synchronization Busy Register  */
} RTC_TypeDef;

是一种结构,以编程方式称为struct,用户定义的数据类型。 struct是C中的关键字。typedef也是如此。为了保持现在的简单,我要说,typedef这里专门用于编写RTC_TypeDef;而不是需要编写struct stRTC

RTC_BASE是一个宏。因此,在编译之前,预处理器将RTC_BASE替换为值(0x40080000UL),这是为了方便和可读性。

最后一行:

#define RTC          ((RTC_TypeDef *) RTC_BASE)

也是一个宏定义。这只是RTC_Typedef类型的指针,指向位于地址(0x40080000UL)的任何内容 因此,在编译之前,预处理器将用RTC替换((RTC_TypeDef *)0x40080000UL)的所有实例。 如果递增RTC指针,它将递增sizeof(RTC_Typedef)