手把手教你开发stm32——GPIO(基于hal库)

目录:

  • 1.GPIO的基本介绍
    • 1.1.GPIO的基本概念
    • 1.2.GPIO的基本功能
    • 1.3.GPIO的复用功能
  • 2.GPIO的基本结构
  • 3.驱动LED灯代码的实现
    • 3.1.cubemx配置
    • 3.2.具体代码的实现
  • 4.GPIO输入——按键程序
    • 4.1.cubemx配置
    • 4.2.具体代码的实现
  • 5.有关GPIO的寄存器(有关寄存器只需了解即可)
    • 5.1.端口配置高/低寄存器
    • 5.2.端口输入/输出数据寄存器
    • 5.3.端口位设置/清除寄存器、端口位清除寄存器
    • 5.4.端口配置锁定寄存器

1.GPIO的基本介绍

1.1.GPIO的基本概念

GPIO翻译过来就是通用输入输出接口,是嵌入式系统,单片机开发过程中最常用的接口,用户可以通过编程灵活对接口进行控制,实现对电路板上的LED、数码管等常用设备进行控制驱动,也可以作为串口的数据收发管脚,或者AD的接口等服用功能使用,因此其作用是非常重要的。
手把手教你开发stm32——GPIO(基于hal库)_第1张图片
上图中,灰色的引脚都表示是标准输入输出口,都可以进行GPIO的正常操作。
注:上图中其他颜色的引脚都是由特殊用途的IO口,我们一般不对这些IO口进行操作,以免出现不必要的错误。

1.2.GPIO的基本功能

GPIO作为标准输入输出的器件,基本功能自然就是进行信号的输入和信号的输出的功能。

  • 对于信号输出功能,最常用的作用就是输出高低电平来进行电平的控制,以GPIO管脚驱动LED灯为例,假设LED是低电平点亮的,那么当IO口输出低电平时,LED点亮,当IO口输出高电平时,LED熄灭,这就是GPIO作为输出时最基本的功能。
  • 对于信号输入功能,GPIO口可以读入外部的高低电平信号,比如说通过按键可以实现最基本的人机交互,比如当按键按下,IO口读入电平信号的变化以后,可以进行后续的操作,比如说可以实现LED的控制等等操作。

1.3.GPIO的复用功能

对于每个GPIO管脚来说,如果只能作为标准输入输出接口来存在,那么其他的功能,比如说串口、IIC、AD转换等功能还需要新的管脚,这就会造成空间上的大量浪费,所以,ARM公司在设计内核的时候就充分考虑这些因素,从而将很多的管脚设置成有多个功能的作用,具体的功能可以看stm32数据手册第3节引脚定义中的GPIO表。但是目前我们主要关注的还是GPIO的输入输出功能,因此,我们不需要过于纠结这些复用功能,后续的学习中还将进一步学习使用GPIO的复用功能。

2.GPIO的基本结构

手把手教你开发stm32——GPIO(基于hal库)_第2张图片
GPIO的基本结构如上图所示,GPIO都是挂载到APB2总线上的,然后通过寄存器来控制GPIO的输入输出,并且通过一定的驱动方式来输出高低电平。
手把手教你开发stm32——GPIO(基于hal库)_第3张图片

上图是GPIO内部的具体结构,分为输入部分和输出部分。

  • 输出部分主要是下面的一些电路,由输出数据寄存器、位设置/清除寄存器等寄存器来控制,来进行控制,并且通过P-MOS或者N-MOS来使电平变为高电平或者低电平。同时,也可以通过设置寄存器来控制GPIO的工作模式是推挽输出还是开漏输出。推挽输出是指,GPIO口可以正常输出高低电平,但是开漏输出是指,GPIO可以正常输出低电平,但是无法输出高电平,所以我们一般配置输出时,都将引脚配置为推挽输出的功能。
  • 输入部分主要是通过上面的电路来进行的,芯片读取输入前可以通过VDD或者VSS来控制上拉或者下拉,上拉是指当无电平输入时,引脚默认高电平;下拉是指,当无电平输入时,引脚默认下拉。然后通过肖特基二极管进行滤波和整流,从而输入高质量的高低电平信号。

3.驱动LED灯代码的实现

其实驱动LED的配置是我们拿到开发板需要最先做到的事情,这也就是我们所谓的“点灯操作”,基础的点灯操作也是去测试我们的开发板运行是否正常的一个标准,所以一般我们也称呼我们单片机工程师为“点灯大师”。

3.1.cubemx配置

当我们打开cubemx以后,我们需要进行一系列的配置,具体配置的流程如下:

  1. 新建工程
    手把手教你开发stm32——GPIO(基于hal库)_第4张图片
    手把手教你开发stm32——GPIO(基于hal库)_第5张图片
  2. 选择单步调试和下载方式
    手把手教你开发stm32——GPIO(基于hal库)_第6张图片
  3. 配置时钟
    手把手教你开发stm32——GPIO(基于hal库)_第7张图片

手把手教你开发stm32——GPIO(基于hal库)_第8张图片
4. 配置引脚
手把手教你开发stm32——GPIO(基于hal库)_第9张图片

手把手教你开发stm32——GPIO(基于hal库)_第10张图片
5.配置工程选项并输入工程
手把手教你开发stm32——GPIO(基于hal库)_第11张图片
手把手教你开发stm32——GPIO(基于hal库)_第12张图片
手把手教你开发stm32——GPIO(基于hal库)_第13张图片
手把手教你开发stm32——GPIO(基于hal库)_第14张图片

