位操作
&运算
通过与一堆1111,来筛选想要的位并保留
通过与一堆0000,来将不想要的位置置0
110011011
111111000
|运算
通过或一堆1111,用来全置1
通过或一堆0000,来筛选想要的位
右移
2 >> 1:相当于2/2。
99 >> 1: 相当于 99/2 向下取整为49。
99 >> 2:相当于 99/pow(2,2)向下取整为24。
999 >> i:相当于999 / pow(2,i)。
整数 >> i:相当于将这个整数化为二进制整数,并去掉这个数的末尾的 i 位数字。
unsigned 无符号型,全是正数 001 >>1 为000
signed 带符号最高位为符号位
左移
2 << 1:相当于2*2。
99 << 1: 相当于 99*2 。
99 << 2:相当于 99*pow(2,2)。
999 << i:相当于999 * pow(2,i)。
整数 << i:相当于将这个整数化为二进制整数,并在这个数的末尾加上 i 个0。
~运算符
按位取反
十进制 1 的二进制表示为:
0000 0001
每位都取反为:
1111 1110
^异或运算
相同为0,不同为1
define宏定义

ifdef条件编译

extern变量申明

定义只允许一次,extern可以在其他文件多次
extern意思就是遇到此变量在其他模块去找定义

typedef类型别名
把类型定义成别名


Struct结构体

可以添加成员变量,增加扩展性

static申明的局部变量存储在静态存储区


不加static时,每次调用返回的flag都为1
加static,返回的flag会是1,2,3,4......
【每次调用会跳过static的定义,并且不会被局部释放】
MDK寄存器地址名称映射分析
51映射

sfr P0=0x80;//P0映射到地址0x80
P0=0x00//往寄存器地址0x80赋值0x00
32映射
通过基地址偏移

外设基地址偏移得到APB2基地址,APB2偏移得到GPIOA基地址

地址强制转换为结构体指针类型,GPIOA作为结构体指针类型,指向这些地址*


结构体指针就是用来指向结构体类型变量的指针
强制转换是改变数据的类型
结构体指针强制转换就是将地址中的数据的结构体数据类型进行转换
cpp
//先定义4个结构体
typedef struct {
int array[4];
}Struct_A;
typedef struct {
int *ptr_b;
} Struct_B;
//不允许操作:
Struct_B b;
Struct_A a = (Struct_A)b;
//允许操作:
Struct_B *b;
Struct_A *a = (Struct_A *)b;