继续跟随海创电子的视频进行学习,本节利用BSRR寄存器和BRR寄存器来点亮PC13。
端口设置/清除寄存器(GPIOx_BSRR)(x=A..E)
其特点是:
- 将该32位的寄存器分为高16位、低16位,而且只能以16位的形式来进行操作;
- 高16位用于置“0”,低16位用于置“1”;
- 各个位对“0”操作是免疫的。
例如如果要点亮PC13,那么就要到对应的 GPIOC_BSRR 中进行操作
//R:reset(置0) S:set(置1)
//如果BS13、BR13 均置1,那么BS13起作用
输出高电平:1<<13 //即 BS13 置 1
输出低电平:1<<(13+16) //即 BR13 置 1
如果引脚的不一致性问题,通过方式BRR寄存器来解决。
端口清除寄存器(GPIOx_BRR)(x=A..E)
特点:
- 只能以16位的形式来进行操作;
- 同时各个位对“0”操作是免疫的;
- 输出高电平就可以使用BSRR寄存器,输出低电平就可以使用BRR寄存器。
那么输出高电平、低电平的具体函数形式为
BPIOC->BSRR |= 1<<13;
有一个函数能够识别哪个组的哪个引脚
//用于置0
//第一个参数设置使用的哪个组,第二个参数是引脚
void GPIO_SetBits(GPIO_typeDef *GPIOx, uint16_t GPIO_Pin){
BPIOx->BSRR |= GPIO_Pin;
}
//用于置1
//第一个参数设置使用的哪个组,第二个参数是引脚
void GPIO_ResetBits(GPIO_typeDef *GPIOx, uint16_t GPIO_Pin){
BPIOx->BSRR |= (GPIO_Pin+16);
}
//可以将其修改为下面形式
void GPIO_ResetBits(GPIO_typeDef *GPIOx, uint16_t GPIO_Pin){
BPIOx->BRR |= GPIO_Pin
}
将对应的移位操作定义成下面的形式,方便调用。
//二进制:0b0000 0001
//二进制:0b0000 0010
//二进制:0b0000 0100
结构体变量和结构体指针变量的区别
在上面的改变结构体变量的方法有两种,第一种采用定义结构体指针的方式,第二种是使用结构体的方式,分别如下所示:
//第一种
void GPIO_SetBits(GPIO_typeDef *GPIOx, uint16_t GPIO_Pin){
BPIOx->BSRR |= GPIO_Pin;
}
//第二种
void GPIO_SetBits(GPIO_typeDef GPIOx, uint16_t GPIO_Pin){
BPIOx.BSRR |= GPIO_Pin;
}
我们使用函数的目的是能够改变成员变量的的值,经过程序验证可以发现,结构体的方式并不能改变传入的值,而定义结构体指针则可以改变传入的值,因此在实际开发中都会用指针传递值。