GPIO相关函数
STM32的时钟函数
RCC_APB1ReriphClockCmd
RCC_APB1PeriphClockCmd
函数是用于控制STM32微控制器中APB1(Advanced Peripheral Bus 1)总线上外设时钟的开启或关闭的。这个函数是STM32标准外设库(Standard Peripheral Library)或者HAL库(Hardware Abstraction Layer)中的一个函数,用于配置和管理微控制器的硬件资源。
在STM32微控制器中,时钟系统是非常关键的,它负责为微控制器的CPU核心、外设等提供工作时钟。APB1和APB2是两条外设总线,它们连接着微控制器的各种外设,如定时器、串口、SPI等。APB1和APB2的总线速度不同,APB1的速度较低,APB2的速度较高。
RCC_APB1PeriphClockCmd
函数的主要作用是控制连接到APB1总线上的外设的时钟。通过这个函数,用户可以开启或关闭特定外设的时钟,以达到节能或者根据应用需求动态管理硬件资源的目的。
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
RCC_APB1Periph
:这是一个或多个APB1总线上的外设的标识符,通过宏定义指定,表示要控制时钟的外设。APB1 上面连接的是低速外设,包括电源接口、 备份接口、CAN、USB、I2C1、I2C2、UART2、UART3 等等
NewState
:这是一个枚举值,表示要执行的操作,ENABLE
表示开启时钟,DISABLE
表示关闭时钟。
RCC_APB2ReriphClockCmd
RCC_APB2PeriphClockCmd
函数是STM32微控制器固件库中的一个函数,用于启用或禁用高速APB2(APB2总线)上的外设时钟。这个函数对于管理STM32微控制器上的外设时钟非常重要,因为只有在相应的时钟被启用后,外设才能正常工作。
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
-
uint32_t RCC_APB2Periph
:这是一个32位的无符号整数,用于指定要启用或禁用的APB2总线上的外设。STM32的固件库定义了一系列的宏来表示不同的外设,例如RCC_APB2Periph_GPIOA
表示GPIOA端口的时钟,RCC_APB2Periph_SPI1
表示SPI1接口的时钟等。可以通过逻辑或操作符|
组合多个外设来同时启用或禁用它们的时钟。APB2 上面连接的是高速外设包 括 UART1、SPI1、Timer1、ADC1、ADC2、所有普通 IO 口(PA~PE)、第二功能 IO 口等。对应外设的选择可以参考下图。
-
FunctionalState NewState
:这是一个枚举类型的参数,用于指定是要启用(ENABLE
)还是禁用(DISABLE
)指定的外设时钟。ENABLE
和DISABLE
通常在STM32的固件库中被定义为1
和0
。
GPIO引脚操作函数
GPIO_DeInit
GPIO_DeInit
函数是用于将指定 GPIO(通用输入输出)端口或引脚重置为其默认复位状态的函数。这在一些情况下非常有用,例如当你需要重新配置 GPIO 引脚或者当你不再需要某个引脚配置时,可以通过调用这个函数来清除之前的配置,恢复到初始状态。
void GPIO_DeInit(GPIO_TypeDef* GPIOx, uint32_t GPIO_Pin);
GPIOx
:这是一个指向 GPIO 端口的指针,例如GPIOA
、GPIOB
等等。STM32 微控制器通常有多个 GPIO 端口,每个端口包含一组引脚。GPIO_Pin
:这是指定要重置的引脚,可以使用库中定义的宏,如GPIO_PIN_0
、GPIO_PIN_1
、GPIO_PIN_All
等,来指定单个引脚或多个引脚。
注意事项
- 调用时机:确保在调用
GPIO_DeInit
之前,相关的 GPIO 时钟已经被使能。否则,重置操作可能不会生效。 - 状态恢复:
GPIO_DeInit
会将引脚恢复到复位状态,这通常意味着引脚被配置为浮空输入模式,并且关闭了任何与该引脚相关的外设功能(如中断、复用功能等)。 - 多引脚操作:你可以通过组合多个
GPIO_PIN_x
宏(使用按位或操作符|
)来一次性重置多个引脚,例如GPIO_PIN_0 | GPIO_PIN_1
。
GPIO_AFIODeInit
GPIO_AFIODeInit
函数是一个特定于某些 STM32 微控制器系列的函数,用于重置 AFIO(Alternate Function I/O,备用功能输入输出,复用功能)相关的配置到其默认复位状态。AFIO 允许 GPIO 引脚除了基本输入/输出功能外,还可以配置为其他特殊功能,如定时器输出、串行通信接口等。如果GPIO_AFIODeInit
函数在你的开发环境中是可用的,那么它通常被用来在不需要 AFIO 配置时将其恢复到默认状态,或者在重新配置 AFIO 之前清除之前的设置。
void GPIO_AFIODeInit(void);
注意事项
-
库版本和微控制器系列:确认你的 STM32 微控制器系列和所使用的库版本是否支持
GPIO_AFIODeInit
函数。 -
调用时机:通常,你会在初始化代码的早期阶段调用这个函数,以确保 AFIO 配置从一个已知状态开始。或者,在需要重新配置 AFIO 时,先调用这个函数来清除之前的配置。
-
时钟使能:在调用
GPIO_AFIODeInit
之前,确保 AFIO 时钟(如果适用)已经被使能。在某些微控制器上,AFIO 功能可能需要单独的时钟源。 -
中断和复用功能:如果 AFIO 配置了中断或复用功能,调用
GPIO_AFIODeInit
可能会禁用这些功能。确保在调用此函数后重新配置任何需要的功能。
GPIO_Init
GPIO_Init
函数是 STM32 HAL(硬件抽象层)库中用于初始化 GPIO(通用输入输出)端口或引脚的函数。通过这个函数,你可以配置 GPIO 引脚的多种参数,如模式(输入、输出、复用或模拟)、速度、输出类型(推挽或开漏)、上拉/下拉电阻等。
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
参数说明
GPIOx
:这是一个指向 GPIO 端口的指针,例如GPIOA
、GPIOB
等。STM32 微控制器通常有多个 GPIO 端口,每个端口包含一组引脚。GPIO_InitStruct
:这是一个指向GPIO_InitTypeDef
结构体的指针,该结构体包含了要配置的 GPIO 引脚的所有参数。
GPIO_InitTypeDef
结构体通常包含以下成员
- GPIO_Pin:指定要配置的引脚,可以使用库中定义的宏,如
GPIO_Pin_0
、GPIO_Pin_1
、GPIO_Pin_All
等,来指定单个引脚或多个引脚。在GPIO_InitStructure.GPIO_Pin引脚选择中,如果要同时控制一个GPIO外设的多个引脚,可以在GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 ...,当然也可以直接用GPIO_Pin_ALL,这样就相当于选中了所有的引脚。 - GPIO_Mode:设置引脚的模式,有如下参数
GPIO_Mode_AIN //模拟输入
GPIO_Mode_IN_FLOATING //浮空输入
GPIO_Mode_IPD //下拉输入
GPIO_Mode_IPU //上拉输入
GPIO_Mode_Out_OD //开漏输出
GPIO_Mode_Out_PP //推挽输出
GPIO_Mode_AF_OD //复用开漏
GPIO_Mode_AF_PP //复用推挽
- GPIO_Speed:GPIO传输速度选择,有如下参数
GPIO_Speed_2MHz
GPIO_Speed_10MHz
GPIO_Speed_50MHz
GPIO_StructInit
GPIO_StructInit
函数是 STM32库中的一个辅助函数,用于将 GPIO_InitTypeDef
结构体初始化为其默认状态。这个函数通常在你想要重置或初始化一个 GPIO_InitTypeDef
结构体到已知状态时使用,以确保所有成员都被设置为合理的默认值。
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
参数说明
GPIO_InitStruct
:这是一个指向GPIO_InitTypeDef
结构体的指针,该结构体将被初始化。
GPIO_ResetBits
函数是 STM32 标准外设库中用于将指定 GPIO 端口上的一个或多个引脚设置为低电平(即“复位”或“写0”)的函数。与 GPIO_SetBits
类似。
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
参数说明
GPIOx
:这是一个指向GPIO_TypeDef
结构体的指针,代表了要操作的 GPIO 端口(如 GPIOA、GPIOB 等)。GPIO_Pin
:这是一个 16 位的无符号整数,用于指定要置为低电平的引脚。可以使用库中预定义的宏(如GPIO_PIN_0
、GPIO_PIN_1
等)或者通过位运算组合多个引脚(如GPIO_PIN_0 | GPIO_PIN_1
)。
GPIO_WriteBit
GPIO_WriteBit
函数,作为 STM32 标准外设库的一部分,为开发者提供了一个便捷的接口,用于控制特定 GPIO 端口上单个引脚的电平状态。通过此函数,你可以轻松地将引脚电平设置为高(Bit_SET
)或低(Bit_RESET
)。
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
参数解读:
GPIOx
:指向GPIO_TypeDef
结构体的指针,该结构体代表了你想要操作的 GPIO 端口,例如 GPIOA、GPIOB 等。GPIO_Pin
:用于指定要操作的引脚,通常通过库中定义的宏(例如GPIO_PIN_0
、GPIO_PIN_1
)来指定,这些宏对应着端口的各个引脚。BitVal
:BitAction
枚举类型的值,用于设定引脚的目标电平状态。它可以是Bit_SET
(代表高电平)或Bit_RESET
(代表低电平)。
GPIO_Write
函数是 STM32 标准外设库中用于一次性设置指定 GPIO 端口上所有引脚电平状态的函数。与 GPIO_WriteBit
不同,GPIO_Write
允许你同时写入一个 16 位的值到 GPIO 端口的输出数据寄存器,从而控制该端口上所有引脚的电平状态。
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
参数说明
GPIOx
:这是一个指向GPIO_TypeDef
结构体的指针,代表了要操作的 GPIO 端口(如 GPIOA、GPIOB 等)。PortVal
:这是一个 16 位的无符号整数,用于指定要写入 GPIO 端口输出数据寄存器的值。每一位对应端口上的一个引脚,其中第 0 位对应引脚 0,第 1 位对应引脚 1,依此类推。将某一位设置为 1 会将对应的引脚置为高电平,设置为 0 则会将其置为低电平。
实例
int main(void)
{// ... 系统初始化代码 ...// 使能 GPIOA 时钟(假设需要操作 GPIOA 端口)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 配置 GPIOA 的所有引脚为输出模式(这里只是一个示例,通常不会这样做)GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_PIN_ALL; // 假设有这样一个宏定义表示所有引脚GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);// 将 GPIOA 端口的所有引脚设置为特定的电平状态// 假设我们想要将引脚 0-2 设置为高电平,其余引脚设置为低电平// 那么对应的 16 位值应该是 0x00000007(二进制:0000 0000 0000 0111)GPIO_Write(GPIOA, 0x00000007);// ... 主循环及其他代码 ...
}