物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13)

这篇具有很好参考价值的文章主要介绍了物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实验目的

了解擒键的工作原理及电原理图

1按键功能及用途,常见按键举例
2按键的工作原理
物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13),物联网开发入门与实战,物联网,学习,笔记
物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13),物联网开发入门与实战,物联网,学习,笔记
3按键的电路表示

课后小作业:
请大家课后百度现在流行的触摸式按键的相关信息,并考虑如何使用我们开发板的CPU如何操作触摸按键。

了解STM32F407中IO输入信号读取的原理.
了解STM32F407中外部中断的原理
.学习利用CMSIS实现I/O输入信号读取的编程
.学习利用CMSIS实现外部中断的编程
简单学习工程的移植

STM32F407中如何读取I/O的输入信号

1 STM32F407如何配置I/O为输入
物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13),物联网开发入门与实战,物联网,学习,笔记
物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13),物联网开发入门与实战,物联网,学习,笔记
物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13),物联网开发入门与实战,物联网,学习,笔记

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)

物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13),物联网开发入门与实战,物联网,学习,笔记
物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13),物联网开发入门与实战,物联网,学习,笔记

  • 初始化中断源
  • 使能中断源
  • 中断服务程序的实现(interrupt handler) 例程中是Weak声明,可以进行重写或实现

通过轮询实现按键捕获实验

如何利用已有内工程创建新工程

将led工程下的所有文件拷贝至试验2.1通过轮询实现按键的检测目录中。

修改工程名称为:key_pull_test,并打开:
物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13),物联网开发入门与实战,物联网,学习,笔记

修改工程树上的根目录名称为:key_pull_test

新建F:\IOT\PRJ\按键试验2.1通过轮询\code\drivers\key目录,复制led.c和led.h,并改名为key.c和key.h:
物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13),物联网开发入门与实战,物联网,学习,笔记
查看已定义常量的定义可跳转:
物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13),物联网开发入门与实战,物联网,学习,笔记
物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13),物联网开发入门与实战,物联网,学习,笔记
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    1000

int main(void)
{
	uint16_t key0_press = KEY_UP;
	LED0_Init();//初始化LEDO
    delay_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);
		}


	}
}

物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13),物联网开发入门与实战,物联网,学习,笔记

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_ENABLE

	HAL_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    1000

int main(void)
{
	uint16_t key0_press = KEY_UP;
	LED0_Init();//初始化LEDO
  delay_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),物联网开发入门与实战,物联网,学习,笔记
解决方法:调整配置内存大小:
物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13),物联网开发入门与实战,物联网,学习,笔记
实验现象:按下亮灯,松手关灯。文章来源地址https://www.toymoban.com/news/detail-631468.html

到了这里,关于物联网|按键实验---学习I/O的输入及中断的编程|读取I/O的输入信号|中断的编程方法|轮询实现按键捕获实验-学习笔记(13)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ARM实验6-基于中断的按键处理程序实验

    一、实验名称:基于中断的按键处理程序实验 二、实验目的:         1.掌握ARM处理器的中断处理过程。         2.掌握ARM处理器中断服务程序的编写方法。         3.通过该编程实验,进一步巩固和强化学生ARM汇编编程的能,ARM应用程序框架,培养学生实际应用的

    2024年02月08日
    浏览(43)
  • 【Linux驱动】设备树中指定中断 | 驱动中获得中断 | 按键中断实验

    🐱作者:一只大喵咪1201 🐱专栏:《Linux驱动》 🔥格言: 你只管努力,剩下的交给时间! 继续拿这个中断流程图来说话。 在硬件上,中断控制器只有 GIC 这一个,但是我们在软件上可以把 GPIO 也归类为中断控制器。 芯片会有多个GPIO模块,所以软件上的中断控制器就会有很

    2024年01月17日
    浏览(51)
  • 【STM32】外部中断实现按键实验

    🐱作者:一只大喵咪1201 🐱专栏:《STM32学习》 🔥格言: 你只管努力,剩下的交给时间! 在前面的文章控制LED和蜂鸣器的按键实验中详细的讲解了怎样通过GPIO的输入模式来控制LED灯和蜂鸣器的状态。这篇文章同样是实现上诉的功能,但是方式是采用外部中断的方式实现的

    2024年02月05日
    浏览(47)
  • 驱动——按键中断控制LED灯实验

    要求:按键按一下灯亮,再按一下灯灭 注:由于开发板位置,为了方便一一对应观察,采用key1控制LED3,key2控制LED2,key3控制LED1 0、添加相关设备树节点信息 ①按键相关引脚,通过原理图可得: key1------gpiof9; key2------gpiof7; key3------gpiof8 ②LED灯相关引脚: led1-----gpioe10; led2---

    2023年04月18日
    浏览(38)
  • 2.外部中断方式检测按键输入并控制LED示例

    打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行,就叫中断。 其中,系统中断表 及对应的说明 如下图所示: 我们可以按住 Ctrl 点击中断向量表中的 ISR 函数名,可以进入该函数,可以发现,这些系统函数虽然都定义了,但是没有编写其工作方式

    2024年04月13日
    浏览(42)
  • golang读取键盘功能按键输入

    golang读取键盘功能按键输入 需求 最近业务上需要做一个终端工具,能够直接连到docker容器中进行交互。 技术选型 docker官方提供了python sdk、go sdk和remote api。 https://docs.docker.com/engine/api/sdk/ 因为我们需要提供命令行工具,因此采用golang进行开发。 遇到的问题 通过sdk可以正常和

    2024年02月09日
    浏览(38)
  • ARM开发,stm32mp157a-A7核中断实验(实现按键中断功能)

    ---key.h头文件--- ---key.c函数实现--- ---do_irq.c终端处理函数--- ---main.c测试文件---

    2024年02月11日
    浏览(41)
  • 按键输入实验(stm32)

    说明:以下内容参考正点原子资料 参考前面文章:流水灯实验的代码 按键读取函数 IDR:端口输入数据寄存器

    2024年02月13日
    浏览(33)
  • Linux输入设备应用编程(键盘,按键,触摸屏,鼠标)

    目录 一 输入设备编程介绍 1.1 什么是输入设备呢?  1.2 什么是输入设备的应用编程?   1.3 input子系统 1.4  数据读取流程 1.5 应用程序如何解析数据 1.5.1 按键类事件:  1.5.2 相对位移事件  1.5.3 绝对位移事件  二 读取 struct input_event数据   本章学习Linux输入设备的应用编程

    2024年02月05日
    浏览(51)
  • 【学习记录】STM32中断进阶任务:按键控制指示灯闪烁频率

    采用德飞莱STM32板,主控芯片STM32F103ZET6。 任务内容 :利用按键B1控制指示灯LD2的闪烁频率,闪烁频率设置为3档:初始状态时,LD2按照2Hz的频率闪烁;第一次按键后,LD2按照10 Hz的频率闪烁;第二次按键后,LD2按照20Hz的频率闪烁。再次按键后让LD2恢复以2Hz的频率闪烁,并重复

    2024年02月07日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包