




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 口的状态的。了解了这点,就可以开始我们 的代码编写了。 这一节, 我们将通过 MiniSTM32 板上载有的 3 个按钮, 来控制板上的 2 个 LED, 其中 KEY0 控制 DS0,按一次亮,再按一次,就灭。KEY1 控制 DS1,效果同 KEY0。KEY_2(KEY_UP) , 同时控制 DS0 和 DS1,按一次,他们的状态就翻转一次。 3.2.2 硬件设计硬件设计 该实验所需要的硬件电路在 MiniSTM32 开发板上都已经连接好了,不需要经过任何设置, 直接编写代码就可。 LED 的连接在上一节已经介绍过了, 在 MiniSTM32 开发板上的按键 KEY0 是接在 PA13 上,KEY1 是接在 PA15 上的,WK_UP(KEY2)接在 PA0 上。如下图所示: 图 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 文件夹下新建一个 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(void) RCC-APB2ENR|=1APB2ENR|=1MAPR|=0X04000000; /关闭 JTAG GPIOA-CRL/PA0 设置成输入 97 GPIOA-CRL|=0X00000008; GPIOA-CRH/PA13,15 设置成输入 GPIOA-CRH|=0X80800000; GPIOA-ODR|=1ODR|=1KEY2! u8 KEY_Scan(void) static u8 key_up=1;/按键按松开标志 if(key_up/去抖动 key_up=0; if(KEY0=0)return 1; else if(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 口的。实现 PA0、PA13、PA15 的输入设置,这里和上一节的输出配置不同, 还有一个 JTAG 的禁用设置。 JTAG 的禁用,是通过 AFIO 的 MAPR 寄存器来配置的。要对复用 IO 口配置,必须先启用 AFIO 时钟,AFIO 的时钟使能在 APB2ENR 寄存器里面设置。如下句,就是使能 AFIO 的时钟: RCC-APB2ENR|=1MAPR 寄存器各位描述 其中 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 以上在设置 MAPR 的26:24位的时候, 我们先把这几位清空, 然后在置位这几个位。 这样, 才不会影响之前对 AFIO-MAPR 的设置。这一点在以后的寄存器配置的时候,大家一定要注 意,否则,可能引起之前的配置失效! 在禁用了 JTAG 之后,我们再配置 PA0、PA13、PA15 为输入,其设置与 3.1 的输出配置差 不多,这里不再介绍。 KEY_Scan 函数,则是用来扫描这 3 个 IO 口是否有按键按下。这个 KEY_Scan 函数,扫描 某个按键,该按键按下之后必须要松开,才能第二次触发,否则不会再响应这个按键,这样的 好处就是可以防止按一次多次触发,而坏处就是在需要长按的时候比较不合适。同时还有一点 要注意的就是,该函数的按键扫描是有优先级的,最优先的是 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 #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 个位的。同输出一样,我们也有另外一 种方法可以实现上面代码的功能,如下: #define KEY0 (113) /KEY0 PA13 #define KEY1 (115) /KEY1 PA15 #define KEY2 (1General 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 自带的上拉和下拉,所以我们得自己设置一下,来 使得其初始状态和外部硬件的状态一摸一样。如下图所示: 图 3.2.4.3 执行到断点处 接着我们执行过这句,可以看到 t 的值依旧为 0,也就是没有任何按键按下。接着我们再 103 按,再次执行到 t=KEY_Scan();我们此次把 Pins 的 PA0 勾上,再次执行过这句,得到 t 的值 为 3,如下图所示: 图 3.2.4.4 按键扫描结果 然后按相似的方法,分别勾选 PA13 和 PA15,然后再把它们还原,可以看到逻辑分析窗口 的波形如下: 图 3.2.4.5 仿真波形 从上图可以看出,每当 PA0 有按键按下的时候,DS0,DS1 都会翻转一次电平。而 PA13 有按键按下的时候 PA8 就翻转,PA15 按下的时候,PD2 就翻转。和我们之前的设计一摸一样。 104 因此,可以确定软件仿真基本没有问题了。接下来可以把代码下载到 Mini STM32 开发板上看 看运行结果是否正确。 下载完代码之后,如果你想用 JTAG 来调试,那就是不行的了,因为在按键初始化的时候, 我们已经禁用了 JTAG 和 SWD,这样你只能通过串口打印信息来确定程序的运行状况。在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中考化学试题分类汇编:科学探究题(第2期)解析版
- 1 丰富的数据世界教学设计-2025-2026学年初中数学北师大版2024七年级上册-北师大版2024
- 1秋天 教学设计-2024-2025学年语文一年级上册(统编版)
- 2025年天津市河西区中考一模物理试题(解析版)
- 小学语文一遍过单元测试卷(3篇)
- 第一章有理数-单元测试卷-2025-2026学年人教版数学
- 2025年全国汽车驾驶员(技师)职业技能考试题库(含答案)
- 本册综合教学设计-2025-2026学年中职语文拓展模块语文版
- 2025年高考数学二模试题分类汇编(辽宁专用)立体几何与空间向量(解析版)
- 2025年食品企业生产工安全生产知识考试试题及答案
- 酒水购销合同范本(3篇)
- 师说一等奖优秀课件师说优质课一等奖
- 学习罗阳青年队故事PPT在急难险重任务中携手拼搏奉献PPT课件(带内容)
- 江苏省社会组织网上办事系统-操作手册
- 小学生打扫卫生值日表word模板
- 新水浒q传乡试会试测验题目
- 小学一年级开学第一课
- 地基承载力计算
- 象数疗法常见配方
- 贵州师范学院学生成绩修改补登申请表 - 贵州师范学院教务处
- 水泥基渗透结晶型防水涂料1
评论
0/150
提交评论