32位配置寄存器:GPIOx_CRL,GPIOx_CRH
32位数据寄存器:GPIOx_IDR,GPIOx_ODR
32位置位/复位寄存器:GPIOx_BSRR
16位复位寄存器:GPIOx_BRR
32位锁定寄存器:GPIOx_LCKR
GPIO 寄存器详解
CRL
32位端口配置低寄存器(GPIOx_CRL) (x=A..E)
用于配置低8位的GPIO口,每个GPIO口占用4个比特位,用于设置引脚的模式、输入/输出类型、上下拉电阻等。- CNFy[1:0]:端口x配置位(y = 0…7)
- 在输入模式(MODE[1:0]=00):
- 00:模拟输入模式
- 01:浮空输入模式(复位后的状态)
- 10:上拉/下拉输入模式
- 11:保留
- 在输出模式(MODE[1:0]>00):
- 00:通用推挽输出模式
- 01:通用开漏输出模式
- 10:复用功能推挽输出模式
- 11:复用功能开漏输出模式
- ------------
- MODEy[1:0]:端口x的模式位(y = 0…7)
- 00:输入模式(复位后的状态)
- 01:输出模式,最大速度10MHz
- 10:输出模式,最大速度2MHz
- 11:输出模式,最大速度50MHz
复制代码 CRH
32位端口配置高寄存器(GPIOx_CRH) (x=A..E)
用于配置高8位的GPIO口,每个GPIO口占用4个比特位,与CRL寄存器类似,用于设置引脚的模式、输入/输出类型、上下拉电阻等。- CNFy[1:0]:端口x配置位(y = 8…15)
- ------------
- MODEy[1:0]:端口x的模式位(y = 8…15)
复制代码 IDR
32位端口输入数据寄存器(GPIOx_IDR) (x=A..E)
用于读取GPIO口的输入状态,每个GPIO口占用一个比特位,当该比特位为1时,表示对应的GPIO输入电平为高电平;否则为低电平。- 位31:16 保留,始终读为0。
- 位15:0 IDRy[15:0]:端口输入数据(y = 0…15) (Port input data)
- 这些位为只读并只能以字(16位)的形式读出。读出的值为对应I/O口的状态。
复制代码 ODR
32位端口输出数据寄存器(GPIOx_ODR) (x=A..E)
用于读取GPIO口的输出状态,每个GPIO口占用一个比特位,当该比特位为1时,表示对应的GPIO输入电平为高电平;否则为低电平。- 位31:16 保留,始终读为0。
- 位15:0 ODRy[15:0]:端口输出数据(y = 0…15) (Port output data)
- 这些位可读可写并只能以字(16位)的形式操作。
- 注:对GPIOx_BSRR(x = A…E),可以分别地对各个ODR位进行独立的设置/清除。
复制代码BRR、BSRR是原子操作,不会被中断操作打断
GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;这
样,在读和更改访问之间产生IRQ时不会发生危险。
BSRR
端口位设置/清除寄存器(GPIOx_BSRR) (x=A..E)
也用于控制GPIO口的输出状态,每个GPIO口占用两个比特位,第一个比特位为0时代表置位(设置为1),为1时代表复位(设置为0),第二个比特位用于选择GPIO口,当该比特位被置为1时,对应的GPIO口输出电平被控制。- 位31:16
- BRy: 清除端口x的位y (y = 0…15) (Port x Reset bit y)
- 这些位只能写入并只能以字(16位)的形式操作。
- 0:对对应的ODRy位不产生影响
- 1:清除对应的ODRy位为0
- 注:如果同时设置了BSy和BRy的对应位, BSy位起作用。
- ------------
- 位15:0
- BSy: 设置端口x的位y (y = 0…15) (Port x Set bit y)
- 这些位只能写入并只能以字(16位)的形式操作。
- 0:对对应的ODRy位不产生影响
- 1:设置对应的ODRy位为1
复制代码 BRR
端口位清除寄存器(GPIOx_BRR) (x=A..E)
也用于控制GPIO口的输出状态,每个GPIO口占用一个比特位,当该比特位被置为1时,对应的GPIO口输出电平被复位(设置为0)。- 位31:16 保留。
- 位15:0 BRy: 清除端口x的位y (y = 0…15) (Port x Reset bit y)
- 这些位只能写入并只能以字(16位)的形式操作。
- 0:对对应的ODRy位不产生影响
- 1:清除对应的ODRy位为0
复制代码 LCKR
端口配置锁定寄存器(GPIOx_LCKR) (x=A..E)
用于锁定GPIO口的配置,防止在运行过程中对其进行修改。LCKR寄存器有16个比特位,每个GPIO口占用一个比特位,当该比特位被置为1时,对应的GPIO口的配置被锁定。
当执行正确的写序列设置了位16(LCKK)时,该寄存器用来锁定端口位的配置。位[15:0]用于锁
定GPIO端口的配置。在规定的写入操作期间,不能改变LCKP[15:0]。当对相应的端口位执行了
LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。
每个锁定位锁定控制寄存器(CRL, CRH)中相应的4个位。- 位31:17 保留。
- 位16
- LCKK:锁键 (Lock key)
- 该位可随时读出,它只可通过锁键写入序列修改。
- 0:端口配置锁键位激活
- 1:端口配置锁键位被激活,下次系统复位前GPIOx_LCKR寄存器被锁住。
- 锁键的写入序列:
- 写1 -> 写0 -> 写1 -> 读0 -> 读1
- 最后一个读可省略,但可以用来确认锁键已被激活。
- 注:在操作锁键的写入序列时,不能改变LCK[15:0]的值。
- 操作锁键写入序列中的任何错误将不能激活锁键。
- ------------
- 位15:0
- LCKy: 端口x的锁位y (y = 0…15) (Port x Lock bit y)
- 这些位可读可写但只能在LCKK位为0时写入。
- 0:不锁定端口的配置
- 1:锁定端口的配置
复制代码 寄存器代码实现
LED控制
以PC4为例,LED 的负极连接到 GND,而正极连接到 PC4- void LED_Init(void)
- {
- RCC->APB2ENR|=1<<4; //使能时钟 PORTC
- GPIOC->CRL&=0XFFF0FFFF;//PC4 配置位清零
- GPIOC->CRL|=0X00030000;//PC4 推挽输出
- GPIOC->ODR|=1<<4; //PC4 输出高电平,熄灭。等价于 GPIOC->ODR |= 0X10;
- }
- int main()
- {
- /*初始化配置*/
- LED_Init();
- while(1)
- {
- GPIOC->BSRR = 0x10;//设置对应的 ODRy 位为 1,给高电平->熄灭。等价于 GPIOC->BSRR = 0x10<<16;
- GPIOC->BRR = 0x10; //清除对应的 ODRy 位为 0,给低电平->点亮
- }
- }
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |