结构体、联合体、位域融合,巧妙灵活使用
参考地址: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位数的每一个位。
如果,感到此时的自己很辛苦,那告诉自己:容易走的都是下坡路。坚持住,因为你正在走上坡路,走过去,你就一定会有进步。如果,你正在埋怨命运不眷顾,开导自己:命,是失败者的借口;运,是成功者的谦词。命运从来都是掌握在自己的手中,埋怨,只是一种懦弱的表现;努力,才是人生的态度。

浙公网安备 33010602011771号