1. 程式人生 > >用type定義的列舉型別和結構體

用type定義的列舉型別和結構體

1.用typedef定義列舉型別

typedef enum{
    GPIO_Mode_AIN = 0x00,
    GPIO_Mode_IN_FLOATING = 0x04,
    GPIO_Mode_IPD = 0X28,
    GPIO_Mode_IPU = 0x48,
    GPIO_Mode_Out_OD = 0x14,
    GPIO_Mode_Out_PP = 0x10,
    GPIO_Mode_AF_OD = 0x1C,
    GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;

GPIOMode_TypeDef是新型別名,使用它定義變數時和int a;

的方式類似,GPIOMode_TypeDef GPIO_Mode;給GPIO_Mode賦值時,只能取列舉當中定義的值。
此外,在C編譯時,對列舉按常量來處理,若沒有對列舉元素賦值,則C語言編譯時會按照定義時的順序依次對元素賦值為0,1,2……。當然,也可以想示例中那樣,在定義時由程式設計師指定元素的值。

2.用typedef定義結構體

typedef struct{
    uint16_t GPIO_Pin;
    GPIOSpeed_TypeDef GPIO_Speed;
    GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;

GPIO_InitTypeDef是新型別名

,定時變數的方式為:GPIO_InitTypeDef GPIO_InitStructure;。結構體應用時的格式是:變數名.成員名,例如GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

3.應用

// 定義GPIOMode_TypeDef列舉型別
typedef enum{
    GPIO_Mode_AIN = 0x00,
    GPIO_Mode_IN_FLOATING = 0x04,
    GPIO_Mode_IPD = 0X28,
    GPIO_Mode_IPU = 0x48,
    GPIO_Mode_Out_OD = 0x14,
    GPIO_Mode_Out_PP = 0x10
, GPIO_Mode_AF_OD = 0x1C, GPIO_Mode_AF_PP = 0x18 }GPIOMode_TypeDef; // 定義GPIOSpeed_TypeDef列舉型別 typedef enum{ GPIO_Speed_10MHZ = 1, GPIO_Speed_2MHZ, GPIO_Speed_50MHZ }GPIOSpeed_TypeDef; // 定義GPIO_InitTypeDef結構體型別 typedef struct{ uint16_t GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; }GPIO_InitTypeDef; #define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */ #define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */ #define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */ #define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */ #define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */ #define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */ #define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */ #define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */ #define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */ #define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */ #define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */ #define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */ #define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */ #define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */ #define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */ #define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */ #define GPIO_Pin_All((uint16_t)0xFFFF) /*!< All pins selected */ int main(void){ GPIO_InitTypeDef GPIOInitStructure;//定義變數 GPIOInitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIOInitStructure.GPIO_Speed = GPIO_Speed_50MHZ; GPIOInitStructure.GPIO_Mode = GPIO_Mode_Out_PP; }