嵌入式软件开发-最基本的GPIO口详细配置过程及原理--学习单片机的基石

本文深入讲解了STM32单片机的GPIO口概念及其使用,包括GPIO的基本功能、复用功能、结构和工作模式。STM32的GPIO口具有复用性,允许配置为不同外设功能。文中还介绍了GPIO的固件库函数,如GPIO初始化、输入输出控制等,并通过LED灯实验展示了GPIO的实际应用。同时,阐述了GPIO的复用功能,如何通过寄存器配置实现外设功能的切换。

关于单片机的GPIO口的概念和使用

我们在学习单片机的过程中,每次学习一个新的外设,我们一定要去弄懂这个外设的概念,要彻底明白这个外设是用来干嘛的,这样也方便我们去理解记忆外设的配置流程,对于概念,字面意思我们要对适当的去记忆,不然别人问起,我们自己知道但不会表达,也不行哈,自己去适当的记忆也有利于我们对单片机的体系结构有个整体的把握,掌控全局,逐个击破。让我们先来认识一下GPIO口是干嘛的吧。

GPIO的概念

GPIO,英文全称为General-Purpose IO ports,也就是 通用IO口,单片机中常常有数量众多的GPIO口供用户使用,但是结构却比较简单的外部设备/电路,对这些电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。

换种方法理解

换种话说GPIO是什么?GPIO就是芯片的引脚。单片机的外设都要通过GPIO口与芯片交互
除非它有规定的特定的用途,否则都可以叫做GPIO,具体得去看芯片手册怎么规定的。
特点是:可以被编程控制工作模式,也可以控制电压高低等。比如接上LED,就可以通过编程控制GPIO的模式和输入输出值来操控LED的亮和灭。
STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。STM32芯片的GPIO被分成很多组,每组有16个引脚,所有的GPIO引脚都有基本的输入输出功能。
最基本的输出功能是由STM32控制引脚输出高、低电平,实现开关控制,如把GPIO引脚接入LED灯,那就可以控制LED灯的亮灭,
最基本的输入功能是检测外部电平,如把GPIO引脚连接到按键,通过电平高低区分按键是否被按下。

GPIO的第二功能-复用

GPIO的复用功能(设置他的另外一种功能):
STM32F1 有很多的内置外设,这些外设的外部引脚都是与 GPIO 共用的。也就是说,一个引脚可以有很多作用,但是默认为IO口,如果想使用一个 GPIO内置外设的功能引脚,就需要GPIO的复用,那么当这个 GPIO 作为内置外设使用的时候,就叫做复用。 比如说串口 就是GPIO复用为串口。

STM32中GPIO的构造

每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。
对于寄存器的值,我们不多介绍,谁开发用寄存器啊。我们直接上手固件库!
在这里插入图片描述

GPIO的工作模式

根据数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。
─ 输入浮空 --用于对不确定高低电平的输入
─ 输入上拉 – 用于默认为上拉至高电平的输入
─ 输入下拉 --用于默认为下拉之低电平的输入
─ 模拟输入 --用于模拟量的输入
─ 开漏输出 --用于实现电平转换和线与功能的输出
─ 推挽式输出 --用于较大功率驱动的输出
─ 推挽式复用功能 --复用功能情况下的推挽输出
─ 开漏复用功能 --复用功能情况下的开漏输出
我们可以将这8中工作模式分成两大类:输入模式和输出,根据名字也能分辨哈。

GPIO的固件库函数

固件库中,对外设的初始化都是由外设对应的结构体开始的,还有一些封装好的函数。
GPIO的结构体变量

typedef struct
{
   
   
  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */

  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
                                      This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;

GPIO结构体变量的取值

typedef enum
{
   
    GPIO_Mode_AIN = 0x0,
  GPIO_Mode_IN_FLOATING = 0x04,
  GPIO_Mode_IPD = 0x28,
  GPIO_Mode_IPU = 0x48,
  GPIO_Mode_Out_OD = 0x14,
  GPIO_Mode_Out_PP = 0x10,
  GPIO_Mode_AF_OD = 0x1C,
  GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;

typedef enum
{
   
    
  GPIO_Speed_10MHz = 1,
  GPIO_Speed_2MHz, 
  GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;


#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */
#define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected */
#define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected */
#define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected */
#define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected */
#define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< Pin 6 selected */
#define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< Pin 7 selected */
#define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!< Pin 8 selected */
#define GPIO_Pin_9                 ((uint
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值