STM32的GPIO寄存器描述
寄存器:
软件控制硬件(在程序中操作对应控制器),通过寄存器,就是 寄存器(可以存放数据),但是其中的数据具有特定的硬件含义(查看芯片手册),设置寄存器的值,对应的控制器就执行对应的工作。相当于寄存器就是控制器硬件留给软件的接口
具体操作:
寄存器是硬件与软件的接口:
寄存器的具体意义由芯片手册定义:
寄存器映射到特定的内存地址:
0x40010800
处。程序可以通过指针或者宏定义访问这些地址。通过寄存器配置控制器:
通过编写软件来修改寄存器的内容,程序可以控制硬件如何工作。比如:
下面以 STM32F103RCT6为例子:
在STM32F103RCT6中,GPIO端口的配置主要通过两个寄存器来控制,分别是GPIO_CRL(低寄存器)和GPIO_CRH(高寄存器)。每个寄存器的每4位对应一个引脚的具体配置,其中包括两位用于设置引脚的模式(MODE),两位用于设置引脚的配置(CNF)。
CNFy[1:0](引脚的配置位,分别控制浮空、上拉、开漏等模式):
位31:30、27:26、23:22、19:18、15:14、11:10、7:6、3:2:分别对应端口的第7到第0位的配置。
这些位的具体配置如下:
在输入模式(MODEy[1:0] = 00)下:
在输出模式(MODEy[1:0] > 00)下:
MODEy[1:0](引脚的模式位,分别控制引脚是输入、输出及输出速度):
位29:28、25:24、21:20、17:16、13:12、9:8、5:4、1:0:分别对应端口的第7到第0位的模式。
这些位的具体配置如下:
当然,这只是配置了对应的GPIO模式,并不能设置值,设置值需要通过端口输入数据寄存器(GPIOx_IDR) 端口输出数据寄存器(GPIOx_ODR)
例子:配置 STM32F103 的 PC1 引脚为输入模式,并读取其电平状态;
1. 配置 PC1 为浮空输入模式,并读取电平状态。
步骤:
// 配置 PC1 为浮空输入模式
GPIOC->CRL &= ~(0xF << 4); // 清除PC1的 CNF1 和 MODE1 位 (位4~7)
GPIOC->CRL |= (0x4 << 4); // 设置PC1为浮空输入模式 (CNF1 = 01, MODE1 = 00)
// 读取 PC1 的输入电平
uint32_t pc1_state = (GPIOC->IDR & (1 << 1)); // 读取 PC1 的电平状态
if (pc1_state) {
// PC1 是高电平
} else {
// PC1 是低电平
}
下面用二进制来进行解释:
我们知道:
0100
。0100
左移 4 位。首先,解释 0x4 的具体含义:
0100
,对应的值表示 CNF1[1:0] = 01(浮空输入模式),MODE1[1:0] = 00(输入模式)。
1. 0x4 转换为二进制:
0x4
的二进制形式是:0x4 = 0100(二进制)
左移四位:
0000 0100 << 4 = 0100 0000
假设原来的 GPIOC->CRL 寄存器的二进制值为:
0000 0000 0000 0000 0000 0000 0000 0000
现在我们要将 0100 0000 (即 0x40)按位或到它上面:
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0100 0000 |
=0000 0000 0000 0000 0000 0000 0100 0000
通过左移操作,0x4 被移到了 PC1 对应的位(4-7 位),然后通过按位或将它与 GPIOC_CRL 合并,确保其他位不受影响
作者:@haihi