当前位置:   article > 正文

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

stm32 hal gpio

1.GPIO的基本介绍

1.1.GPIO的基本概念

GPIO翻译过来就是通用输入输出接口,是嵌入式系统,单片机开发过程中最常用的接口,用户可以通过编程灵活对接口进行控制,实现对电路板上的LED、数码管等常用设备进行控制驱动,也可以作为串口的数据收发管脚,或者AD的接口等服用功能使用,因此其作用是非常重要的。
在这里插入图片描述
上图中,灰色的引脚都表示是标准输入输出口,都可以进行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的基本结构

在这里插入图片描述
GPIO的基本结构如上图所示,GPIO都是挂载到APB2总线上的,然后通过寄存器来控制GPIO的输入输出,并且通过一定的驱动方式来输出高低电平。
在这里插入图片描述

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

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

3.驱动LED灯代码的实现

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

3.1.cubemx配置

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

  1. 新建工程
    在这里插入图片描述
    在这里插入图片描述
  2. 选择单步调试和下载方式
    在这里插入图片描述
  3. 配置时钟
    在这里插入图片描述

在这里插入图片描述
4. 配置引脚
在这里插入图片描述

在这里插入图片描述
5.配置工程选项并输入工程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2.具体代码的实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面我们来写点亮LED的代码
由于我们在cubemx中配置的PA1口的输出为低电平,那么我们需要将PA1口写为高电平,然后就可以将LED灯点亮。
在这里插入图片描述
写入上面一段代码,可以将LED灯从PA1点亮。

我们可以再用一段代码,来实现LED灯闪烁的功能。
在这里插入图片描述
通过以上的代码,可以实现LED等闪烁的功能,其中HAL_Delay函数是HAL库官方给我们提供的函数接口,单位是ms,我们上面的代码就是指,延时500ms。这样就可以实现LED灯闪烁的功能。

4.GPIO输入——按键程序

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

4.1.cubemx配置

cubemx的配置步骤和上面LED配置步骤类似,唯一不同的一点就是,在配置引脚的时候。
在这里插入图片描述

4.2.具体代码的实现

在这里插入图片描述
在这里插入图片描述
下面我们就来写一下读入按键以后,然后实现LED反转的具体代码。
在这里插入图片描述
对于为什么要软件消抖,是因为,按键按下时会有一定的抖动,如下图
在这里插入图片描述
这是因为按键的硬件属性决定的,所以,我们必须要延长一定的时间来消除它的抖动,这个时间一般是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口,主要包块对输入输出模式的设置和对输出速度的设置等等内容。
    在这里插入图片描述
    具体如上图,通过对端口配置寄存器写入不同的值,就可以使对应的端口呈现出我们上面用HAL库来配置的模式。

  2. 端口配置高寄存器
    端口配置高寄存器主要是用来配置每个GPIO组的高8个IO口,配置的内容和低寄存器相同。
    在这里插入图片描述

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

端口输入输出数据寄存器主要是用来控制IO口的数据的输入和输出的,可以读取一个GPIO组的各个引脚的电平,通过一个寄存器来存储,但是输入和输出的读取都只能一起读取16个位的内容,也就是说是以字的形式来读取或者输出的。具体寄存器如下所示。并且,这两个寄存器都只用了低16位,高16位是保留的。
端口输入数据寄存器
在这里插入图片描述
端口输出数据寄存器
在这里插入图片描述

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

端口位设置清除寄存器,主要是用来设置对应的位和清除对应的位,功能和端口输入/输出数据寄存器的功能差不多,不过这个寄存器也是只能以字的形式进行写入,但是这两个寄存器可以对某个位进行设置而不影响其他位的数据,所以这两个寄存器比端口输入/输出寄存器更加好用,平常用的时候也更加频繁,具体寄存器如下图。
端口位设置/清除寄存器
在这里插入图片描述
端口位清除寄存器
在这里插入图片描述

5.4.端口配置锁定寄存器

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/126090
推荐阅读
相关标签
  

闽ICP备14008679号