接着下面将进行外部和中断的讲解,讲之前先对中断先做一定了解。/ d3 d4 k1 u9 ^2 ]; D0 `" Q
//============================百度搜索==========================//
简介:
中断是处理器处理外部突发事件的一个重要技术。它能使处理器在运行过程中对外部事件发出的中断请求及时地进行处理,处理完成后又立即返回断点,继续进行处理器原来的工作。引起中断的原因或者说发出中断请求的来源叫做中断源。根据中断源的不同,可以把中断分为硬件中断和软件中断两大类,而硬件中断又可以分为外部中断和内部中断 两类。, }- U: t8 h* y- u- B! a
8 c+ l" [( T% m- w' g
外部中断一般是由计算机外设发出的中断请指求,如:键盘中断、打印机中断、定时器中断等。外部中断是可以屏蔽的中断,也就是说,利用中断控制器可以屏蔽这些外部设备 的中断请求。
" N' [; q& T+ `+ u" `/ v7 e
内部中断是指因硬件出错(如突然掉电、奇偶校验错等)或运算出错(除数为零、运算溢出、单步中断等)所引起的中断。内部中断是不可屏蔽的中断。
软件中断其实并不是真正的中断,它们只是可被调用执行的一般程序。% `( x# n7 W+ i2 h+ n
优先级:
CPU为了处理并发的中断请求,规定了中断的优先权,中断优先权由高到低的顺序是: (1)除法错、溢出中断、软件中断 (2)不可屏蔽中断 (3)可屏蔽中断 (4)单步中断。
//======================================================//4 W* P; X$ F z5 l# l# B9 C
我们要明确一点,就是所有的端口都有外部中断的能力,但是为了使用外部中断线,端口必须配置为输入模式。
外部中断的配置过程步骤如下:5 \& x# h& w2 ` w4 f
2 }! T4 l# }& X3 B
1)、设置GPIO口为输入
2)、开启GPIO口复用时钟,设置GPIO口与中断线的映射关系。( J0 h4 M6 d& Y4 Y0 R
3)、开启与该GPIO口相对的线上中断/事件,设置触发条件。% D0 E; L; Y$ y& Q1 S5 ]
4)、配置中断分组(NVIC),并使能中断。
5)、编写中断服务函数。
其中我们的外部中断初始化函数就是需要做前面的4步,然后再编写中断服务函数。
说到底其实一个中断要做的事有:使能中断、中断分组、屏蔽、IO口映射。完成以上工作就是一个完整的中断设置。5 {0 Q" Z& d( b/ t& W
具体外部中断的配置如下:
==================================华丽的分界线=================================
//下面的设置是以人体红外热释电模块为例的一个外部中断,当然也可以选用按键的电平的边沿触发的来写一个外部中断。只要会用外部中断的初始化设置 ,那么用其他的模块来设置外部中断都是没问题的。9 @! A9 N/ R" {/ A
//==========================exti.c============================//
#include "EXTI.h"1 V+ T# v4 E: ?, F( L
#include "delay.h"; U+ E- F* Z" y% f2 n1 k. f
#include "led.h"
#include "key.h"% [, ?+ g2 U8 E7 Z8 D# H
#include "beep.h": A2 B$ I, \% B' j
. s9 Z4 O* S- x3 j: g( S F; F: e
#define RENTIPAin(5)//PA5 . k; T1 A* E- i' {' d, Y8 U7 Y
u8 flag=0;
//PA5红外人体感应的引脚1 X# d, B1 R5 b! ~2 a) {5 v% i
void EXTIX_Init(void)3 t4 w! W9 T4 E8 c
{
//1)先设置IO为输入模式
RCC ->APB2ENR |= 1 << 2;//使能 PORTA 时钟% z8 ]- A8 r7 a: Y0 A8 S
GPIOA->CRL&=0XFF0FFFFF; //PA5设置成输入 + B! i% V& L) b; j3 n) i
GPIOA->ODR &=~(1<<5);//设置PA5下拉: ~: _$ ]3 g& k1 M! m
! Z% j2 i* o2 u2 H, P. W( r
//2)开启IO口复用时钟,设置IO口与中断线的映射关系
RCC->APB2ENR|=0x01;//使能io复用时钟
AFIO->EXTICR[1] &=0xff0f; //EXTI5映射到PA5
5 k+ d6 v1 @2 x4 v. _/ N7 X
//3)开启与该IO口相对的线上中断/事件,设置触发条件
EXTI->IMR|=1<<5;//开启line BITx上的中断(EXTI->IMR是中断屏蔽寄存器)
// EXTI->IMR&=~(1<<5); //屏蔽exti5线上的中断
: y: z8 m+ j" |: ]- h
//EXTI->EMR是事件屏蔽寄存器& F2 R; ?; v; k) { R: W# h4 v# s8 I
//EXTI->EMR|=1<<BITx;//不屏蔽line BITx上的事件 (如果不屏蔽这句,在硬件上是可以的,但是在软件仿真的时候无法进入中断!)
EXTI->RTSR|=1<<5;//Exti5上事件上降沿触发3 W. I+ T/ ~" t7 Q- e' s
//EXTI->FTSR|=1<<5;//Exti5上事件下降沿触发
8 q# v9 r5 V0 L
//4)配置中断分组(NVIC),并使能中断: E: D6 f) _$ P u! H% `
MY_NVIC_Init(2,3,EXTI9_5_IRQn,2);//抢占2,子优先级3,组2
//5)编写中断服务函数- `0 y( T, d% t
}$ I: B# B% I. e. Y1 V l4 d8 ^1 @1 p
5 {0 l3 g9 x, a3 \# X7 o
//中断服务函数; r4 i# } s4 } Q' V' S' M& T
void EXTI9_5_IRQHandler(void)( j! U: D' t9 L3 r# {
{% t9 Y7 s ]; D8 c( x
if(RENTI==1) //有人
{* P: H3 m% f- L c
flag=1;//设置标志位为1,在main函数里标志位被清零7 ~8 a& c5 N3 h" t2 F# O9 U
}" z4 t$ Z" G' `2 y
EXTI->PR=1<<5; //清除 LINE4 上的中断标志位
}
===================================================================
|