结构体、联合体、位域融合,巧妙灵活使用

参考地址: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位数的每一个位。

 

上一篇:PWM介绍(STM32库函数)


下一篇:LBDP电量数据管理(三)