收藏 分享(赏)

STM32按键输入实验.pdf

上传人:精品资料 文档编号:10731050 上传时间:2020-01-03 格式:PDF 页数:11 大小:500.10KB
下载 相关 举报
STM32按键输入实验.pdf_第1页
第1页 / 共11页
STM32按键输入实验.pdf_第2页
第2页 / 共11页
STM32按键输入实验.pdf_第3页
第3页 / 共11页
STM32按键输入实验.pdf_第4页
第4页 / 共11页
STM32按键输入实验.pdf_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、 94 3.2 按键输入实验 上一节介绍了 STM32 的 IO 口输出,这一节,我们将向大家介绍如何使用 STM32 的 IO 口 作为输入用。通过本节的学习,你将了解到 STM32 的 IO 口作为输入使用的方法。本节分为如 下几个小节: 3.2.1 STM32 IO口简介 3.2.2 硬件设计 3.2.3 软件设计 3.2.4 仿真与下载 95 3.2.1 STM32 IO口简介 STM32 的 IO 口在上一节已经有了详细的介绍,这里我们不再多说。STM32 的 IO 口做输 入使用的时候,是通过读取 IDR 的内容来读取 IO 口的状态的。了解了这点,就可以开始我们 的代码编写了。

2、这一节, 我们将通过 MiniSTM32 板上载有的 3 个按钮, 来控制板上的 2 个 LED, 其中 KEY0 控制 DS0,按一次亮,再按一次,就灭。KEY1 控制 DS1,效果同 KEY0。KEY_2(KEY_UP) , 同时控制 DS0 和 DS1,按一次,他们的状态就翻转一次。 3.2.2 硬件设计 该实验所需要的硬件电路在 MiniSTM32 开发板上都已经连接好了,不需要经过任何设置, 直接编写代码就可。 LED的连接在上一节已经介绍过了,在 MiniSTM32 开发板上的按键 KEY0 是接在 PA 1 3 上,KEY1 是接在 PA 1 5 上的,WK_UP(KEY2)接在

3、 PA 0 上。如下图所示: 图 3.2.2.1 按键与 STM32连接原理图 这里需要注意的是 KEY0 和 KEY1 是低电平有效的,而 WK_UP 是高电平有效的,而且要 确认 WK_UP按钮与 DS18B20 的连接是否已经断开, 要先断开, 否则 DS18B20 会干扰 WK_UP 按键!并且 KEY0 和 KEY1 连接在与 JTAG 相关的 IO 口上,所以在软件编写的时候要先禁用 JTAG 功能,才能把这两个 IO 口当成普通 IO 口使用。 96 3.2.3 软件设计 这里的代码设计,我们还是在之前的基础上继续编写,打开 3.1 节的 TEST 工程,然后在 HARDWARE

4、 文件夹下新建一个 KEY 文件夹,用来存放与 KEY 相关的代码。如下图所示: 图 3.2.3.1 在 HARDWARE 下新增 KEY 文件夹 然后我们打开 USER 文件夹下的 TEST.Uv2 工程,按 按钮新建一个文件,然后保存在 HARDWARE-KEY 文件夹下面,保存为 key.c。在该文件中输入如下代码: #include #include “key.h“ #include “delay.h“ /Mini STM32 开发板 /按键输入 驱动代码 /正点原子ALIENTEK /2010/5/27 /按键初始化函数 /PA0.13.15 设置成输入 void KEY_Init(

