嵌入式开发与应用按键外部中断实验二

2024-09-04 00:28

本文主要是介绍嵌入式开发与应用按键外部中断实验二,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、实验目的

1. 通过实验掌握中断式键盘控制与设计方法;

2. 熟悉编写中断服务程序;

3. 掌握中断系统相关知识,掌握外部中断应用方法和处理过程;

4. 掌握实验处理器中断处理的软件编程方法;

5. 从按键程序的设计对系统的编程进行深入了解,与单片机裸机编程进行区分;

6. 掌握基于固件库编程控制GPIO端口的输出,进而控制LED灯的显示状态。

二、实验内容

  根据实验要求通过按键点亮LED灯,通过原理图了解硬件电路结构,实现初始化GPIO,并配置中断,编写中断处理程序,处理一个键盘中断,并在串口打印中断及按键显示信息。按键K1按下,触发外部中断,中断函数点亮LED灯,来实现对LED灯的控制以及硬件仿真软件的测试。

原理图如下:

三、实验器材(设备、元器件)

(一)装有Keil uVision5软件的计算机一台

(二)STM32f103VET6的开发板一块

四、实验步骤

  1.原理说明

  本实例需要创建两个文件“exti.c”和“exti.h”用来存放 EXTI驱动程序及相关宏定义,STM32的每个IO端口都可以作为中断输入,因此配置1/0端口,使之能响应中断。其编程要点和步骤如下:

  查看STM32VET6开发板原理图,如下图为按键原理图,可以看见有key1,key2和key3三个按键,可以通过这三个按键来控制LED灯的亮灭。看到原理图的话,按下按钮PC5变为低电平,所以需要给PA5一个高电平,即内部上拉。利用STM32的外部中断输入功能,在外部设备触发中断信号时,中断模块会将中断信号转换为STM32的中断信号,从而触发LED灯亮灭。

2. STM32的中断控制器支持19个外部中断/事件请求

这⼗九个外部中断为:线0~15:对应外部IO口的输⼊中断;线16:连接到PVD输出;线17:连接到RTC时钟事件;线18:连接到USB唤醒事件。

配置使用时,需要先将IO口与相应中断线的映射关系建立,再对其进行使用。

3. 配置描述

(1)使能GPIO时钟,STM在使用任何外设之前,都需要使能其时钟,实验用到PB5 IO口,因此需要使能GPIOB时钟。首先我们要使用IO口作为中断输入,所以我们要使能相应IO口时钟,以及初始化相应IO空口为输入模式,我们使用按键为外部中断,此处应设置按键的IO口;

  用GPIO_InitTypeDef和EXTI_InitTypeDef结构体定义两个用于GPIO和EXTI初始化配置的变量。初始化LED灯,按键的GPIO,作为中断/事件输入时需把GPIO配置为上拉输入模式,按下按钮PC5变为低电平,所以我们需要给PA5一个高电平,即内部上拉。推挽输出,频率为50MHz;

(2)将按键GPIO连接到EXTI源输入。由于GPIO并不是专用的中断引脚,因此在用GPIO来触发外部中断的时候需要设置将GPIO相应的引脚和中断线连接起来;

将函数GPIO端口与中断线映射起来;

(3)配置按键EXTI中断\事件线,配置中断产生的条件,PB5、PD6、PD3这三个口采用的是上拉输入模式,当有按键按下时,该IO口是低电平,所以要配置成下降沿触发,对应的就是GPIO mode;

(4)配置中断分组(NVIC),并使能中断。配置NVIC主要是配置一些中断源,中断的优先级(包括抢占优先级和相应优先级)还有设置使能中断(类似于C51中开启总开关);

  系统运行开始的时候设置中断分组。确定组号,也就是确定抢占优先级和子优先级的分配位数。调用函数为NVIC_PriorityGroupConfig();设置所用到的中断的中断优先级别。对每个中断调用函数为NVIC_Init();

  由于有三个中断,根据前面所说,需要有3个bit来指定抢占优先级,所以选择第二组。又由于EXTI5-9共用一个中断响应函数,所以EXTI5选择的中断通道是EXTI9_5_IRQn。

(5)编写EXTI的中断服务函数。在STM32的固件库中有一个结构体NVIC_InitTypeDef,里面有相应的标志位设置,然后再用NVIC_Init()函数进行初始化。设置中断优先级,可以根据系统需要设置不同优先级,确保系统稳定性。中断服务函数是用来设置产生中断后需要实现的功能。

(6)外部中断的中断标志位在发生中断后会由硬件置1,但是在执行完中断服务函数后硬件不会自动清零,所以需要我们手动在中断服务函数的最后标志位清零。

4. main( )函数

五、实验数据及结果分析

通过以上实验得出以下数据

1. 外部中断处理流程

2. main.c部分

#include "stm32f10x.h" 
#include "key.h"
#include "exti0.h"int main(void)
{LED_inti();   //初始化与LED连接的硬件接口exti0_Inti(); //初始化与按键连接的硬件接口while(1);
}

3. extio.c部分

#include "stm32f10x.h" 
#include "key.h" 
void exti0_Inti(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU; //上拉输入GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStruct);         //模式配置GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5); //把pc5挂到EXTI5总线上EXTI_InitTypeDef EXTI_InitStruct; EXTI_InitStruct.EXTI_Line=EXTI_Line5;   //中断线5EXTI_InitStruct.EXTI_LineCmd=ENABLE;    //使能中断EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;     //EXTI为中断模式EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling; //下降沿中断EXTI_Init(&EXTI_InitStruct);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);    //配置中断优先组NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel=EXTI9_5_IRQn;      //选择EXTI9_5NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;         //使能中断通道NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1; //抢占优先级NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;      //中断优先级NVIC_Init(&NVIC_InitStruct);
}void EXTI9_5_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line5)==SET)  //确保是否产生中断{GPIO_SetBits(GPIOB, GPIO_Pin_5);}EXTI_ClearITPendingBit(EXTI_Line5);   //清除中断标志位
}

4. extio.h部分

#ifndef __EXTI0_H
#define __EXTI0_Hvoid exti0_Inti(void);
void EXTI9_5_IRQHandler(void);#endif

5.key.c部分

#include "stm32f10x.h" void LED_inti(void)       //灯引脚的配置函数,定义PC2
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStruct);
}

6. key.h部分

#ifndef __KEY_H
#define __KEY_H
void LED_inti(void);
#endif

7. 程序运行结果如下:

8. 软件仿真结果如下:

9. 硬件仿真结果如下:按键按下LED灯被点亮

这篇关于嵌入式开发与应用按键外部中断实验二的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134470

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

zoj3820(树的直径的应用)

题意:在一颗树上找两个点,使得所有点到选择与其更近的一个点的距离的最大值最小。 思路:如果是选择一个点的话,那么点就是直径的中点。现在考虑两个点的情况,先求树的直径,再把直径最中间的边去掉,再求剩下的两个子树中直径的中点。 代码如下: #include <stdio.h>#include <string.h>#include <algorithm>#include <map>#