3.2.具体代码的实现

手把手教你开发stm32——GPIO(基于hal库)_第15张图片
手把手教你开发stm32——GPIO(基于hal库)_第16张图片
手把手教你开发stm32——GPIO(基于hal库)_第17张图片
下面我们来写点亮LED的代码
由于我们在cubemx中配置的PA1口的输出为低电平,那么我们需要将PA1口写为高电平,然后就可以将LED灯点亮。
手把手教你开发stm32——GPIO(基于hal库)_第18张图片
写入上面一段代码,可以将LED灯从PA1点亮。

我们可以再用一段代码,来实现LED灯闪烁的功能。
手把手教你开发stm32——GPIO(基于hal库)_第19张图片
通过以上的代码,可以实现LED等闪烁的功能,其中HAL_Delay函数是HAL库官方给我们提供的函数接口,单位是ms,我们上面的代码就是指,延时500ms。这样就可以实现LED灯闪烁的功能。

4.GPIO输入——按键程序

实现按键输入程序是我们做stm32的第二个步骤,也是人机交互的雏形。
我们这个按键实验要达到的效果就是从PA2进行按键输入,控制PA1的LED等点亮或者熄灭。

4.1.cubemx配置

cubemx的配置步骤和上面LED配置步骤类似,唯一不同的一点就是,在配置引脚的时候。
手把手教你开发stm32——GPIO(基于hal库)_第20张图片

4.2.具体代码的实现

手把手教你开发stm32——GPIO(基于hal库)_第21张图片
手把手教你开发stm32——GPIO(基于hal库)_第22张图片
下面我们就来写一下读入按键以后,然后实现LED反转的具体代码。
手把手教你开发stm32——GPIO(基于hal库)_第23张图片
对于为什么要软件消抖,是因为,按键按下时会有一定的抖动,如下图
手把手教你开发stm32——GPIO(基于hal库)_第24张图片
这是因为按键的硬件属性决定的,所以,我们必须要延长一定的时间来消除它的抖动,这个时间一般是20-30ms的时间,所以我们延长这样一段时间然后再进行判断按键是否按下,这样就能实现按键更好的按下的功能。
通过上面的程序,就能很好地实验按键按下,LED反转的功能,初步实现了人机交互。

5.有关GPIO的寄存器(有关寄存器只需了解即可)

对于stm32驱动各类外设来说,其实都是对寄存器来进行读写操作,因此,操作GPIO也不例外,我们需要对GPIO的寄存器进行读写操作。
stm32中常用的寄存器主要有以下几个。

  • 端口配置低寄存器(GPIOx_CRL)
  • 端口配置高寄存器(GPIOx_CRH)
  • 端口输入数据寄存器(GPIOx_IDR)
  • 端口输出数据寄存器(GPIOx_ODR)
  • 端口位设置/清除寄存器(GPIOx_BSRR)
  • 端口位清除寄存器(GPIOx_BRR)
  • 端口配置锁定寄存器(GPIOx_LCKR)

5.1.端口配置高/低寄存器

  1. 端口配置低寄存器
    端口配置低寄存器主要是用来配置每个GPIO组的低8个IO口,主要包块对输入输出模式的设置和对输出速度的设置等等内容。
    手把手教你开发stm32——GPIO(基于hal库)_第25张图片
    具体如上图,通过对端口配置寄存器写入不同的值,就可以使对应的端口呈现出我们上面用HAL库来配置的模式。

  2. 端口配置高寄存器
    端口配置高寄存器主要是用来配置每个GPIO组的高8个IO口,配置的内容和低寄存器相同。
    手把手教你开发stm32——GPIO(基于hal库)_第26张图片

5.2.端口输入/输出数据寄存器

端口输入输出数据寄存器主要是用来控制IO口的数据的输入和输出的,可以读取一个GPIO组的各个引脚的电平,通过一个寄存器来存储,但是输入和输出的读取都只能一起读取16个位的内容,也就是说是以字的形式来读取或者输出的。具体寄存器如下所示。并且,这两个寄存器都只用了低16位,高16位是保留的。
端口输入数据寄存器
手把手教你开发stm32——GPIO(基于hal库)_第27张图片
端口输出数据寄存器
手把手教你开发stm32——GPIO(基于hal库)_第28张图片

5.3.端口位设置/清除寄存器、端口位清除寄存器

端口位设置清除寄存器,主要是用来设置对应的位和清除对应的位,功能和端口输入/输出数据寄存器的功能差不多,不过这个寄存器也是只能以字的形式进行写入,但是这两个寄存器可以对某个位进行设置而不影响其他位的数据,所以这两个寄存器比端口输入/输出寄存器更加好用,平常用的时候也更加频繁,具体寄存器如下图。
端口位设置/清除寄存器
手把手教你开发stm32——GPIO(基于hal库)_第29张图片
端口位清除寄存器
手把手教你开发stm32——GPIO(基于hal库)_第30张图片

5.4.端口配置锁定寄存器

这个寄存器在平常的编程中是不大使用的,如果要用到可以参考stm32中文参考手册第8.2节GPIO的相关寄存器的配置。

以上就是stm32学习中GPIO的相关知识,写这篇博客也是为了帮助我自己来更好地认识GPIO和相关寄存器,也希望帮助更多的人学习stm32。

你可能感兴趣的:(手把手教你学stm32,stm32,单片机,嵌入式硬件)