datasheet

stm32f051按键控制(3)

2016-10-10来源: eefocus关键字:stm32f051  按键控制
第3课:按键控制

按键的输入其实就是对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开发板后的实验现象如下:

 
 
 
 
 

关键字:stm32f051  按键控制

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2016101030281.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm32f051(2)系统时钟设置
下一篇:USART发送字符串首字符丢失原因及解决办法

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

stm32F4XX之窗口看门狗 HAL库

附上相关代码WWDG_HandleTypeDef WWDG_Handler;     //窗口看门狗句柄 //保存WWDG计数器的设置值,默认为最大u8 WWDG_CNT=0X7F;  //初始化窗口看门狗 //tr   :T[6:0],计数器值 //wr   :W[6:0],窗口值 //fprer:分频系数(WDGTB),仅最低2位有效 //Fwwdg=PCLK1/(4096*2^fprer). 一般PCLK1=45Mhzvoid WWDG_Init(u8 tr,u8 wr,u32 fprer
发表于 2019-04-16
stm32F4XX之窗口看门狗 HAL库

stm32f0独立看门狗配置

独立看门狗STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。设置好看门狗的分频系数 prer 和重装载值就可以知道看门狗的喂狗时间 (也就是看门狗溢出时间) ,该时间的计算方式为Tout=((4×2^prer)  ×rlr) /40具体配置先开启看门狗对看门狗进行设置,这里主要的是设置IWDG down-counter reload value。IWDG counter clock prescaler为分频系数,我现在项目设置的IWDG的时钟是40KHz,所以分频后为40000/16=2500Hz,我先在项目需要使用1秒的看门狗,则2500*1=2500,就是IWDG
发表于 2019-04-12
stm32f0独立看门狗配置

STM32F030应用常见问题

STM32F030的PF0、PF1作为普通IO使用时无法正常输出高低电平如下配置无法正常运行GPIO_InitTypeDef GPIO_InitStructure;/* GPIO Periph clock enable */RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);    /* Configure IO in output pushpull mode */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT
发表于 2019-04-12
STM32F030应用常见问题

STM32F103 - ADC采集电压

        在使用STM32F103的ADC采集外部电压时,发现配置不同的采样周期ADC_SampleTime,外部输入阻抗的电压值不同,也就是影响了外部总电压分给ADC口的电压(电阻电压分配不对),但ADC能正常采集;      所以要根据STM32F103手册中的ADC采样周期与外部输入阻抗的关系表来确定软件设定的采样周期Ts和采样电阻RAIN大小。关系表如下所示:
发表于 2019-04-12
STM32F103 - ADC采集电压

STM32F103两种串口输出的方式

#include "stm32f10x.h"    #include "stm32f10x_rcc.h"    #include "stm32f10x_gpio.h"    #include "stm32f10x_usart.h"   #include "stm32f10x_crc.h"  #include "system_stm32f10x.h"   
发表于 2019-04-12

stm32f103串口实现重映射功能

在实际开发中,经常遇到串口的默认输出IO口被其他模块占用了,所以我们要用到串口IO口映射功能,是指将原来实现功能的IO口映射到其他指定IO口,其他不变。具体操作如下:先贴出默认下的串口初始化设置:void USART1Conf(u32 baudRate){ USART_InitTypeDef USART_InitSturct;//定义串口1的初始化结构体  GPIO_InitTypeDef GPIO_InitStruct;//定义串口对应管脚的结构体  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA , ENABLE
发表于 2019-04-12

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved