文章目录
- 一 .初始化GPIO
- (一)定义一个结构体变量GPIO_InitStruct,该变量类型是GPIO_InitTypeDef。
- (二).使能时钟。
- (三)配置引脚的初始化电平。
- (四).通过结构体变量配置具体的引脚。
- 二.GPIO相关寄存器
- 1.**GPIO端口模式寄存器(GPIOx_MODER)(x=A...I)**
- 2.**GPIO端口输出类型寄存器(GPIOx_OTYPER)(x = A...I)**
- 3.**GPIO端口上拉/下拉寄存器(GPIOx_PUPDR)(x=A...I)**
- 4.**GPIO端口输入数据寄存器(GPIOx_IDR)(x=A...I)**
- 5.**GPIO端口输出数据寄存器(GPIOx_ODR)(x=A...I)**
- 6.**GPIO端口置位/复位寄存器(GPIOx_BSRR)(x=A...I)**
- 7.**GPIO端口配置锁定寄存器(GPIOx_LCKR)(x=A...I)**
- 8.**GPIO复用功能低位寄存器(GPIOx_AFRL)(x=A...I)**
- 9.**GPIO复用功能高位寄存器(GPIOx_AFRH)(x=A...I)**
- 总结
前言:作为一个刚开始接触HALL库的小白,写了一点自己用hall库配置GPIO的方法以及GPIO的相关东西,供各位大佬看看。
废话不多说,进入主题。
一 .初始化GPIO
使用HAL库的优点在于不用手动添加初始化的代码了,CubeMX会根据软件设置自动生成,就在下图里面生成你想配置的GPIO及功能。
而这个就是自动生成的HAL库GPIO初始化代码:
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_SET);
/*Configure GPIO pin : PD11 */
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/*Configure GPIO pins : PD12 PD13 PD14 PD15 */
GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
}
首先定义结构体变量,接着使能时钟,然后配置初始化电平,最后通过结构体变量初始化GPIO。
(一)定义一个结构体变量GPIO_InitStruct,该变量类型是GPIO_InitTypeDef。
GPIO_InitTypeDef 定义如下:
GPIO Init structure definition
typedef struct
{
uint32_t Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */
uint32_t Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIO_mode_define */
uint32_t Pull; /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.
This parameter can be a value of @ref GPIO_pull_define */
uint32_t Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIO_speed_define */
uint32_t Alternate; /*!< Peripheral to be connected to the selected pins.
This parameter can be a value of @ref GPIO_Alternate_function_selection */
}GPIO_InitTypeDef;
主要配置的是哪个引脚(pin)、引脚工作模式(mode)、上拉还是下拉(pull-up/pull-down)、速度大小(speed),其实(go to defination)进行调用就可。
(二).使能时钟。
GPIO Ports Clock Enable
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
**敲黑板划重点了: 这里使能时钟的方法与标准库不一样,HAL库其实是宏定义,标准库则是函数。**这个很关键!!!
(三)配置引脚的初始化电平。
Configure GPIO pin Output Level
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_SET);
这里设置D口的pin12、pin13、pin14、pin15为高电平。如果最后一个参数是GPIO_PIN_RESET则为低电平。
(四).通过结构体变量配置具体的引脚。
/*Configure GPIO pin : PD11 */
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
/*Configure GPIO pins : PD12 PD13 PD14 PD15 */
GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
PD11为输入,上拉。PD12-15为推挽输出。所以分开配置。
这样的话一个简单的GPIO口就配置好了。
二.GPIO相关寄存器
例如GPIOA 寄存器地址映射如下表:
从这个表我们可以看出, 因为 GIPO 寄存器都是 32 位,所以每组 GPIO 的 12 个寄存器中(GPIOX有12个寄存器), 每个寄存器占有 4 个地址(一个地址是8位的),一共占用 48 个地址,地址偏移范围为(0x00~0x2C)。这个地址偏移是相对 GPIOA 的基地址而言的。
所谓的一个地址通常是指字节地址,能存8位数据。如果是字地址,STM32字长32位,意味着CPU一次性从RAM或ROM中存取的数据是32位的。因此,STM32的地址必须是32位对齐的。
1.GPIO端口模式寄存器(GPIOx_MODER)(x=A…I)
GPIO port mode register
偏移地址:0x00
复位值:
0xA800 0000(端口A)
0x0000 0280(端口B)
0x0000 0000(其他端口)
位2y:2y+1 MODERy[1:0]:端口x配置位(Port x configuration bits)(y=0…15)
这些位通过软件写入,用于配置I/O方向模式。
00:输入(复位状态)
01:通用输出模式
10:复用功能模式
11:模拟状态
2.GPIO端口输出类型寄存器(GPIOx_OTYPER)(x = A…I)
GPIO port output type register
偏移地址:0x04
复位值:0x0000 0000
位31:16保留,必须保持复位值。
位15:0 OTY[1:0]:端口x配置位(PORT x configuration bits)(y=0…15)
这些位通过软件写入,用于配置I/O输出类型。
0:输出推挽(复位状态)
1:输出开漏
GPIO端口输出速度寄存器(GPIOx_OSPEEDR)(x=A…I)
GPIO port output speed register
偏移地址:0x08
复位值:
0x0000 00C0(端口B)
0x0000 0000(其它端口)
位2y:2y+1 OSPEEDRy[1:0]:端口x配置位(PORT x configuration bits)(y=0…15)
这些位通过软件写入,用于配置I/O输出速度。
00:2MHZ(低速)
01:25MHZ(中速)
10:50MHZ(快速)
11:30pF时为100MHZ(高速)(15pf时为80MHZ输出(最大速度))
3.GPIO端口上拉/下拉寄存器(GPIOx_PUPDR)(x=A…I)
GPIO port pull-up/pull-down register
偏移地址:0x0C
复位值:
0x6400 0000(端口A)
0x0000 0100(端口B)
0x0000 0000(其它端口)
位2y:2y+1 PUPDRy[1:0]:端口x配置位(PORT x configuration bits)(y=0…15)
这些位通过软件写入,用于配置I/O上拉或下拉
00:无上拉或下拉
01:上拉
10:下拉
11:保留
4.GPIO端口输入数据寄存器(GPIOx_IDR)(x=A…I)
GPIO port input data register
偏移地址:0x10
复位值:0x0000 XXXX(其中X表示未定义)
位31:16保留,必须保持复位值
位15:0 IDRy[15:0]:端口输入数据(Port input data)(y=0…15)
这些位为只读形式,只能在字模式下访问。它们包含相应I/O端口的输入值
5.GPIO端口输出数据寄存器(GPIOx_ODR)(x=A…I)
GPIO port output data register
偏移地址:0x14
复位值:0x0000 0000
位31:16保留,必须保持复位值。
位15:0 ODRy[15:0]:端口输出数据(Port output data)(y=0…15)
这些位可通过软件读取和写入
注意:通过写入GPIOx_BSRR寄存器,可以分别对ODR位进行置位和复位(x=A…I)
6.GPIO端口置位/复位寄存器(GPIOx_BSRR)(x=A…I)
GPIO port bit set/reset register
偏移地址:0x18
复位值:0x0000 0000
位31:16 BRy:端口x复位位y(Port x reset bit y)(y=0…15)
这些位为只写形式,只能在字、半字或者字节模式下访问。读取这些位可返回值0x0000
0:不会对相应位的ODRx位执行任何操作
1:对相应的ODRx位进行复位
位15:0 BSy:端口x置位位y(Port x set bit y)(y=0…15)
这些位为只写形式,只能在字、半字或字节模式下访问。读取这些位可返回值0x0000
0:不会对相应的ODRx位执行任何操作
1:对相应的ODRx位进行置位
注意:如果同时对BSx和BRx置位,则BSx的优先级更高。
7.GPIO端口配置锁定寄存器(GPIOx_LCKR)(x=A…I)
GPIO port configuration lock register
当正确的写序列应用到第16位(LCKK)时,此寄存器将用于锁定端口位的配置。位[15:0]的值用于锁定GPIO的配置。在写序列期间,不能更改LCKR[15:0]的值。将LOCK序列应用到某个端口位后,在执行下一次复位之前,将无法对端口位的值进行更改。
注意:可使用特定的写序列对GPIOx_LCKR寄存器执行写操作。在此写序列期间只允许使用字访问(32位长)
每个锁定位冻结一个特定的配置寄存器(控制寄存器和复用功能寄存器)
偏移地址:0x1C
复位值:0x0000 0000
访问:仅32位字,读/写寄存器
位31:17保留,必须保持 复位值
位16 LCKK[16]:锁定键(Lock Key)
可随时读取此位。可使用锁定键写序列对其进行修改。
0:端口配置锁定键未激活。
1:端口锁定键已激活。直到MCU复位时,才锁定GPIOx_LCKR寄存器。
锁定键写序列:
WR LCKR[16] = ‘1’ + LCKR[15:0]
WR LCKR[16] = ‘0’ + LCKR[15:0]
WR LCKR[16] = ‘1’ + LCKR[15:0]
RD LCKR
RD LCKR[16]= ‘1’
注意:在锁定键写序列期间,不能更改LCK[15:0]的值。
锁定序列中的任何错误都将中止锁定操作
在任一端口位上的第一个锁定序列之后,对LCKK位的任何读访问都将返回‘1’,直到下一次CPU复位为止。
位15:0 LCKy:端口x锁定位y(port x lock bit y )(y = 0…15)
这些位都是读/写位,但只能在LCKK位等于‘0’时执行写操作
0:端口配置未锁定
1:端口配置已锁定
8.GPIO复用功能低位寄存器(GPIOx_AFRL)(x=A…I)
GPIO alterate function low register
偏移地址:0x20
复位值:0x0000 0000
位31:0 AFRLy:端口x位y的复用功能选择(Alternate function selection for port x bit y)(y=0…7)
这些位通过软件写入,用于配置复用功能I/O。
AFRLy选择:
0000:AF0 0001:AF1 0010:AF2 0011:AF3
0100:AF4 0101:AF5 0110:AF6 0111:AF7
1000:AF8 1001:AF9 1010:AF10 1011:AF11
1100:AF12 1101:AF13 1110:AF14 1111:AF15
9.GPIO复用功能高位寄存器(GPIOx_AFRH)(x=A…I)
GPIO alternate function high register
偏移地址:0x24
复位值:0x0000 0000
位31:0 AFRHy:端口x位y的复用功能选择(Alternate function selection for port x bit y)(y=0…7)
这些位通过软件写入,用于配置复用功能I/O。
AFRLy选择:
0000:AF0 0001:AF1 0010:AF2 0011:AF3
0100:AF4 0101:AF5 0110:AF6 0111:AF7
1000:AF8 1001:AF9 1010:AF10 1011:AF11
1100:AF12 1101:AF13 1110:AF14 1111:AF15
总结
以上配置GPIO和寄存器,需要查看寄存器手册,查找自己需要的寄存器,希望我的博客对您的学习有帮助。
谢谢大佬们的指正。