GPIO翻译过来就是通用输入输出接口,是嵌入式系统,单片机开发过程中最常用的接口,用户可以通过编程灵活对接口进行控制,实现对电路板上的LED、数码管等常用设备进行控制驱动,也可以作为串口的数据收发管脚,或者AD的接口等服用功能使用,因此其作用是非常重要的。
上图中,灰色的引脚都表示是标准输入输出口,都可以进行GPIO的正常操作。
注:上图中其他颜色的引脚都是由特殊用途的IO口,我们一般不对这些IO口进行操作,以免出现不必要的错误。
GPIO作为标准输入输出的器件,基本功能自然就是进行信号的输入和信号的输出的功能。
对于每个GPIO管脚来说,如果只能作为标准输入输出接口来存在,那么其他的功能,比如说串口、IIC、AD转换等功能还需要新的管脚,这就会造成空间上的大量浪费,所以,ARM公司在设计内核的时候就充分考虑这些因素,从而将很多的管脚设置成有多个功能的作用,具体的功能可以看stm32数据手册第3节引脚定义中的GPIO表。但是目前我们主要关注的还是GPIO的输入输出功能,因此,我们不需要过于纠结这些复用功能,后续的学习中还将进一步学习使用GPIO的复用功能。
GPIO的基本结构如上图所示,GPIO都是挂载到APB2总线上的,然后通过寄存器来控制GPIO的输入输出,并且通过一定的驱动方式来输出高低电平。
上图是GPIO内部的具体结构,分为输入部分和输出部分。
其实驱动LED的配置是我们拿到开发板需要最先做到的事情,这也就是我们所谓的“点灯操作”,基础的点灯操作也是去测试我们的开发板运行是否正常的一个标准,所以一般我们也称呼我们单片机工程师为“点灯大师”。
当我们打开cubemx以后,我们需要进行一系列的配置,具体配置的流程如下:
下面我们来写点亮LED的代码
由于我们在cubemx中配置的PA1口的输出为低电平,那么我们需要将PA1口写为高电平,然后就可以将LED灯点亮。
写入上面一段代码,可以将LED灯从PA1点亮。
我们可以再用一段代码,来实现LED灯闪烁的功能。
通过以上的代码,可以实现LED等闪烁的功能,其中HAL_Delay函数是HAL库官方给我们提供的函数接口,单位是ms,我们上面的代码就是指,延时500ms。这样就可以实现LED灯闪烁的功能。
实现按键输入程序是我们做stm32的第二个步骤,也是人机交互的雏形。
我们这个按键实验要达到的效果就是从PA2进行按键输入,控制PA1的LED等点亮或者熄灭。
cubemx的配置步骤和上面LED配置步骤类似,唯一不同的一点就是,在配置引脚的时候。
下面我们就来写一下读入按键以后,然后实现LED反转的具体代码。
对于为什么要软件消抖,是因为,按键按下时会有一定的抖动,如下图
这是因为按键的硬件属性决定的,所以,我们必须要延长一定的时间来消除它的抖动,这个时间一般是20-30ms的时间,所以我们延长这样一段时间然后再进行判断按键是否按下,这样就能实现按键更好的按下的功能。
通过上面的程序,就能很好地实验按键按下,LED反转的功能,初步实现了人机交互。
对于stm32驱动各类外设来说,其实都是对寄存器来进行读写操作,因此,操作GPIO也不例外,我们需要对GPIO的寄存器进行读写操作。
stm32中常用的寄存器主要有以下几个。
端口配置低寄存器
端口配置低寄存器主要是用来配置每个GPIO组的低8个IO口,主要包块对输入输出模式的设置和对输出速度的设置等等内容。
具体如上图,通过对端口配置寄存器写入不同的值,就可以使对应的端口呈现出我们上面用HAL库来配置的模式。
端口输入输出数据寄存器主要是用来控制IO口的数据的输入和输出的,可以读取一个GPIO组的各个引脚的电平,通过一个寄存器来存储,但是输入和输出的读取都只能一起读取16个位的内容,也就是说是以字的形式来读取或者输出的。具体寄存器如下所示。并且,这两个寄存器都只用了低16位,高16位是保留的。
端口输入数据寄存器
端口输出数据寄存器
端口位设置清除寄存器,主要是用来设置对应的位和清除对应的位,功能和端口输入/输出数据寄存器的功能差不多,不过这个寄存器也是只能以字的形式进行写入,但是这两个寄存器可以对某个位进行设置而不影响其他位的数据,所以这两个寄存器比端口输入/输出寄存器更加好用,平常用的时候也更加频繁,具体寄存器如下图。
端口位设置/清除寄存器
端口位清除寄存器
这个寄存器在平常的编程中是不大使用的,如果要用到可以参考stm32中文参考手册第8.2节GPIO的相关寄存器的配置。
以上就是stm32学习中GPIO的相关知识,写这篇博客也是为了帮助我自己来更好地认识GPIO和相关寄存器,也希望帮助更多的人学习stm32。