中断(NVIC)的使用--EXTI--TIM

目录

中断是什么

轮询

中断

中断调用情况

中断的分类

内部中断(TIM、UART等)

tim.c

tim.h

外部中断EXTI

exti.c

exti.h


中断是什么

在处理事件的时候有两种方式:轮询和中断。

轮询

顾名思义,就是每轮都询问一次。比如while循环的每一次,就会执行检查,1.此处串口是否有数据到来。2.每次都检测一下引脚状态,是否为低电平。在有大量事件发生时,cpu按照事件到来的先后顺序依次执行,不考虑时间的紧急性和事件大小,也就是不考虑时间的优先级。

中断

中断也是一种对于数据获取的调度方式。通过中断源来提醒CPU,数据已经更新,可以读取新数据。给每个事件设置优先级,在有大量事件发生时,cpu按照事件的优先级率先完成紧急性事件和处理时间短的事件

中断调用情况

CPU对于调度频次不高的任务(函数),或者特别紧急的任务(刹车制动这种) 给出的一种任务执行关系,这种关系的本质就是函数功能一旦出现,就要立即实施。这两种形式的任务一般都以中断形式调度,对于上一种任 务,优势在于提升系统运行速率,后一种提升了系统的实时性。 中断是一种芯片的内部的宝贵资源,数量是十分有限的。

中断的分类

内部资源根据硬件细节不同分出内部中断,和外部中断两种。

内部中断(TIM、UART等)

CPU内部有一个硬件结构叫做NVIC,也叫做中断管理控制器, NVIC管理着很多引脚,当特定事件发生时,会给NVIC发送一个信号,NVIC调用相应的中断函数传给CPU让其执行。

tim.c

