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

news2024/9/19 12:26:52

一、实验目的

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;   //中断线5
	EXTI_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_5
	NVIC_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_H

void 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.coloradmin.cn/o/2102401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Prometheus_0基础_学习笔记

一、基本概念 Prometheus是由golang语言开发的一套开源的监控、报警、时间序列数据库的组合,是一款基于时序数据库的开源监控告警系统。 时间序列数据库:时间序列数据库(Time Serires Database , TSDB)不同于传统的关系型数据库。…

是缔造AI程序员,还是AI缔造程序员?

随着AIGC(如ChatGPT、MidJourney、Claude等)大语言模型的涌现,AI辅助编程工具的普及使得程序员的工作方式正在发生深刻变革。AI的迅猛发展,不仅提升了编程效率,也引发了对程序员未来职业前景的深思。我们应当如何在这一…

【归并分而治之】逆序对的应对之策

目录 1.前言2.题目简介3.求解思路为什么要这样做?快在哪?为什么这种方法会想到结合归并排序?如何在一左一右中统计剩下的逆序对个数?固定右边的数,用降序会怎么样???思路的本质是巧妙…

【MySQL07】【锁】

文章目录 一、前言二、事务的读写情况1. 写-写情况2. 读-写情况3. 一致性读4. 锁定读2.1 共享锁和独占锁2.2 锁定读的语句 5. 写操作 三、多粒度锁四、表锁和行锁1. 表级锁1.1 表级别的 S锁 和 X锁1.2 表级别的 IS 锁和 IX锁1.3 表级别的 AUTO-INC 锁 2. 行级锁2.1 行级锁的分类…

Qt6+VTK9环境配置

Qt6VTK9环境配置 说明1 Qt6安装2 VTK源码编译2.1 源码下载2.2 工程编译2.3 设置环境变量 3 QtVTK项目构建3.1 使用qmake管理项目3.2 使用cmake管理项目 参考资料 说明 由于想做一点新的东西,需要去探索一些工具,对于VTK之前没有了解过,在进行…

redis缓存和数据库通过延迟双删除实现数据一致性

为了提高查询的效率,我们经常会用到redis缓存,但是使用redis缓存就不可避免缓存一致性的问题。 先删缓存,再更新数据 如果并发查询可能会再删除缓存后,还没有更新数据库的时候,第二个线程读取到旧数据,并…

尚品汇-商品上下架完善(更新ES)、延迟消息(四十四)

目录: (1)改造商品搜索上下架 (2)延迟消息 (1)改造商品搜索上下架 定义商品上下架常量 在rabbit-util模块中导入常量类MqConst。 /*** 商品上下架.*/ public static final String EXCHANGE…

游戏翻译中西班牙语的特点

由于西班牙语丰富的文化多样性和广泛的使用,将游戏翻译成西班牙语带来了独特的机遇和挑战。西班牙语是全球第二大使用语言,包括西班牙、拉丁美洲和美国部分地区在内的各个地区有超过4.6亿母语人士。然而,这些地区的语言和文化差异需要量身定制…

Datawhale X 李宏毅苹果书 AI夏令营-深度学习进阶task1:局部极小值与鞍点,批量和动量

一、临界点和鞍点 在做优化的时候经常会发现,随着参数不断更新,训练的损失不会再下降, 但是我们对这个损失仍然不满意或者有时模型一开始就训练不起来,不管我们怎么更新参数,损失都降不下去。 过去常见的一个猜想是我们优化到某…

GPU环境配置:1.CUDA、Anaconda、Pytorch

一、查看显卡适配CUDA型号 查看自己电脑的显卡版本: 在 Windows 设置中查看显卡型号:使用 Windows I 快捷键打开「设置」,依次点击「系统」-「屏幕」和「高级显示器设置」,在「显示器 1」旁边就可以看到显卡名称。 右键点菜单图标…

自动生成对话视频!如何使用Captions的AI视频生成与编辑API工具?

