[STM32] GPIO配置

配置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 寄存器
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_PinGPIO_Pin_0 至GPIO_Pin_15和GPIO_Pin_All
GPIO_SpeedGPIO_Speed_10MHz//最大翻转速度是10Mhz
GPIO_Speed_2MHz//最大翻转速度是2Mhz
GPIO_Speed_50MHz//最大翻转速度是50Mhz
GPIO_ModeGPIO_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寄存器
在这里插入图片描述

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值