参考地址:http://www.51hei.com/bbs/dpj-39303-1.html
1 typedef union 2 { 3 __u32 dwval; // 这里是对寄存器整体赋值修改 4 struct 5 { 6 __u32 io_map_sel : 1 ; // default: 0; 7 __u32 res0 : 29 ; // default: ; 8 __u32 tcon_gamma_en : 1 ; // default: 0; 9 __u32 tcon_en : 1 ; // default: 0; 10 } bits; // 这里个单独对某些寄存器进行操作 11 } tcon_gctl_reg_t;
/* 联合体 只占用4个字节*/
因联合体的特性,dwval与 bits 共用同一个内存空间;因结构体的特性,将每个寄存器分开;因位域的特性,得以单独修改某一位或几个位
---------------------------------------------------------------------------------------------------------------------------------------------------------
GPIOA
基址 + 偏移地址
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) (强制类型转换)
强制转为GPIO_TypeDef 类型的指针,表示从 0x40010800 开始连续占用sizeof(GPIO_TypeDef) 字节的长度。注意,它把 0x40010800 转为 GPIO_TypeDef 类型的指针,即GPIOA的地址0x40010800。
看看GPIO_Pin的定义 #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 */ 仔细观察,发现定义的宏都很有规律,展开二进制来看刚刚好是对应16位数的每一个位。