物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13)
文章目录
- 实验目的
- 了解擒键的工作原理及电原理图
- STM32F407中如何读取I/O的输入信号
- STM32F407对中断的编程方法
- 通过轮询实现按键捕获实验
- 如何利用已有内工程创建新工程
- 通过轮询实现按键捕获代码实现及分析
- 1 代码的流程分析
- 2 代码的实现
- Tips:下载错误的解决
实验目的
了解擒键的工作原理及电原理图
1按键功能及用途,常见按键举例
2按键的工作原理
3按键的电路表示
课后小作业:
请大家课后百度现在流行的触摸式按键的相关信息,并考虑如何使用我们开发板的CPU如何操作触摸按键。
了解STM32F407中IO输入信号读取的原理.
了解STM32F407中外部中断的原理
.学习利用CMSIS实现I/O输入信号读取的编程
.学习利用CMSIS实现外部中断的编程
简单学习工程的移植
STM32F407中如何读取I/O的输入信号
1 STM32F407如何配置I/O为输入
2 STM32F407如何读取输入信号
8.3.9输入配置
当I/O端口被编程为输入时:
•输出缓冲区被禁用
•施密特触发输入被激活
•上拉和下拉电阻被激活取决于在GPIOx_PUPDR寄存器的配置
•I/O引脚上的数据在每个AHB1时钟周期的输入数据寄存器中采样
•对输入数据寄存器的读访问提供I/O状态
图28显示了I/O端口位的输入配置。
STM32F407对中断的编程方法
12中断和事件
除非另有规定,本节适用于整个STM32F4xx系列。
12.1嵌套矢量中断控制器(NVIC)
12.1.1 NVIC特性
嵌套的矢量中断控制器NVIC包括以下特性:
•STM32F405xx/07xx和STM32F415xx/17xx的82个可屏蔽中断通道
STM32F42xxx和STM32F43xxx的最多91个可屏蔽中断通道
包括带FPU的Cortex™-M4的16条中断线)
•16个可编程优先级(使用4位中断优先级)
•低延迟异常和中断处理
•电源管理控制
•系统控制寄存器的实现
NVIC和处理器核心接口紧密耦合,从而实现低延迟
中断处理和延迟到达的中断的有效处理。
包括核心异常在内的所有中断都由NVIC管理。了解更多信息
关于异常和NVIC编程,请参见编程手册PM0214。
12.1.2 SysTick校准值寄存器
SysTick校准值固定为18750,它给出了1毫秒的参考时间基础
与SysTick时钟设置为18.75 MHz (HCLK/8,与HCLK设置为150 MHz)。
12.1.3中断和异常向量
STM32F405xx/07xx的矢量表见表62和表62
STM32F415xx/17xx和STM32F42xxx和STM32F43xxx设备。
12.2外部中断/事件控制器(EXTI)
外部中断/事件控制器由多达23个边缘检测器组成,用于生成
事件/中断请求。每条输入线都可以独立配置选择类型
(中断或事件)和相应的触发事件(上升或下降或两者)。每一行也可以独立遮罩。暂挂寄存器维护中断的状态行请求12.2.1 EXTI的主要特性
EXTI控制器的主要特性如下:
•在每个中断/事件线上独立触发和掩码
•每个中断线的专用状态位
•生成多达23个软件事件/中断请求
•检测脉冲宽度低于APB2时钟周期的外部信号。请参考有关这方面的详细信息,请参阅STM32F4xx数据表的电气特性部分参数。
12.2.3唤醒事件管理
STM32F4xx能够处理外部或内部事件,以唤醒核心(WFE)。
唤醒事件可以通过以下方式生成:
在外设控制寄存器中使能中断,但不在NVIC中使能Cortex™-M4具有FPU系统控制寄存器的SEVONPEND位。当MCU从WFE、外设中断暂挂位和外设NVIC恢复
IRQ通道挂起位(在NVIC中断中清除挂起寄存器)必须是清除。
或在事件模式下配置外部或内部EXTI线路。CPU恢复时从WFE,不需要清除外设中断挂起位或NVIC IRQ通道挂起位作为挂起位对应的事件行未设置。
要使用外接线路作为唤醒事件,请参阅章节12.2.4:功能描述。
12.2.4功能介绍
为了生成中断,应该配置并启用中断线。完成了通过编程的两个触发寄存器与所需的边缘检测和使能
通过在中断掩码寄存器的相应位上写一个“1”来中断请求。
当选择的边缘出现在外部中断线上时,中断请求是生成的。与中断线对应的挂起位也被设置。这个请求是
通过在挂起寄存器中写入' 1 '来重置。
要生成事件,应该配置并启用事件行。这是由编程两个触发寄存器与所需的边缘检测和启用
通过向事件掩码寄存器中相应的位写入' 1 '来发送事件请求。当所选边缘发生在事件线上,则产生事件脉冲。挂起位
没有设置对应的事件行。
中断/事件请求也可以由软件通过在软件中写入' 1 '来生成中断/事件寄存器。
12.2.5外部中断/事件行映射
多达140个gpio (STM32F405xx/07xx和STM32F415xx/17xx), 168个gpio
(STM32F42xxx和STM32F43xxx)连接到16外部中断/事件线
以下方式:
图42 外部中断/事件GPIO映射(STM32F405xx/07xx)和STM32F415xx/17xx)
- 初始化中断源
- 使能中断源
- 中断服务程序的实现(interrupt handler) 例程中是Weak声明,可以进行重写或实现
通过轮询实现按键捕获实验
如何利用已有内工程创建新工程
将led工程下的所有文件拷贝至试验2.1通过轮询实现按键的检测目录中。
修改工程名称为:key_pull_test,并打开:
修改工程树上的根目录名称为:key_pull_test
新建F:\IOT\PRJ\按键试验2.1通过轮询\code\drivers\key目录,复制led.c和led.h,并改名为key.c和key.h:
查看已定义常量的定义可跳转:
keil的drivers目录中添加led.c和key.c,后期都要使用,并在option中增加头文件的路径:
接下来修改源代码。
通过轮询实现按键捕获代码实现及分析
1 代码的流程分析
编写代码框架:
//创建及修改说明
//V1.o创建第一个按键检测实验主程序代码﹑通过轮询的方式实现按键的检测#include "systick.h"
#include "stm32f4xx.h"
#include "led.h"#define SYS_MAX_CLK 12
#define DELAY_1S 1000int main(void)
{uint16_t key0_press = KEY_UP;LED0_Init();//初始化LEDOdelay_init(SYS_MAX_CLK);//初始化系统时钟Key_Init();while(1){if(KEY_PRESS==Detect_key(KEY0_PIN))//查询按键key0(PE4)的状态{Led_Ctrl(LED0_PIN_ROW,LED0_PIN,LED_ON); //如果按键按下,点灯key0_press = KEY_PRESS;}delay_ms(200); //在延时(200ms)后,如果按键按下标志有效,关灯if(key0_press == KEY_PRESS){Led_Ctrl(LED0_PIN_ROW,LED0_PIN,LED_OFF);}}
}
2 代码的实现
在key.h中实现有关定义:
#ifndef __KEY_H
#define __KEY_H#include "stm32f4xx.h"
#include "systick.h"
#include "stm32f4xx_hal_rcc.h"
#include "stm32f4xx_hal_gpio.h"#define KEY0_PIN GPIO_PIN_4
#define KEY1_PIN GPIO_PIN_3
#define KEY2_PIN GPIO_PIN_2#define KEY_PRESS GPIO_PIN_RESET //枚举变量,0,低电平
#define KEY_UP GPIO_PIN_SET //枚举变量,弹起时弱上拉,高电平void Key_Init(void);//初始化
uint16_t Detect_key(uint16_t key_pin);#endif
在stm32f4xx_hal_gpio.h中定义了枚举变量:
#define KEY_PRESS GPIO_PIN_RESET //枚举变量,0,低电平
#define KEY_UP GPIO_PIN_SET //枚举变量,弹起时弱上拉,高电平
key.C的代码:
#include <stdlib.h>
#include "key.h"void Key_Init(void)
{GPIO_InitTypeDef gpio_info;gpio_info.Pin = KEY0_PIN | KEY1_PIN; //KEY0_PIN,KEY1_PIN同时初始化gpio_info.Mode = GPIO_MODE_INPUT; //由定义跳转,改成输入状态gpio_info.Speed = GPIO_SPEED_FREQ_MEDIUM; //其他参数采用复位值即可gpio_info.Pull = GPIO_PULLUP;__GPIOE_CLK_ENABLE(); //stm32_hal_legacy.h中有:#define __GPIOE_CLK_ENABLE __HAL_RCC_GPIOE_CLK_ENABLEHAL_GPIO_Init(GPIOE, &gpio_info);}uint16_t Detect_key(uint16_t key_pin)
{uint16_t ret = KEY_UP;if(KEY_PRESS==HAL_GPIO_ReadPin(GPIOE,key_pin)) //GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin){delay_ms(10);//延时10mS去抖动if(KEY_PRESS==HAL_GPIO_ReadPin(GPIOE,key_pin)){ret = KEY_PRESS;}}return ret;}
test.C的代码:
//创建及修改说明
//V1.o创建第一个按键检测实验主程序代码﹑通过轮询的方式实现按键的检测
#include "systick.h"
#include "stm32f4xx.h"
#include "key.h"
#include "led.h"#define SYS_MAX_CLK 12
#define DELAY_1S 1000int main(void)
{uint16_t key0_press = KEY_UP;LED0_Init();//初始化LEDOdelay_init(SYS_MAX_CLK);//初始化系统时钟Key_Init();while(1){if(KEY_PRESS==Detect_key(KEY0_PIN))//查询按键key0(PE4)的状态{Led_Ctrl(LED0_PIN_ROW,LED0_PIN,LED_ON); //如果按键按下,点灯key0_press = KEY_PRESS;}delay_ms(200); //在延时(200ms)后,如果按键按下标志有效,关灯if(key0_press == KEY_PRESS){Led_Ctrl(LED0_PIN_ROW,LED0_PIN,LED_OFF);}}
}
Tips:下载错误的解决
当默认设置内存大小不足时,会出现如下错误:
解决方法:调整配置内存大小:
实验现象:按下亮灯,松手关灯。
相关文章:

物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13)
文章目录 实验目的了解擒键的工作原理及电原理图 STM32F407中如何读取I/O的输入信号STM32F407对中断的编程方法通过轮询实现按键捕获实验如何利用已有内工程创建新工程通过轮询实现按键捕获代码实现及分析1 代码的流程分析2 代码的实现 Tips:下载错误的解决 实验目的 了解擒键…...

Hadoop-HDFS的Namenode及Datanode(参考Hadoop官网)
HDFS有什么特点,被设计做什么 Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。有一下几个特点: HDFS是一个高度容错性的系统,具有高容错、高可靠性、高扩展性的特点,适合部…...
C:通过alarm发送信号
可以通过alarm定时发送SIGALRM信号: #include <unistd.h> unsigned int alarm(unsigned int seconds); alarm()函数用来在seconds秒之后安排发送一个SIGALRM信号,如果seconds为0,将取消所有已设置的闹钟请求。alarm()函数的返回值是以前…...

如何将 dubbo filter 拦截器原理运用到日志拦截器中?
业务背景 我们希望可以在使用日志拦截器时,定义属于自己的拦截器方法。 实现的方式有很多种,我们分别来看一下。 拓展阅读 java 注解结合 spring aop 实现自动输出日志 java 注解结合 spring aop 实现日志traceId唯一标识 java 注解结合 spring ao…...

【java】【maven】【基础】MAVEN安装配置介绍
目录 1 下载 2 安装-windows为例 3 配置环境变量 3.1 JAVA_HOME 3.2 MAVEN_HOME 3.3 PATH 3.4 验证 4 MAVEN基础概念 4.1 仓库概念 4.2 坐标概念 4.2.1 打开网址 4.2.2 输入搜索内容junit 4.2.3 找到对应API名称点击 4.2.4 点击对应版本 4.2.5 复制MAVEN坐标 4.3 配置…...

【C语言进阶】指针的高级应用(下)
文章目录 一、指针数组与数组指针1.1 指针数组与数组指针的表达式 二、函数指针2.1 函数指针的书写方式 三、二重指针与一重指针3.1 二重指针的本质3.2 二重指针的用法3.3 二重指针与数组指针 总结 一、指针数组与数组指针 (1)指针数组的实质是一个数组,这个数组中存…...
【uniapp APP隐藏顶部的电量,无线,时间状态栏与导航栏】
uniapp APP隐藏顶部的电量,无线,时间状态栏 如下代码配置(在一个页面设置这个段代码,所有页面都会消失) onShow() {// #ifdef APP-PLUS// 隐藏顶部电池,时间等信息 plus.navigator.setFullscreen(true);//隐藏虚拟按…...
微信小程序前后页面传值
微信小程序前后页面传值 从前一个页面跳转到下一个页面,如何传递参数?从后一个页面返回前一个页面,如何回调参数? 向后传值 从前一个页面跳转到下一个页面并传值。 前页面:在跳转链接中添加参数并传递 wx.navigat…...
没有jodatime,rust里怎么比较两个日期(时间)的大小呢?
关注我,学习Rust不迷路!! 在 Rust 中,比较两个日期的大小有多种方法。以下是列举的四种常见方法: 1. 使用 PartialOrd trait: use chrono::prelude::*;fn main() {let date1 NaiveDate::from_ymd(2022,…...

【雕爷学编程】Arduino动手做(186)---WeMos ESP32开发板18
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&#x…...
C语言假期作业 DAY 14
一、选择题 1、有以下函数,该函数的功能是( ) int fun(char *s) {char *t s;while(*t);return(t-s); } A: 比较两个字符的大小 B: 计算s所指字符串占用内存字节的个数 C: 计算s所指字符串的长度 D: 将s所指字符串复制到字符串t中 答案解析 …...

Maven-生命周期及命令
关于本文 ✍写作原因 之前在学校学习的时候,编写代码使用的项目都是单体架构,导入开源框架依赖时只需要在pom.xml里面添加依赖,点一下reload按钮即可解决大部分需求;但是在公司使用了dubbo微服务架构之后发现只知道使用reload不足…...

常温超导:AI在研发中的潜力
目录 引言:1. 常温超导的挑战:2. AI在材料研究中的作用:3. AI在理论模型中的作用:4. AI与实验室合作的潜力:结论: 引言: 常温超导一直被认为是科学界的“圣杯”,可以在室温条件下实…...

【C++】开源:Eigen3矩阵与线性代数库配置使用
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Eigen3矩阵与线性代数库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&…...

OpenMesh 网格简化算法(基于边长度)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 网格简化的算法有很多种,基于边结构进行简化的方法便是其中一种方式。此类算法主要关注于它们如何选择要收缩的边,并且似乎都是为流形表面设计的,尽管边缘收缩也可以用于非流形表面,但往往会存在变形较大的问题…...

FFmpeg解码详细流程
介绍 FFmpeg的 libavcodec 模块完成音视频多媒体的编解码模块。老版本的 FFmpeg 将avcodec_decode_video2()作为视频的解码函数 API,将avcodec_decode_audio4()作为音频的解码函数 API;从 3.4版本开始已经将二者标记为废弃过时 API(attribut…...

人工智能的缺陷
首先从应用层面理解什么是人工智能,目前人工智能主流应用面包括:自然语言处理领域,代表为chatgpt,我们能用其进行日常交流,问题答疑,论文书写等。计算机视觉领域,代表为人脸识别,现在…...

基于ASP.NET MVC开发的、开源的个人博客系统
推荐一个功能丰富、易于使用和扩展的开源博客,可以轻松地创建和管理自己的博客。 项目简介 基于.Net Framework 4.5开发的、开源博客系统,具有丰富的功能,包括文章发布、分类、标签、评论、订阅、统计等功能,同时也可以根据需要…...

【LeetCode】对称二叉树 平衡二叉树
对称二叉树 即先判断根节点的左右子树相不相同,相同时,再判断左孩子的左子树和右孩子的右子树比较,左孩子的右子树和右孩子的左子树(当两个都相同时才是对称的).....依次递推,过程中并设置一些不满足相同的…...
区块链和WEB3.0有哪些基础知识呢
区块链基础知识 常用区块链基础知识包括: (1)区块链概念:区块链是一种去中心化的分布式账本技术,它通过加密算法和共识机制保证了数据的安全性和不可篡改性。区块链中的每一个区块都包含了前一个区块的哈希值&#x…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...