#include "stm32f4xx.h"                  // Device header
#include "stdio.h"//定时器的初始化
void Time_Init()
{//时钟使能RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//1//参数配置,84M 84 000 000TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//3TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//4TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period=(5000-1);//工作量(路程),每一趟执行一次中断TIM_TimeBaseInitStruct.TIM_Prescaler=(8400-1);//84M除以8400=10 000,工作速度(10 000/s)TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);//2//让定时器开始工作TIM_Cmd(TIM2,ENABLE);//定时器开启中断,看到TIM_Period,数到头,给NVIC说一声TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//中断分组//分组方式,2位给抢占优先级,2位给响应优先级NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//从此处判断核心需求数量(2)//NVIC参数配置NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;NVIC_Init(&NVIC_InitStruct);}
void TIM2_IRQHandler()
{//信号判断,中断进一步确认if(TIM_GetITStatus(TIM2,TIM_IT_Update)){printf("not apple tree!\n");}//中断信号清除TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}

tim.h

#include "stm32f4xx.h"                  // Device header
void Time_Init();

外部中断EXTI

上图紫色线路为轮询机制。黑色线路部分为内部中断。红色线路部分为外部中断NVIC处理的是中断信号,不是电平信号。

为什么GPIO需要接入EXTI产生中断信号,而不直接连到NVIC上?

usart,TIM,IIC这些芯片 内部器件本身就可以产生中断信号,因此就可以直接与NVIC连接。但是,光突突的GPIO本身就是一根电线,肯定不具备产生中断信号的功能。因此连接 EXTI,依靠EXTI产生中断信号。 原因2:中断通达数量比较少,EXTI的多路复选的功能扩充了接口。一个EXTI可 以接16个GPIO引脚呢。

exti.c

#include "stm32f4xx.h"                  // Device header
#include "BitBand.h"
#include "stdio.h"
#include "delay.h"void exti_key_init()
{//时钟配置RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);//给GPIO参数配置GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN;GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_2;GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;GPIO_InitStruct.GPIO_Speed=GPIO_High_Speed;GPIO_Init(GPIOE,&GPIO_InitStruct);//把GPIOE组的第2个引脚连接到EXTI2SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource2);//把GPIOE组的第3个引脚连接到EXTI3SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource3);//EXTI参数配置//告诉EXTI2、3,看见上升沿,就给NVIC发送中断信号EXTI_InitTypeDef EXTI_InitStruct;EXTI_InitStruct.EXTI_Line=EXTI_Line2|EXTI_Line3;EXTI_InitStruct.EXTI_LineCmd=ENABLE;EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;EXTI_Init(&EXTI_InitStruct);//分组方式,2位给抢占优先级,2位给响应优先级NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//从此处判断核心需求数量(2)NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel=EXTI2_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;NVIC_Init(&NVIC_InitStruct);//分组方式,2位给抢占优先级,2位给响应优先级NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);//从此处判断核心需求数量(2)NVIC_InitStruct.NVIC_IRQChannel=EXTI3_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;NVIC_Init(&NVIC_InitStruct);
}//中断服务子函数,给EXTI2服务
void EXTI2_IRQHandler()
{if(EXTI_GetITStatus(EXTI_Line2)){printf("key2 apple tree\n");}EXTI_ClearITPendingBit(EXTI_Line2);
}//中断服务子函数,给EXTI3服务
void EXTI3_IRQHandler()
{if(EXTI_GetITStatus(EXTI_Line3)){printf("key3 apple tree\n");}EXTI_ClearITPendingBit(EXTI_Line3);
}

exti.h

#include "stm32f4xx.h"                  // Device headervoid exti_key_init();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/564740.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python—接口编写部分

最近准备整理一下之前学过的前端小程序知识笔记,形成合集。顺便准备学一学接口部分,希望自己能成为一个全栈嘿嘿。建议关注收藏,持续更新技术文档。 目录 前端知识技能树http请求浏览器缓存 后端知识技能树python_api:flaskflask…

Qt——2D画图

基础画图函数 矩形 painter.drawRect(50,50,200,100); 圆角矩形 painter.drawRoundRect(50,50,200,200,50,50); xRadius和yRadius分别以矩形宽度和高度的一半的百分比指定,并且应该在0.0到100.0的范围内 弧线 painter.drawArc(50,50,200,200, -90*16, 90*16);…

【Linux】对进程地址空间的理解

一、关于进程地址空间的简单理解 进程地址空间其实是分了很多个区域的,区域划分的本质就是区域内的各个地址都是可以使用的。如同下面这个图所示: 无论是环境变量的地址还是环境变量表的地址,所存放的地址都在栈的上部。这里的已初始化数据和…

【JavaEE -- 网络初识】

网络初识 1. 局域网和广域网1.1 局域网(LAN)1.2 广域网WAN 2. 网络通信基础2.1 IP地址2.2 端口号 3. 协议 -- 重点3.1 网络通信协议拆分成多层3.2 TCP/IP 五层网络协议 4. 封装和分用4.1 封装过程4.2 分用过程4.3 网络传输的数据单位 5. 网络编程中的客户…

34.网络游戏逆向分析与漏洞攻防-游戏网络通信数据解析-登录数据包的监视与模拟

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果 内容参考于:易道云信息技术研究院VIP课 上一个内容:33.游戏登录数据…

阿里云-零基础入门NLP【基于深度学习的文本分类3-BERT】

文章目录 学习过程赛题理解学习目标赛题数据数据标签评测指标解题思路BERT代码 学习过程 20年当时自身功底是比较零基础(会写些基础的Python[三个科学计算包]数据分析),一开始看这块其实挺懵的,不会就去问百度或其他人,当时遇见困难挺害怕的…

pytorch如何向tensor结尾添加元素或维度--torch.cat()、torch.unsqueeze()的用法

目录 示例1 矢量后增加元素 示例2 tensor维度增加1 示例3 另一种替代unsqueeze的方法 示例1 矢量后增加元素 使用torch.cat()函数 ptorch.Tensor([1,5,0]) ptorch.cat((p, torch.Tensor([4])), 0) 结果: 这里,cat的第一个输入变量用()包绕&#xf…

mysql 存储引擎 基本介绍

目录 一 存储引擎概念介绍 (一)存储引擎概念 (二)MySQL常用的存储引擎 (三)存储引擎运作方式 二 MyISAM 存储引擎介绍 (一) MyISAM 存储引擎特点 1,不支持…

道路与航线

一道类似缩点的好题&#xff0c;先按道路缩点 然后将缩点以后的图按照航线做DAG 在DAG上先跑topsort 在每一个团内部跑dijkstra&#xff0c;同时更新top点 很有意思的一道题目 #include<bits/stdc.h> using namespace std; using ll long long; const int N 3e510; co…

chatgpt和 github copilot chat哪个更强

chatgpt大家应该都不陌生 ChatGPT 是由 OpenAI 开发的一种基于 GPT&#xff08;生成式预训练模型&#xff09;的聊天机器人。它可以生成语言上下文相关的响应&#xff0c;从而进行自然语言对话。ChatGPT 利用大规模的语言数据进行预训练&#xff0c;并通过微调或在线学习来适应…

centos7 linux下yum安装redis

安装redis 1.检查是否有redis yum 源 yum install redis2.下载fedora的epel仓库 yum install epel-release3.安装redis数据库 yum install redis4.安装完毕后&#xff0c;使用下面的命令启动redis服务 # 启动redis service redis start# 停止redis service redis stop# 查…

深入理解栈和队列(二):队列

个人主页&#xff1a;17_Kevin-CSDN博客 专栏&#xff1a;《数据结构》 一、队列的概念和结构 队列是只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的…