5 - STM32GPIO详解(看这篇就够了)

本笔记是根据STM32F429单片机的,其他STM32单片机与此类似,基本上都一样的,会一款,其他的基本上没啥问题。本人也是刚学,有不足之处请下方评论。

目录

笔记1 GPIO操作     

1.1 读-修改-写操作

1.2 GPIO结构原理

1.3 GPIO 输出配置

GPIO典型应用步骤

1.4 GPIO 常用函数

1、读取电平函数:

2、读取输出电平数

3、设置输出电平

函数

4、反转引脚状态

5、复用功能设置函数


笔记1 GPIO操作

1.1 读-修改-写操作

常用操作:

位与,&:可实现目标字段的清零,而不影响其他字段。

一般格式:操作对象&=屏蔽字。

屏蔽字的目标字段设置为0,其他设置为1.

例如:将GPIOA端口的3号、10号引脚输出低电平,使用位与操作将GPIOA的ODR的3位和10位清零实现。

GPIOA->ODR&=~(1<<3 |1<<10);

其中,~(1<<3 |1<<10)是操作需要的屏蔽字,将1左移3位和1左移10位合并在一起,然后取反得到。

位或,|:可实现目标字段的置位,而不影响其他字段。

一般格式:操作对象 | =屏蔽字。

屏蔽字的目标字段设置为1,其他设置为0。

例如:将GPIOA端口的2号、8号引脚输出高电平,使用位或操作将GPIOA的ODR的2位和8位置位实现。

GPIOA->ODR|=(1<<2 |1<<8);

其中,(1<<2 |1<<8)是操作需要的屏蔽字,将1左移2位和1左移8位合并在一起得到。

异或,^:可实现目标字段的取反,而不影响其他字段。

一般格式:操作对象^=屏蔽字。

屏蔽字的目标字段设置为1,其他设置为0.

例如:将GPIOA端口的1号、11号和13号引脚的电平反转,使用异或操作将GPIOA的ODR的1位、11位和13位取反实现。

GPIOA->ODR^=(1<<1)| (1<<11) | (1<<13);

其中,(1<<1)| (1<<11) | (1<<13);是操作需要的屏蔽字,将1左移1位、1左移11位和1左移13位合并在一起得到。

1.2 GPIO结构原理

GPIO引脚的内部构造图如图所示,每个GPIO相互独立,包括输入驱动器、输出驱动器、上拉/下拉控制电路和5V耐压保护电路

每个通用 I/O 端口包括以下寄存器 :

  1. 4 个 32 位配置寄存器(GPIOx_MODER、GPIOx_OTYPERGPIOx_OSPEEDR GPIOx_PUPDR
  2. 2 个 32 位数据寄存器(GPIOx_IDR 和 GPIOx_ODR)
  3. 1 个 32 位置位/复位寄存器 (GPIOx_BSRR)、
  4. 1 个 32 位锁定寄存器 (GPIOx_LCKR)
  5. 2 个 32 位复用功能选择寄存器(GPIOx_AFRH 和 GPIOx_AFRL)

每个GPIO有16个引脚,每个引脚都可以单独配置。

GPIO功能描述

根据应用需求,可通过软件将通用 I/O (GPIO) 端口对应的各个引脚位分别配置为多种模式:

● 输入浮空-上电默认模式

● 输入上拉

● 输入下拉

● 模拟功能

● 具有上拉或下拉功能的开漏输出

● 具有上拉或下拉功能的推挽输出

● 具有上拉或下拉功能的复用功能推挽

● 具有上拉或下拉功能的复用功能开漏

                                                                                                                                       GPIO 结构图

1.3 GPIO 输出配置

对 I/O 端口进行编程作为输出时:

●输出缓冲器被打开: 开漏模式和推挽模式

● 施密特触发器输入被打开

● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻

● 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样

● 对输入数据寄存器的读访问可获取 I/O 状态

● 对输出数据寄存器的读访问可获取最后的写入值

推挽输出:

可以直接输出高电平和低电平。 

开漏输出:

默认只可以输出低电平

输出高电平需要加上拉电阻拉高。

GPIO 复用功能配置

● 可将输出缓冲器配置为开漏或推挽

● 输出缓冲器由来自外设的信号驱 动(发送器使能和数据)

● 施密特触发器输入被打开

● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻

● 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样

● 对输入数据寄存器的读访问可获取 I/O 状态

GPIO模拟配置

● 输出缓冲器被禁止。

● 施密特触发器输入停用,I/O 引脚的每个模拟输入的功耗变为零。施密特触发器的输出被 强制处理为恒定值 (0)。

● 弱上拉和下拉电阻被关闭。

● 对输入数据寄存器的读访问值为“0”。

注意:在模拟配置中,I/O 引脚不能为 5 V 容忍。

GPIO典型应用步骤

使用库函数实现GPIO的应用,一般需要以下几步:

(1)使能GPIO的时钟(非常重要),涉及以下文件:

头文件:stm32f4xx_rcc.h

源文件:stm32f4xx_rcc.c

使用的主要函数:

RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)

RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState)

RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)

RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

例如:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE)

(2)设置对应于片上外设使用的GPIO工作模式。

确定GPIO输入模式

如果是输出要确定是推挽还是开漏输出

配置输出速度模式

输出时,内部上拉/下拉电阻要不要开

(3)如果使用复用功能,需要单独设置每一个GPIO引脚的复用功能。

(4)在应用程序中读取引脚状态、控制引脚输出状态或使用复用功能完成特定功能

                                              

1.4 GPIO 常用函数

1、读取电平函数:

1)、uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

参数1:GPIO操作对象,

参数2:操作引脚。

作用:读取某个GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。该函数每次只能获取一个引脚状态。

例如:

GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输入电平

2)、 uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

作用:读取某组GPIO的输入电平。实际操作的是GPIOx_IDR寄存器。该函数获取GPIOIO口状态

例如:

GPIO_ReadInputData(GPIOA);//读取GPIOA组中所有IO口输入电平

2、读取输出电平数

1)、uint8_t GPIO_ReadOutputDataBit (GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

作用:读取某个GPIO的输出电平。实际操作的是GPIO_ODR寄存器。

例如:

    GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5);//读取GPIOA.5的输出电平

2)、uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

作用:读取某组GPIO的输出电平。实际操作的是GPIO_ODR寄存器。

例如:

GPIO_ReadOutputData(GPIOA);//读取GPIOA组中所有io口输出电平

3、设置输出电平

函数

1)、void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

作用:设置某个IO口输出为高电平(1实际操作BSRRL寄存器。该函数可同时设置多个引脚。

例如:

GPIO_SetBits(GPIOA, GPIO_Pin_5);//设置GPIOA.5输出高电平

2)、void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

作用:设置某个IO口输出为低电平(0)。实际操作的BSRRH寄存器。该函数可同时设置多个引脚。

3)、void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);

作用:设置某个GPIO为特定电平,实际操作的是置位/复位寄存器。

例如:设置GPIOA 2号引脚为高电平。

GPIO_ WriteBit(GPIOA,GPIO_Pin_2,Bit_SET);

GPIOA  5号引脚为高电平。

GPIO_ WriteBit(GPIOA,GPIO_Pin_5,Bit_RESET);

该函数只能设置一个引脚状态。

4)、void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

作用:设置某个GPIO所有引脚为特定电平,实际操作的输出数据寄存器。

参数2:16位的无符号数据,此数据每一位队形控制一个引脚的输出状态,0代表低电平,1代表高电平。

例如:设置GPIOA所有引脚为高电平

GPIO_WriteGPIOA0xffff

这两个函数不常用,也是用来设置IO口输出电平。

4、反转引脚状态

1)void GPIO _ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

作用:将GPIO引脚状态反转。使用位异或操作输出数据寄存器。

例如:设置GPIOA的3、5号引脚状态反转。

GPIO _ToggleBits(GPIOA,GPIO_Pin_3| GPIO_Pin_5)

5、复用功能设置函数

void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);

作用:将GPIO的某个引脚设置为特定的复用功能。操作的是复用功能低位寄存器或复用功能高位寄存器。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STM32F103系列中,配置GPIO口需要进行以下步骤: 1. 配置相应的GPIO口。如果需要进行重映射,可以使用GPIO_PinRemapConfig函数进行重映射。例如,使用GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE)来重映射USART2的引脚。然后,使用GPIO_InitStructure结构体来配置GPIO口的引脚和模式。例如,将Rx配置为浮空输入模式,Tx配置为带上拉的第二功能模式。最后,使用GPIO_Init函数进行初始化。\[1\]\[2\] 2. 每一组IO口都有以下7个寄存器,用于配置和控制GPIO口的功能: - GPIOx_CRL:端口配置低寄存器(32位) - GPIOx_CRH:端口配置高寄存器(32位) - GPIOx_IDR:端口输入寄存器(32位) - GPIOx_ODR:端口输出寄存器(32位) - GPIOx_BSRR:端口位设置/清除寄存器(32位) - GPIOx_BRR:端口位清除寄存器(16位) - GPIOx_LCKR:端口配置锁存寄存器(32位)(不常用)\[3\] 通过配置这些寄存器,可以实现对GPIO口的输入输出控制和配置。 #### 引用[.reference_title] - *1* *2* [STM32F103_USART_GPIO配置及相应的IO口设置](https://blog.csdn.net/andrewgithub/article/details/54093412)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [STM32F103 GPIO口的配置和应用详解](https://blog.csdn.net/weixin_43627022/article/details/103108920)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南山府嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值