stm32f051按键控制(3)
2016-10-10 来源:eefocus
按键的输入其实就是对GPIO口进行操作。同时引入了中断的概念。实际上按键控制分为两种情况,第一种是按键扫描,这种情况下,CPU需要不停的工作,来判断GPIO口是否被拉低或者置高,效率是比较低的。另一种方式为中断控制,中断控制的效率很高,一旦系统IO口出现上升沿或者下降沿电平就会触发执行中断内的程序。
相信按键是所有接触过MCU的朋友都知道的,其基本原理我就不啰嗦了,这一节的教程主要针对了实验四和实验三。
下面我就来分别介绍下STM32F051的按键控制方式。
首先来学习下按键扫描方式:
硬件准备:
在青风stm32f051开发板上设置了2个用户按键如下图所示:
Key1和Key2分别和PF6和PF7两个IO管脚相连。这里设置了按键管脚加了3.3V的上拉,可以提高驱动能力。当IO管脚为低的时候可以判断管脚已经按下。通过key的按下来控制led的亮灭。
软件准备:
在代码文件中,实验三建立了一个演示历程,我们打开看看需要那些库文件。打开user文件夹中的key工程:
如上图所示:按照上面的方式添加好相应的函数,其中led.c和key.c是用户自己所编写的驱动子文件,用于控制按键和LED灯。Lib库中只需要添加:stm32f0xx_rcc.c和stm32f0xx_gpio.c两个文件。
Led.c和我们第一节所编写的驱动一样,下面我们来看看如何编写key.c文件。Key.c文件主要是要起到两个作用:第一:初始化开发板上的按键。第二:扫描判断按键是否有按下,按键扫描是通过MCU不停的判断端口的状态来实现的。完成这两个功能够就可以在main.c文件中直接调用本驱动了。下面看看代码:
那么在主函数中直接可以调用key,c和led.c两个子文件,代码如下:
那么更加好的按键控制方法是使用中断控制,这样可以大大节省了CPU的占有率。
中断是指由于接收到来自外围硬件(相对于中央处理器和内存)的异步信号或来自软件的同步信号,而进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器通过一个上下文切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的一个指令,以可编程的方式直接指示这种上下文切换,并将处理导向一段中断处理代码。中断在计算机多任务处理,尤其是实时系统中尤为有用,这样的系统,包括运行于其上的操作系统,也被称为“中断驱动的”。简单的来说就比如某个人正在做某事,突然来了个电话,他就要停下手中的事情去接电话,中断相当于这个电话。触发中断后跳出原来运行的程序去执行中断处理。
软件准备:
在使用stm32f051库函数来完成中断,需要设置如下几个地方:第一:中断嵌套的设置。
第二:外部GPIO中断的设置。 首先是中断嵌套的问题:在stm32f05xx的参考手册第157页有一个中断嵌套列表,列出了各类中断的地址,在库文件stm32f0xx_misc.c里对嵌套进行了设置。并且在stm32f0xx.h文件中给出了中断列表中各类中断的中断频道号,并且封装成IRQn_Type结构体。
我们设置中断的类型只要设置如下结构体的参数就行:
其中NVIC_IRQChannel在stm32f0xx_misc.c里对嵌套进行了设置,NVIC_IRQChannelPriority可以在1到3直接进行设置。 NVIC_IRQChannelCmd频道命令主要是使能和禁能的作用。
第二个问题是外部IO中断的设置,主要是stm32051中断各种外部中断所使用的。在库函数中,在stm32f0xx_exti.c文件中进行了详细设置,我们只需要配置下面一个结构体就可以实现外部中断的控制了:
按照上面的配置要求,我们编写exit.c外部中断子函数,如下面的代码:
其中exit.c就是上面我们编写的按键中断初始化的驱动函数。而Lib树下文件我们之间添加ST公司提供的库函数。这里面,我们需要在stm32f0xx_it.c中加入相应的中断后执行函数,也就是发生按键中断后,我们执行反转LED的命令:
通过上面几个步骤,下面的主函数就相当的简单了,我们直接调用exit.h函数就可以完成按键中断的初始化了。看看下面代码,是不是非常简单不解释:
实验下载到QF-STM32F0开发板后的实验现象如下: