你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32:中断的详细介绍及使用流程

[复制链接]
攻城狮Melo 发布时间:2022-11-9 14:48
一、中断介绍. y7 U) N3 j* j3 \9 H! s
1、中断概念

% E* Q$ }0 v8 I! e, J" c》》CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程称为中断。引发中断的事件称为中断源。比如:看电视时突然门铃响,那么门铃响就相当于中断源,有些中断还能够被其它高优先级的中断所中断,那么这种情况又叫做中断的嵌套。
" E8 R4 {8 P0 M0 i1 K& F) D/ @5 k2 H5 V  l》》 STM32F10x芯片有84个中断通道,包括16个内核中断和68个可屏蔽中断,这些中断通道已按照不同优先级顺序固定分配给相应的外部设备。可以参考《STM32F10x中文参考手册》-9 中断和事件章节。, }4 V7 F6 W* |1 d8 v4 X( F
2、NVIC介绍9 |' H8 ?1 t+ w! @
》》NVIC英文全称是Nested Vectored Interrupt Controller,中文意思就是嵌套向量中断控制器,它属于M3内核的一个外设,控制着芯片的中断相关功能。由于ARM给NVIC预留了非常多的功能,但对于使用M3内核设计芯片的公司可能就不需要这么多功能,于是就需要在NVIC上裁剪。ST公司的STM32F103芯片内部中断数量就是NVIC裁剪后的结果。) J8 t" u8 ]. t% a* q/ _+ i% G3 W
》》中断控制相关寄存器在固件库core_cm3.h文件NVIC结构体内。可打开任意库函数工程即可查看到。6 V0 e) Q: r$ i+ z6 m: y( U
* \. K* S+ f0 S& w
3、中断优先级
% ?+ j. Z0 O; J6 ^》》STM32F103芯片支持60个可屏蔽中断通道,每个中断通道都具备自己的中断优先级控制字节(8位,但是STM32F103中只使用4位,高4位有效),用于表达优先级的高4位又被分为组成抢占式优先级和响应式优先级,通常也把响应优先级称为“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。; O$ F- j, ?+ Z& D! `& g' x' E
》》高抢占式优先级的中断事件会打断当前的主程序或中断程序运行,俗称中断嵌套。在抢占式优先级相同的情况下,高响应优先级的中断优先被响应。
. U) ~. ^% ]& l5 I6 Y》》当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等待前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。3 i! a: h/ e+ _+ P1 R& R( {
》》STM32F103中指定中断优先级的寄存器位有4位,这4位的分组方式如下:(4个优先级描述位可以有5中组合方式)
! [: D- U2 `& y* y# d# u1 _6 C& p
+ u2 C3 M, R* y4 l0 }% s 336a82ed51e1450b9d0d1dcaede03a6a.png ! g, L" ?4 R, F8 t
1 ^* L# x5 n, G# @
设置优先级分组可调用库函数NVIC_PriorityGroupConfig(),在misc.c中可以查看。) \; m5 r# A+ X" y8 @0 F, z: g! Z
2 S5 `3 g0 m3 |4 n! P! Y7 k) _
# R  a& q5 z; I1 C5 X
二、中断配置步骤

6 d! F+ W5 [. r: q3 Y》》要使用中断我们就需要先配置它,通常都需经过这几步:
; ]7 B+ K5 v/ \2 l0 U3 K( u5 @; R1、使能外设某个中断
# z) ~7 ?& X$ O+ _2 P( Q, M" o( k2、使能中断优先级分组(NVIC_PriorityGroupConfig()),然后初始化NVIC_InitTypeDef结构体
% D) k2 p" a/ f) Gtypedef struct
6 r0 k  ~* L( b  c{& P8 j9 \* k4 {9 K5 t% b, x
uint8_t NVIC_IRQChannel;//中断源1 K, }3 T( _8 N3 y) l9 s) q
uint8_t NVIC_IRQChannelPreemptionPriority;//抢占优先级, V2 T& h9 k( o& G- J7 @9 q
uint8_t NVIC_IRQChannelSubPriority;//响应优先级4 y* S' T$ Z  w! I9 w
FunctionalState NVIC_IRQChannelCmd;//中断使能(ENABLE)或失能(DISABLE)
8 }* {8 x1 X7 ^} NVIC_InitTypeDef;
4 O  S* ~9 l2 J+ E: X' D' i3 {( M3、编写中断服务函数
) G0 z/ L  N) @2 Q: r% i2 n; k! H1 \4 A5 C4 g' E
三、外部中断介绍
: g/ v, v2 M  T' s6 t1、EXTI简介
" A$ M% p( ?: p+ x( {0 m
》》STM32F10x外部中断/事件控制器(EXTI)包含多达20个用于产生事件/中断请求的边沿检测器。EXTI的每根输入线都可单独进行配置,以选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或边沿触发),还可独立地被屏蔽。
0 Y/ l5 s; k& @* r+ N外部中断/事件控制器框图如下:& d9 c: U  I. d! A! |% G1 `* ~

- h9 D9 M+ _. h' H3 A& i7 E! V 5fdbc96303fa4819aa0ca5554f061107.png
/ `9 `, b. l& I/ {, E% F' d$ Q+ Z$ H1 y1 }. V/ |1 S, Q" S
它总共有两条路,一条是:1-2-3-4-5,用来产生中断;另一条是:1-2-3-6-7-8,用来产生事件
0 t2 B. B8 u% f* O/ r# m0 Y1 N1 u3 T7 m' a. o2 V$ ^+ [" t5 s+ F9 H
2、外部中断/事件线映射' o* E5 M4 q  m4 y
STM32F10x的EXTI具有20个中断/事件线,如下:4 H7 k% }& y" x
( S: a% I2 w4 M% ]$ k7 t
d4f4ff5ab71244adbe7c19ef0754e00a.png
, x5 j( H" s: b) l- j& Y; P+ e9 _2 Q7 a6 Q/ ?# k/ V
3、外部中断配置步骤$ j7 M/ [- b8 B! M4 j* t
》》要使用外部中断我们就需要先配置它,通常都需经过这几步:(EXTI相关库函数在stm32f10x_exti.c和stm32f10x_exti.h文件中)
8 N& ]  J6 m, U. {2 i7 T7 a% k8 J(1)使能IO口时钟,配置IO口模式为输入. I- L( P3 I9 a3 n( P5 C$ x8 f7 H
(2)开启AFIO时钟,设置IO口与中断线的映射关系(将GPIO端口映射到EXTI中断线上)
/ l5 H9 ?# P8 f6 c" ]5 c; N/ |+ X9 ORCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
% \% T' r+ I6 U" S8 q3 Z( Fvoid GPIO_EXTILineConfig(uint8_t GPIO_PortSource,uint8_t GPIO_PinSource);
& A6 N: w9 ?& |9 Q9 D! hGPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource);$ K1 L+ Q. {  B0 O. N
(3)配置中断分组(NVIC),使能中断
6 ~. J) H) d" s% c5 Q) _(4)初始化EXTI,选择出发方式7 a" b* n( O! W& `/ y
void EXTI_Init(EXTI_InitTypeDef * EXTI_InitStruct);
: S2 F0 w: E( k6 r5 P/ |typedef struct$ ~) ~6 T  H0 n& b" G
{
/ ]4 }$ A# }7 [uint32_t EXTI_Line; //中断/事件线6 w& |& s$ k9 n0 k1 N
EXTIMode_TypeDef EXTI_Mode;//EXTI模式
! h7 z7 Z5 Y) ~& P1 I9 Y% d  sEXTITrigger_TypeDef EXTI_Trigger;//EXTI出发方式
: y+ `" M: w4 d  t2 o1 DFunctionalState EXTI_LineCmd;//中断线使能或失能: k  i, z9 M( }
}
2 R7 U' Y: T; ^* w6 E; r(5)编写EXTI中断服务函数$ F1 k, |. q2 P$ B" m
EXTI0_IRQHandler
; \, l0 p6 L* d2 d. i; IEXTI1_IRQHandler
* J% V7 J/ J6 K$ fEXTI2_IRQHandler! A8 D- F! [, E3 C! u) B5 ~3 p
EXTI3_IRQHandler
4 |5 z: L9 Z* c$ Q3 Q& sEXTI4_IRQHandler
9 b3 h. j- \0 `3 Z% REXTI9_5_IRQHandler(中断线5-9的写法)
4 M2 c$ L2 Z; J1 SEXTI15_10_IRQHandler(中断线10-15的写法)4 }4 Z$ R/ H0 J6 [/ s( |3 P

+ w; ~* p$ l' F* T4、编写外部中断控制程序
7 T' x- d+ |+ z  x/ D1 v+ \要实现外部中断方式控制LED,程序框架如下:9 L# Y* T. r8 I, i9 r( W0 X9 b
(1)初始化对应端口的EXTI
( W, k% w* |" O* a, l- }  L7 W(2)编写EXTI中断函数
, E0 g- i3 Q- q+ Q+ r& u! p0 ^(3)编写主函数2 o% A( B2 k2 ~7 X1 w6 Y% M2 R1 m- E- g5 D
————————————————
2 b& w# \2 W7 X9 U. Q" n版权声明:Cheems_Pak Choi+ N( ~3 f, T* d3 q# o! n: a

- o+ u+ ~7 E; m8 R, L5 G! }- A) d9 S7 V: g7 X8 _: ~8 y
赞 收藏 评论0 发布时间:2022-11-9 14:48

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版