当前位置:网站首页>通过对射式红外传感器计次实验讲解EXTI中断
通过对射式红外传感器计次实验讲解EXTI中断
2022-07-26 22:48:00 【若木·】
目录
前言
这一篇是通过对射式红外传感器计次实验来详细讲解EXTI中断以及使用方法
一、接线图

二、EXTI中断
1.什么是中断
中断系统:在主程序运行过程中,出现了特定的中断触发条件(中断源),使CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。
中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。
中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后一次进行返回。
2.什么是EXTI
EXTI(Extern Interrupt)是外部中断的意思;EXTI可以监测指定的GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立刻向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序。
触发方式:上升沿/下降沿/双边沿/软件触发
支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断
通道数:16个GPIO_Pin,外加PVD输出,RTC闹钟,USB唤醒,以太网唤醒。
触发响应方式:中断响应/事件响应
3.什么是NVIC
NVIC是STM32用来管理中断,分配中断优先级的部分;
使用NVIC同意管理中断,NVIC的中断优先级总共有16个等级(每个中断通道都有),可对优先级进行分组,进一步设置抢占优先级和响应优先级。
4.NVIC基本结构:

三,配置中断
1.配置中断的流程
第一步,设置RCC,把涉及的时钟都打开
第二步,配置GPIO选择端口为输入模式
第三步,配置AFIO,选择我们用的这一路GPIO,然后连接后面的EXTI
第四步,配置EXTI,选择边沿触发方式,比如上升沿,下降沿或双边沿
第五步,配置NVIC,给我们的中断选择一个合适的优先级
最后通过NVIC,外设中断信号就能进入CPU了
2.根据例程详细介绍
1.CountSensor.c
#include "stm32f10x.h" // Device header
uint16_t CountSensor_Count;
void CountSensor_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启RCC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//选择我们想要的中断引脚,(选择某个GPIO外设作为外部中断源,指定要配置的外设中断线)
//到这里,AFIO外部中断引脚选择配置就完成了
//进入第四步,配置EXTI
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line14;
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //开启中断
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//指定触发信号的有效边沿(下降沿触发)
EXTI_Init(&EXTI_InitStructure);
//这样PB14的信号就能够通过EXTI通向下一级NVIC了
//最后,执行第五步:配置NVIC,因为NVIC是内核外设,所以它的库函数是被ST放在了misc里
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//先占优先级就是抢占优先级,从占优先级就是响应优先级
//分组整个工程只需要执行一次,推荐放在main的最开始,如果放在模块里,要确保每个模块分组选的是同一个
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn ;//指定中断通道来开启或关闭
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//1.
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1 ;//2. 1和2都是设置中断优先级的,因为该工程只有一个中断,所以随意选择
NVIC_Init(&NVIC_InitStructure);
//至此,整个外部中断的配置结束
//外部中断的信号从GPIO到AFIO再到EXTI,再到NVIC,最终通向CPU,这样才能让CPU由主程序跳转到中断程序执行
}
uint16_t CountSensor_Get(void)
{
return CountSensor_Count;
}
//在stm32里,中断函数的名字都是固定的,每个中断通道对应一个中断函数名字,可以到启动文件里查看
void EXTI15_10_IRQHandler(void) //中断函数均无参数无返回值
{
if(EXTI_GetITStatus(EXTI_Line14)==SET)//看一下14的中断标志位是不是为1,此刻判断一下返回值是不是SET,如果是的话,就可以执行中断程序了
{
CountSensor_Count++;
EXTI_ClearITPendingBit(EXTI_Line14);//将中断标志位清除
}
//中断程序结束后,一定要再调用一下清楚中断标志位的函数
//如果不清除中断标志位,会一直申请中断,程序不断响应中断,执行中断函数,最终程序会卡死在中断函数里
}
CountSensor.h
#ifndef __COUNTSENSOR_H__
#define __COUNTSENSOR_H__
void CountSensor_Init(void);
#endif
在这里要注意的是,中断函数不需要声明,因为中断函数不需要调用,他是自动执行的
main.c
最后在main里调用
#include "stm32f10x.h" // Device header
#include "CountSensor.h"
#include "OLED.h"
int main(void)
{
CountSensor_Init();
OLED_ShowString(1, 1,"Count:");
while(1)
{
OLED_ShowNum(1, 2, CountSensor_Get(), 5);
}
}
边栏推荐
- Vitgan: training Gans with vision transformers
- JS逻辑运算符
- [FPGA tutorial case 30] DDS direct digital frequency synthesizer based on FPGA -- frequency accuracy analysis with MATLAB
- 平面转换(位移、旋转、缩放)
- PHP processing tree and infinite processing
- 高度塌陷解决方法
- Harmonyos image processing application development live broadcast notes
- [详解C语言]一文带你玩转函数
- 2022年最新文本生成图像研究 开源工作速览(Papers with code)
- Introduction to network - Introduction to home networking & basic network knowledge
猜你喜欢

Virtualization technology KVM

Shell course summary

索引失效原理讲解及其常见情况

mysql存储引擎及其区别

(hdu1588) Gauss Fibonacci (sum of matrix fast power + bisection matrix proportional sequence)

Docker高级篇之Mysql主从复制、Redis集群扩容缩容配置案例详解

23nfs shared storage service

Vitgan: training Gans with vision transformers

The gradient descent method and Newton method are used to calculate the open radical

7.7 SHEIN希音笔试
随机推荐
dlib安装失败解决办法
Redis uses queues for consumption
Three methods that can effectively fuse text and image information -- feature stitching, cross modal attention, conditional batch normalization
uuid和索引建立规则
Virtualization technology KVM
In regular expressions (?: pattern), (?! pattern), (? < =pattern) and (?
2022年T2I文本生成图像 中文期刊论文速览-1(ECAGAN:基于通道注意力机制的文本生成图像方法+CAE-GAN:基于Transformer交叉注意力的文本生成图像技术)
Talking about server virtualization & hyper convergence & Storage
mysql存储引擎及其区别
FID指标复现踩坑避坑 文本生成图像FID定量实验全流程复现(Fréchet Inception Distance )定量评价实验踩坑避坑流程
Beyond hidden display ellipsis
[详解C语言]一文带你玩转函数
Removal and addition of reference types in template and generic programming
6.30联发科笔试
【volatile原理】volatile原理
科学计算库 —— Numpy
Homework 1-4 learning notes
23nfs shared storage service
Unity Huatuo hot update environment installation and sample project
CEPH (distributed storage)