什么是寄存器
寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。
文章目录
寄存器映射
就是绝对地址改个名字
如以下代码
// GPIOB 端口全部输出 高电平
2 *(unsigned int*)(0x4001 0C0C) = 0xFFFF;
通过GPIOB的绝对地址使其输出高电平(太不方便了)
用寄存器映射
2 #define GPIOB_ODR *(unsigned int*)(GPIOB_BASE+0x0C)
3 GPIOB_ODR = 0xFF;
STM32 的外设地址映射
片上外设区分为三条总线,根据外设速度的不同,**不同总线挂载着不同的外设,**APB1 挂载低速
外设,APB2 和 AHB 挂载高速外设。相应总线的最低地址我们称为该总线的基地址,总线基地
址也是挂载在该总线上的首个外设的地址。其中 APB1 总线的地址最低,片上外设从这里开始,
也叫外设基地址。
总线名称 | 不同 |
---|---|
APB1 | 挂载低速外设 |
APB2 | 挂载高速外设 |
AHB | 挂载高速外设 |
总线基地址
表格总线基地址 的“相对外设基地址偏移”即该总线地址与“片上外设”基地址 0x4000 0000 的差值。
外设基地址(以GPIOX作例子)
外设寄存器(以GPIOX作例子)
修改寄存器的位操作方法
把变量的某位清零&=~()
1//定义一个变量 a = 1001 1111 b (二进制数)
2 unsigned char a = 0x9f;
3
4 //对 bit2 清零
5
6 a &= ~(1<<2);
7
8 //括号中的 1 左移两位,(1<<2) 得二进制数:0000 0100 b
9 //按位取反,~(1<<2) 得 1111 1011 b
10 //假如 a 中原来的值为二进制数: a = 1001 1111 b
11 //所得的数与 a 作”位与&”运算,a = (1001 1111 b)&(1111 1011 b),
12 //经过运算后,a 的值 a=1001 1011 b
13 // a 的 bit2 位被清零,而其它位不变。
把变量的某几个连续位清零
1//若把 a 中的二进制位分成 2 个一组
2 //即 bit0、bit1 为第 0 组,bit2、bit3 为第 1 组,
3 // bit4、bit5 为第 2 组,bit6、bit7 为第 3 组
4 //要对第 1 组的 bit2、bit3 清零
5
6 a &= ~(3<<2*1);
7
8 //括号中的 3 左移两位,(3<<2*1) 得二进制数:0000 1100 b
9 //按位取反,~(3<<2*1) 得 1111 0011 b
10 //假如 a 中原来的值为二进制数: a = 1001 1111 b
11 //所得的数与 a 作”位与&”运算,a = (1001 1111 b)&(1111 0011 b),
12 //经过运算后,a 的值 a=1001 0011 b
13 // a 的第 1 组的 bit2、bit3 被清零,而其它位不变。
14
15 //上述 (~(3<<2*1)) 中的 (1) 即为组编号; 如清零第 3 组 bit6、bit7 此处应为 3
16 //括号中的 (2) 为每组的位数,每组有 2 个二进制位; 若分成 4 个一组,此处即为 4
17 //括号中的 (3) 是组内所有位都为 1 时的值; 若分成 4 个一组,此处即为二进制数“1111 b”
18
19 //例如对第 2 组 bit4、bit5 清零
20 a &= ~(3<<2*2);
对变量的某几位进行赋值|=()
1//a = 1000 0011 b
2 //此时对清零后的第 2 组 bit4、bit5 设置成二进制数“01 b ”
3
4 a |= (1<<2*2);
5 //a = 1001 0011 b,成功设置了第 2 组的值,其它组不变
对变量的某位取反……=()
1//a = 1001 0011 b
2 //把 bit6 取反,其它位不变
3
4 a ^=(1<<6);
5 //a = 1101 0011 b
对变量的某位取反……=()
1//a = 1001 0011 b
2 //把 bit6 取反,其它位不变
3
4 a ^=(1<<6);
5 //a = 1101 0011 b