5、void) RCC-APB2ENR|=1APB2ENR|=1MAPR /清除 MAPR 的26:24 AFIO-MAPR|=0X04000000; /关闭 JTAG GPIOA-CRL/PA0 设置成输入 97GPIOA-CRL|=0X00000008; GPIOA-CRH/PA13,15 设置成输入 GPIOA-CRH|=0X80800000; GPIOA-ODR|=1ODR|=1KEY1KEY2! u8 KEY_Scan(void) static u8 key_up=1;/按键按松开标志 if(key_up/去抖动 key_up=0; if(KEY0=0)return 1; else if

6、(KEY1=0)return 2; else if(KEY2=1)return 3; else if(KEY0=1 return 0;/ 无按键按下 在段代码包含了 2 个函数,void KEY_Init(void)和 u8 KEY_Scan(void),KEY_Init 是用来初 始化按键输入的 IO 口的。实现 PA 0、 PA 1 3、 PA 1 5 的输入设置,这里和上一节的输出配置不同, 还有一个 JTAG 的禁用设置。 JTAG 的禁用,是通过 AFIO 的 MAPR 寄存器来配置的。要对复用 IO 口配置,必须先启用 AFIO 时钟, AFIO 的时钟使能在 APB2ENR 寄存

7、器里面设置。如下句,就是使能 AFIO 的时钟: RCC-APB2ENR|=1MAPR 寄存器。该寄存器的各位描述如下: 图3.2.3.2 AFIO-MAPR 寄存器各位描述 其中 SWJ_CFG2:0(AFIO-MAPR26:24)是与 JTAG 相关的配置寄存器位,这几位的具 98 体设置以及其对应的描述如下: 图3.2.3.2 SWJ_CFG位段设置关系 在这里我们把 JTAG 和 SW 口全部禁用了,设置 AFIO-MAPR 26:24为 100,如下: AFIO-MAPR /清除 MAPR 的26:24 AFIO-MAPR|=0X04000000; /关闭 JTAG 以上在设置 MA

8、PR 的26:24位的时候, 我们先把这几位清空, 然后在置位这几个位。 这样, 才不会影响之前对 AFIO-MAPR 的设置。这一点在以后的寄存器配置的时候,大家一定要注 意,否则,可能引起之前的配置失效! 在禁用了 JTAG 之后,我们再配置 PA 0、PA 1 3、PA 1 5 为输入,其设置与 3.1的输出配置差 不多,这里不再介绍。 KEY_Scan 函数,则是用来扫描这 3个 IO 口是否有按键按下。这个 KEY_Scan 函数,扫描 某个按键,该按键按下之后必须要松开,才能第二次触发,否则不会再响应这个按键,这样的 好处就是可以防止按一次多次触发,而坏处就是在需要长按的时候比较不

9、合适。同时还有一点 要注意的就是,该函数的按键扫描是有优先级的,最优先的是 KEY0,第二优先的是 KEY1, 最后是 KEY2。该函数有返回值,如果有按键按下,则返回非 0 值,如果没有或者按键不正确, 则返回 0。具体怎么实现请参考 KEY_Scan 的代码。 保存 key.c 代码,然后我们按同样的方法,新建一个 key.h 文件,也保存在 KEY 文件夹下 面。在 key.h中输入如下代码: #ifndef _KEY_H #define _KEY_H #include “sys.h“ /Mini STM32 开发板 /按键输入 驱动代码 /正点原子ALIENTEK /2010/5/27

10、 #define KEY0 PAin(13) /PA13 #define KEY1 PAin(15) /PA15 #define KEY2 PAin(0) /PA0 WK_UP void KEY_Init(void);/IO初始化 u8 KEY_Scan(void); /按键扫描函数 #endif 这段代码里面最关键就是 3 个宏定义: #define KEY0 PAin(13) /PA13 #define KEY1 PAin(15) /PA15 #define KEY2 PAin(0) /PA0 WK_UP 99 这里使用的是位带操作来实现读取某个 IO 口的 1 个位的。同输出一样,我们也

11、有另外一 种方法可以实现上面代码的功能,如下: #define KEY0 (1IDR Stm32_Clock_Init(9); /系统时钟设置 delay_init(72); /延时初始化 LED_Init(); /初始化与 LED连接的硬件接口 KEY_Init(); /初始化与按键连接的硬件接口 while(1) t=KEY_Scan();/得到键值 if(t) switch(t) case 1: LED0=!LED0; b r e a k ; case 2: LED1=!LED1; b r e a k ; case 3: LED0=!LED0; LED1=!LED1; b r e a k

12、 ; 注意要将 KEY 文件夹加入头文件包含路径,不能少,否则编译的时候会报错的哦,呵呵。 这段实现代码比较简单,就是实现前面简介所阐述的功能。 然后按 ,编译工程,得到结果如下图所示: 图3.2.3.4 编译结果 可以看到没有错误,也没有警告。从编译信息可以看出,我们的代码占用 FLASH 大小为: 1792 字节(1524+268) ,所用的 SRAM 大小为:520 个字节。 101 这里我们解释一下,编译结果里面的几个数据的意义: Code:表示程序所占用 FLASH 的大小(FLASH) 。 RO-data:表示程序定义的常量(FLASH) 。 RW-data:表示已初始化的全局变量

13、(SRAM) ZI-data:表示未初始化的全局变量(SRAM) 有了这个就可以知道你当前使用的 flash 和 sram 大小了,所以,一定要注意的是程序的大 小不是.hex文件的大小。 接下来, 我们还是先进行软件仿真, 验证一下是否有错误的地方, 然后才下载到 Mini STM32 看看实际运行的结果。 3.2.4 仿真与下载 我们可以先用软件仿真,看看结果对不对,根据软件仿真的结果,然后再下载到 MINI STM32 板子上面看运行是否正确。 首先, 我们进行软件仿真。 先按 开始仿真, 接着按 , 显示逻辑分析窗口, 点击 Setup, 新建 5 个信号 PORTA.8、PORTD.

14、2、PORTA.0、PORTA.13、PORTA.15,如下图所示: 图3.2.4.1 新建仿真信号 然后再点击 Peripherals-General Purpose I/O-GPIOA,弹 出 GPIOA 的查看窗口,如下图所 示: 102图3.2.4.2 单看 GPIOA寄存器 然后在 t=KEY_Scan();这里设置一个断点, 按 直接执行到这里, 然后在 General Purpose I/O A窗口内设置 GPIOA.0 为 0, GPIOA.13 和 15 为 1,这是因为我们已经设置了这几个 IO 口的状 态就是这个样子,而 MDK不会考虑 STM32 自带的上拉和下拉,所以

15、我们得自己设置一下,来 使得其初始状态和外部硬件的状态一摸一样。如下图所示: 图 3.2.4.3 执行到断点处 接着我们执行过这句,可以看到 t 的值依旧为 0,也就是没有任何按键按下。接着我们再 103 按 ,再次执行到 t=KEY_Scan();我们此次把 Pins 的 PA 0 勾上,再次执行过这句,得到 t 的值 为 3,如下图所示: 图 3.2.4.4 按键扫描结果 然后按相似的方法,分别勾选 PA 1 3 和 PA 1 5,然后再把它们还原,可以看到逻辑分析窗口 的波形如下: 图 3.2.4.5 仿真波形 从上图可以看出,每当 PA 0 有按键按下的时候,DS0,DS1 都会翻转一

16、次电平。而 PA 1 3 有按键按下的时候 PA 8 就翻转,PA 1 5 按下的时候,PD2 就翻转。和我们之前的设计一摸一样。 104 因此,可以确定软件仿真基本没有问题了。接下来可以把代码下载到Mini STM32开发板上看 看运行结果是否正确。 下载完代码之后,如果你想用 JTAG 来调试,那就是不行的了,因为在按键初始化的时候, 我们已经禁用了 JTAG 和 SWD,这样你只能通过串口打印信息来确定程序的运行状况。在下载 完之后,我们可以按 KEY0KEY2 看 DS0 和 DS1 的变化,是否和我们仿真的结果一致。 至此, 我们的第二节学习就结束了, 这一节, 作为 STM32 的入门第二个例子, 介绍了 STM32 的 IO 作为输入的使用方法,介绍了一下 JTAG 的复用禁止,这在以后会经常用到,后续将不再 详细说明。同时巩固了前面的学习,对 MDK 的使用又更加加深了一点,希望能让大家稍有裨 益。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报