Captions公司最近发布了一套AI驱动的视频生成和编辑API工具,为创作者和开发者提供了一个强大的视频创作生态系统。这个系统包含AI Creator、AI Twin、AI Edit、和AI Translate四大核心功能,每个工具都针对不同的创作需求进行优化。下面我们就一起来详细测…

宏定义## 的使用

宏定义## 的使用 C语言中宏定义## 的使用 宏定义## 的使用 #define LV_color(x,y,z) x##y##z 文章目录 宏定义## 的使用宏定义## 的使用 宏定义## 的使用 #include<stdio.h> #include<stdlib.h>#define LV_color(x,y,z) x##y##z int main() {printf("LV_col…

SaaS行业|深入探讨五个联盟营销平台

随着数字时代的飞速发展&#xff0c;SaaS&#xff08;Software as a Service&#xff0c;软件即服务&#xff09;行业正以前所未有的速度崛起&#xff0c;成为推动全球商业变革的重要力量。本文将深入探索分析SaaS行业的五个营销联盟营销平台。 1. PartnerShare&#xff1a;Saa…

保姆级Vue项目安装配置步骤(包含vue-cli脚手架环境配置、Vue项目创建、运行)

文章目录 1. Vue-cli脚手架安装2. Vue项目创建(使用图形化界面创建步骤&#xff09;3. Vue项目-运行4. Vue项目-配置端口 此教程摘选自我的笔记&#xff1a;黑马JavaWeb开发笔记08——(保姆级Vue项目全部安装配置步骤)Vue-cli脚手架安装、NodeJS环境搭建、Vue项目的创建、运行、…

zdppy+vue3+onlyoffice文档管理系统实战 20240903 上课笔记 登录功能完成

接下来 1、注销功能&#xff1a;点击注销按钮&#xff0c;清除登录信息跳转到登录页面2、token过期 注销功能 useUser.js import storage from "../../g/storage.js"; import {useRouter} from "vue-router"; import {message} from "ant-design-…

【vue Lottie】lottie在vue项目中的使用心得

✨减少依赖体积 ●能用原生实现的动效&#xff0c;就不要切Lottie&#xff0c;提前做好切分 ●使用的时候&#xff0c;不要一股脑的复制粘贴过来&#xff0c;而是应该进行如下步骤的清洗 ○合并同样的图片依赖素材&#xff0c;减小依赖图片的大小 ○一些很大的背景图片&…

比亚迪夏亮相,枪口究竟对准了谁?

文/王俣祺 导语&#xff1a;比亚迪的MPV终于要来了&#xff0c;比亚迪夏在成都车展上正式亮相&#xff0c;据说售价会在30万级别&#xff0c;如果是这一几个区间&#xff0c;可以说是把矛头直接指向了腾势D9。作为比亚迪“宗亲”的腾势D9匆忙表示“大哥别开枪&#xff0c;自己人…

多晶透明陶瓷市场发展现状和前景:未来几年年复合增长率CAGR为15.5%

多晶透明陶瓷是一种新型先进功能材料&#xff0c;它具有独特的机械性能和透射性能&#xff0c;在战略和民用领域有着广泛的应用。陶瓷粉末合成、成型和烧结技术的进步使得先进透明陶瓷材料的微观结构、机械性能和光学性能关系的定制成为可能。透明陶瓷材料大致分为可见光、中波…

【qt】多线程实现倒计时

1.界面设计 设置右边的intvalue从10开始倒计时 2.新建Thread类 新建Thread类&#xff0c;使其继承QThread类&#xff0c;多态重写run函数&#xff0c;相当于线程执行函数 3.重写run函数 重写run函数&#xff0c;让另一个进程每隔1s发出一个信号&#xff0c;主线程使用conne…

wireshark使用攻略

简介 wireshark 是网络封包分析工具&#xff0c;可与截取各种网络数据包并且显示数据包的详细信息。 使用 打开wireshark &#xff1a; 在Linux中使用sudo wireshark 打开 打开之后选择对应的网卡&#xff0c;就可以进行网络信息的捕获&#xff0c;开始抓取网络包。 可以…