配置GPIO基本步骤:
1:开启RCC时钟
2:初始化端口
3:读取/操作端口
一: 开启RCC时钟
RCC时钟开关相关函数:
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);// 开启/关闭AHB外设时钟。
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);// 开启/关闭APB2 (High Speed APB)外设时钟。
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);//开启/关闭APB1 (Low Speed APB)外设时钟。
现在我们要知道GPIOA挂载在哪条总线上
从上图可知GPIO是挂载在APB2总线上的外设,所以我们使用RCC_APB2PeriphClockCmd函数。
RCC_APB2PeriphClockCmd函数的定义:
/**
* @brief 开启/关闭APB2 (High Speed APB)外设时钟。
* @param RCC_APB2Periph: 用于指定需要开关时钟的APB2外设。
* 此参数可以是以下值的任意组合:
* @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
* RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
* RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
* RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
* RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
* RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
* RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11
* @param NewState: 指定外设时钟的新状态。
* 该参数的可选值:ENABLE或DISABLE。
* @retval None
*/
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
RCC_APB2PeriphClockCmd函数操作的是RCC_APB2ENR 寄存器
有了上面的基础,我们现在开启GPIOA的时钟。
//开启GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
二:初始化端口
初始化端口函数:
/**
* @brief 初始化指定的GPIOX外设
* @param GPIOx: 指定需要初始化的GPIOx外设,x可以为(A-G)
* @param GPIO_InitStruct: 一个指向GPIO_InitTypeDef结构体的指针
* @retval None
*/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
GPIO_InitStruct结构体:
typedef struct
{
uint16_t GPIO_Pin; //指定要配置的GPIO引脚。
GPIOSpeed_TypeDef GPIO_Speed; //指定所选引脚的最大翻转速度。
GPIOMode_TypeDef GPIO_Mode; //指定所选引脚的模式
}GPIO_InitTypeDef;
GPIO_InitTypeDef结构体各个成员的可选参数:
成员 | 可选参数 |
---|---|
GPIO_Pin | GPIO_Pin_0 至GPIO_Pin_15和GPIO_Pin_All |
GPIO_Speed | GPIO_Speed_10MHz//最大翻转速度是10Mhz |
GPIO_Speed_2MHz//最大翻转速度是2Mhz | |
GPIO_Speed_50MHz//最大翻转速度是50Mhz | |
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_Init函数和GPIO_InitTypeDef结构体操作的是GPIOx_CRL寄存器和GPIOx_CRH寄存器
有了上面的基础,我们现在初始化A0引脚。
GPIO_InitTypeDef GPIO_InitStruct;//创建一个初始化结构体
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//将引脚模式设置为推挽输出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;//让Pin0口初始化
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//设置Pin0口的最大翻转速度为50Mhz
GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化A0口
三:读取/操作端口
端口输出相关函数:
/**
* @brief 设置所选端口。
* @param GPIOx: 指定需要设置的端口所属的GPIO组,x可以为(A-G)
* @param GPIO_Pin: 指定需要设置的端口,x可以为(1-15)
* @retval None
*/
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
此函数操作的是GPIOx_BSRR寄存器
/**
* @brief 清除所选端口。
* @param GPIOx: 指定需要清除的端口所属的GPIO组,x可以为(A-G)
* @param GPIO_Pin: 指定需要清除的端口,x可以为(1-15)
* @retval None
*/
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
此函数操作的是GPIOx_BRR寄存器
/**
* @brief 设置或清除所选的数据端口位。
* @param GPIOx: 指定需要写入的端口所属的GPIO组,x可以为(A-G)
* @param GPIO_Pin: 指定要写入的端口位.
* 该参数可以是GPIO_Pin_x的一个,其中x可以是(0..15)。
* @param BitVal: 指定要写入所选位的值。
* 这个参数可以是一个BitAction类型的枚举值:
* @arg Bit_RESET: 清除所选端口
* @arg Bit_SET: 设置所选端口
* @retval None
*/
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)
此函数操作的是GPIOx_BSRR寄存器和GPIOx_BRR寄存器
/**
* @brief 将数据写入指定的GPIO组。
* @param GPIOx: 指定需要写入的GPIO组,x可以为(A-G)
* @param PortVal: 指定要写入GPIO组输出数据寄存器的值。
* @retval None
*/
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
此函数操作的是GPIOx_ODR寄存器
读取端口输入相关函数:
/ * *
* @brief读取指定端口的输入。
* @param GPIOx:指定需要读取的端口所属的GPIO组,x可以为(A-G)
* @param GPIO_Pin:指定要读取的端口位。
*该参数可以是GPIO_Pin_x,其中x可以是(0..15)。
* @retval指定端口的输入值。
* /
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
此函数读取的是GPIOx_IDR寄存器
/**
* @brief 读取指定的GPIO组
* @param GPIOx: 指定需要读取的GPIO组,x可以为(A-G)
* @retval 指定GPIO组的输入值。
*/
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
此函数读取的是GPIOx_IDR寄存器
/**
* @brief 读取指定端口的输出寄存器。
* @param GPIOx: 指定需要读取的端口所属的GPIO组,x可以为(A-G)
* @param GPIO_Pin: 指定要读取的端口位。
* 该参数可以是GPIO_Pin_x,其中x可以是(0..15)。
* @retval 指定端口的输出的值
*/
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
此函数读取的是GPIOx_ODR寄存器
/**
* @brief 读取指定的GPIO组的输出寄存器。
* @param GPIOx: 指定需要读取的GPIO组,x可以为(A-G)
* @retval 指定GPIO组的输出值。
*/
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx)
此函数读取的是GPIOx_ODR寄存器