ch05实验4-GPIO与独立按健输入_第1页
ch05实验4-GPIO与独立按健输入_第2页
ch05实验4-GPIO与独立按健输入_第3页
ch05实验4-GPIO与独立按健输入_第4页
ch05实验4-GPIO与独立按健输入_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验4——GPIO与独立按健输入卓越工程师培养系列本书获深圳大学教材出版资助STM32F1开发标准教程01实验内容实验内容独立按键电路原理图GPIO功能框图GPO部分存器固件库函数,以及按键去抖原理,基于STM32核心板设计一个独立按键程序。每次按下一个按键,通过串口助手输出按键按下的信息,比如KEY1按下时,输出KEY1PUSHDOWN;按键松开时,输出按键松开的信息,比如KEY2松开时,输出KEY2RELEASE。在进行独立按键程序设计时,需要对按键的抖动进行处理,即每次按下时,只能输出一次按键按下信息,每次松开时,也只能输出一次按键松开信息。通过学习STM32核心板上02实验原理1.独立按键电路原理图独立按键输入实验涉及的硬件包括3个独立按键(KEY1KEY2和KEY3,以及与独立按键串联的10k2限流电阻,与独立按键并联的100nF滤波电容,KEY1连接到STM32F103RCT6芯片的PC1,KEY2连接到PC2,KEY3连接到PA0。按键未按下时,输入芯片引脚上的电平为高电平,按键按下时,输入芯片引脚上的电平为低电平。独立按键硬件电路如图5-1所示。2.GPIO功能框图图5-2所示的GPIO功能框图是为了便于分析GPIO与独立按键输入实验在本实验中,3个独立按键引脚对应的GPIO配置为上拉输入模式,因此,下面依次介绍I/O引脚与上下拉电阻、TTL施密特触发器和输入数据寄存器。2.GPIO功能框图独立按键与STM32芯片的IO引脚相连接通过第4章,我们已经知道与I/0引脚连接的保护二极管是为了防止芯片烧毁。I/O引脚经过保护二极管之后,还可以配置为上拉或下拉输入模式,由于本实验中的独立按键在电路中是通过一个10kΩ电阳连接到33V源的,因此,为了保持电路的一致性,内部也需要通过寄存器配置为上拉输入模式。1.I/0引脚与上下拉电阻2.GPIO功能框图经过上拉或下拉电路的输入信号,依然是模拟信号,而本实验是将独立按键的输入视为数字信号,因此,还需要通过TTL施密特触发器将输入的模拟信号转换为数字信号。2.TTL施密特触发器2.GPIO功能框图经过TTL施密特触发器转换之后的数字信号会存储在输入数据寄存器(GPIO_xIDR)中通过读取GPIOx_IDR即可获得IO引脚的电平状态。3.输入数据寄存器3.GPIO部分寄存器端口输入数据寄存器(GPIOX_IDR)是一组GPIO端口的16个引脚的输入数据寄存器因此只用了低16位。该寄存器为只读,从该寄存器读出的数据可以用于判断某组GPIO端口的电平状态。GPIOx_DR的结构、偏移地址和复位值,以及部分位的解释说明如图5-3和表5-1所示。GPIOx_IDR也常常简称为IDR。4.GPIO部分固件库函数GPIO_ReadInputDataBit函数的功能是读取指定外设端口引脚的电平值,每次读取一位高电平为1,低电平为0,通过读取GPIOX→IDR来实现。具体描述如表5-2所示。5.按键去抖原理独立按键常常用作二值输入器件,STM32核心板上有3个独立按键,且均为上拉模式,即按键未按下时,输入芯片引脚上的电平为高,按键按下时,输入芯片引脚上的电平为低。市场上绝大多数按键都是机械式开关结构,而机械式开关的核心部件为弹性金属簧片,因而在开关切换的瞬间会在接触点出现来回弹跳的现象。在按键松开时,也会出现类似的情况,这种情况称为抖动。按键按下时产生前沿抖动,按键松开时产生后沿抖动,如图5-4所示。不同类型的按键其最长抖动时间也有差别,抖动时间的长短和按键的机械特性有关,一般为5~10ms,而一般人按下按键持续的时间大于100ms。5.按键去抖原理既然抖动时间为5~10ms,而一般人按下按键持续的时间大于100ms,我们就可以基于两个时间的差异,取一个中间值(如80ms)作为界限,小于80ms的信号视为抖动脉冲,大于80ms的信号视为按键按下。独立按键去抖原理图如图5-5所示,按键未按下时为高电平,按键按下时为低电平,因此,对于理想按键,按键按下时就可以立刻检测到低电平,按键松开时就可以立刻检测到高电平。5.按键去抖原理但是,实际按键未按下时电平为高,按键一旦按下,就会产生前沿抖动,抖动持续时间为5~10ms,接着,芯片引脚会检测到稳定的低电平;按键松开时,会产生后沿抖动,抖动持续时间依然为5~10ms,接着,芯片引脚会检测到稳定的高电平。去抖实际上是每10m检测一次连接到按键的引脚电平,连续检测到8次低电平,即低电平持续时间超过80ms,表示识别到按键按下。同理,按键按下后,如果连续检测到8次高电平,即高电平持续时间超过80ms,表示识别到按键松开。5.按键去抖原理独立按键去抖程序设计流程图如图5-6所示先启动一个10ms定时器然后每10ms读取一次按键值。如果连续8次检测到的电平均为按键按下电平(STM32核心板的3个按键按下电平均为低电平),且按键按下标志为TRUB,则将按键按下标志置为FALSE,同时处理按键按下函数;如果按键按下标志为FALSE,表示按键按下事件已经得到处理,则继续检查定时器是否产生10ms溢出。5.按键去抖原理对于按键松开也一样,如果当前为按键按下状态,且连续8次检测到的电平均为按键松开电平(STM32核心板的3个按键松开电平均为高电平),且按键松开标志为FALSE,则将按键松开标志置为TRUE,同时处理按键松开函数;如果按键松开标志为TRUE,表示按键松开事件已经得到处理,则继续检查定时器是否产生10ms溢出。03实验步骤步骤1:首先,将“D:STM32KeilTest\Material04GPIO与独立按键输入实验”文件夹复制到“D:STM32KeilTestProduct”文件夹中。然后,双击运行“D:STM32KeilTestProduct\04.GPIO与独立按键输入实验Project”文件夹中的STM32KeilPrjuvprojx,单击工具栏中的通按钮当BuildOutput栏出现FromELF:creatinghexfile...时,表示已经成功生成hex文件,出现0Error(s)0Warning(s)表示编译成功最后将axf文件下载到STM32的内部Flash,观察STM32核心板上的两个LED是否交替闪烁。如果两个LED交替闪烁,口正常输出字符串,表示原始工程是正确的,接着就可以进入下一步操作了。复制并编译原始工程步骤2:首先,将“D:STM32KeilTestProduct04GPIO与独立按键输入实验AppKeyOne”文件夹中的KeyOne.c和ProcKeyOne.c添加到App分组,具体操作可参见23节步骤8。然后将“D:STM32KeilTestProduct\04.GPI与独立按键输入实验AppKeyOne”路径添加到IncludePaths栏,具体操作可参见2.3节步骤11。添加KeyOne和ProcKeyOne文件对步骤3:单击

按钮进行编译,编译结束后,在Project面板中,双击KeyOnec下的KeyOne.h。在KeyOne.h文件的“包含头文件”区,添加代码#include"DataType.h”;然后,在KeyOne.h文件的“宏定义”区添加按键按下电平宏定义代码,如程序清单5-1所示。完善KeyOne.h文件步骤3:在KeyOne.h文件的“举结构体定义”区添加如程序清单5-2所示的举定义代码。这些枚举主要是按键名的定义,比如KEY1的按键名为KEYNAMEKEY1,对应值为0又如KEY3的按键名为KEYNAMEKEY3,对应值为2。完善KeyOne.h文件步骤3:在KeyOne.h文件的“API函声明”区,添加如程序清单5-3所的API函声明代码。InitKeyOne函数用于初始化KeyOne模块。ScanKeyOne函数用于按键扫描,该函数建议每10ms调用一次,即每10ms读取一次按键电平。完善KeyOne.h文件步骤4:在KeyOne.c文件的“包含头文件”区的最后,添加代码#include"stm32f10x_confh"。在KeyOne.c文件的“宏定义”区,添加如程序清单5-4所示的宏定义代码。这些宏定义主要是定义读取STM32核心板上的3个按键电平状态。完善KeyOne.c文件步骤4:在KeyOne.c文件的“内部函数声明”区,添加内部函数的声明代码,如程序清单5-6所示。完善KeyOne.c文件步骤4:在KeyOnec文件的“内部函数实现”区,添加ConfigKeyOneGPIO函数的实现代码,如程序清单5-7所示。下面按照顺序对ConfigKevOneGPIO函数中的语句进行解释说明。(1)STM32核心板的KEY1KEY2和KEY3分别与STM32微控制器的PC1、PC2和PA0相连接,因此需要通过RCC_APB2PeriphClockCmd函数使能GPIOA和GPIOC时钟。(2)通过GPIO_Init函数将PC1PC2和PAO配置为上拉输入模式。完善KeyOne.c文件步骤4:在KeyOne.c文件的“API函数实现”区,添加API函数的实现代码如程序清单5-8所示。。KeyOne.c文件的API函数只有两个,分别是InitKeyOne和ScanKeyOne。InitKeyOne作为KeyOne模块的初始化函数该函数调用ConfigKeyOneGPIO函数配置独立按键的GPIO然后,通过siarrKeyDownLevel数组设置按键按下时的电平(低电平)。ScanKeyOne为按键扫描函数,每10ms调用一次。该函数有3个参数,分别为keNameOnKevOneUp和OnKevOneDown。其中kevName为按键名称取值为KevOneh文件的枚举值:OnKeyOneUp为按键松开的响应函数名,由于函数名也是指向函数的指针,因此OnKeyOneUp也为指OnKeyOneUp函数的指针;0nKeyOneDown为按键按下的响应函数名,也为指向OnKeyOneDow函数的指针。OnKeyOneUp和nKeyOneDown均为函数指针,因此(*OnKeyOneUp)0为按键松开的响应函数,(*OnKeyOneDown)0为按键按下的响应函数。读者可参见图5-6所示的流程图理解代码。完善KeyOne.c文件步骤5:单击

画按钮进行编译,编译结束后,在Project面板中,双击ProcKeyOne.c下的ProcKeyOne.h。在ProcKeyOne.h文件的“包含头文件”区,添加代码#include"DataType.h"然后,在ProcKeyOneh文件的“API函数声明”区,添加如程序清单5-9所示的代码。ImitProcKeyOne函数主要是初始化ProcKeyOne模块ProcKeyUpKeyx函数主要处理按键松开事件,按键松开时会调用该函数,ProcKeyDownKeyx函数主要处理按键按下事件。完善ProcKeyOne.h文件步骤6:在ProcKeyOne.c文件的“包含头文件”区的最后,添加头文件的包含代码。ProcKeyOne主要是处理按键按下和松开事件,这些事件是通过串口输出按键按下和松开的信息,需要调用串口相关的函数,因此,除了包含ProcKeOn.h,还需要包含UART1.h,如程序清单5-10所示。完善ProcKeyOne.c文件步骤6:在ProcKeyOne.c文件的“API函数实现”区,添加API函数的实现代码,如程序清单5-11所示。ProcKeyOnec文件的API函数有7个,分为三类,分别是ProcKeyOne模块初始化函数InitProcKeyOne、按键开事件处理函数ProcKeyUpKeyx、按键按下事件处理函数ProKeyDownKeyx。注意,由于3个按键的按下和松开事件处理函数类似,因此在程序清单5-11中只列出了KEY1按键的按下和松开事件处理函数,KEY2、KEY3的处理函数请读者自行添加。完善ProcKeyOne.c文件步骤7:在Proiect面板中,双击打开Maic文件,在Main.c文件的“包含头文件”区的最后添加代码#include"KeyOneh"和#include"ProcKeyOneh"。这样就可以在Mainc文件中调用KeyOne和ProcKeyOne模块的宏定义和API函数等,实现对按键模块的操作。在Mainc文件的InitHardware函数中添加调用InitKeyOne和InitProcKeyOne函数的代码,如程序清单5-12所示,这样就实现了对按键模块的初始化。完善GPIO与独立按键输入实验应用层步骤7:在Mainc文件的Proc2msTask函数中,添加调用ScanKeyOne函数的代码,如程序清单5-13所示。ScanKeyOne函数需要每10ms调用一次,而Proc2msTask函数的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论